Welcome, Guest
Username: Password: Remember me
  • Page:
  • 1

TOPIC:

SQL error when making a sort 03 Jan 2017 13:28 #14896

Hello I have 2 errors on a collection (list) display :

First error : wrong field in ORDER
Unknown column '__itm_device_types_id__.name' in 'order clause' SQL=SELECT a.id,a.alias,a.description_tt_fr,a.description_tt_nl,a.itm_bill_id,_itm_bill_id_.bill_reference AS `_itm_bill_id_bill_reference`,a.itm_device_types_id,_itm_device_types_id_.name AS `_itm_device_types_id_name`,a.itm_manufacturers_id,_itm_manufacturers_id_.name AS `_itm_manufacturers_id_name`,a.name FROM #__jslsitmanager_devices AS a LEFT JOIN `vs4go_jslsitmanager_bills` AS _itm_bill_id_ ON _itm_bill_id_.id = a.itm_bill_id LEFT JOIN `vs4go_jslsitmanager_devicetypes` AS _itm_device_types_id_ ON _itm_device_types_id_.id = a.itm_device_types_id LEFT JOIN `vs4go_jslsitmanager_manufacturers` AS _itm_manufacturers_id_ ON _itm_manufacturers_id_.id = a.itm_manufacturers_id ORDER BY __itm_device_types_id__.name ASC LIMIT 20

the error is on the order clause : __itm_device_types_id__.name
Testing the SQL request changing "__itm_device_types_id__.name" with "_itm_device_types_id_.name" (without double "_"), works

Second error : the "ordering direction" is always setted to "ASC"



I don't know if this is a correct solution (will this code breaks jcook logic ?) but I made a "partial" solution to both problems ?

I have installed the component on a local joomla for debugging.
I have forked 2 files :
++++++++++++++++++++++++++++++++
first file : list.php
++++++++++++++++++++++++++++++++
The problem : 2 underscore into orderby
original : ~/administrator/components/com_jslsitmanager/classes/model/list.php
forked : ~/administrator/components/com_jslsitmanager/fork/classes/model/list.php
<?php
// no direct access
defined('_JEXEC') or die('Restricted access');

class JslsitmanagerClassModelList extends JslsitmanagerCkClassModelList{
    
    protected function applySqlStates($query)
    {
        //Populate only uniques strings to the query

        // SELECT
        foreach($this->getState('query.select', array()) as $select)
            $query->select($select);

        // JOIN LEFT
        foreach($this->getState('query.join.left', array()) as $join)
            $query->join('LEFT', $join);

        // JOIN INNER
        foreach($this->getState('query.join.inner', array()) as $join)
            $query->join('INNER', $join);

        // JOIN OUTER
        foreach($this->getState('query.join.outer', array()) as $join)
            $query->join('OUTER', $join);

        // WHERE
        foreach($this->getState('query.where', array()) as $where)
            $query->where($where);

        // RESTRICT
        if (is_array($this->getState('query.restrict')))
        {
            $restrict = $this->getState('query.restrict');
            if (count($restrict))
                $query->where("a.id IN (" . implode(',', $restrict). ")");
            else
                $query->where("a.id = -1");  // Return nothing (restricted all)
        }

        // EXCLUDE
        if (is_array($this->getState('query.exclude')))
        {
            $exclude = $this->getState('query.exclude');
            if (count($exclude))
                $query->where("a.id NOT IN (" . implode(',', $exclude). ")");
        }

        // GROUP BY : Native SQL Group By
        foreach($this->getState('query.groupBy', array()) as $groupBy)
            $query->group($groupBy);
        
        // GROUP ORDER : Prioritary order for groups in lists
        foreach($this->getState('query.groupOrder', array()) as $groupOrder){
            //echo 'groupOrder : ' . $groupOrder.'<br>';
            $query->order($groupOrder);
        }
        
        // ORDER
        foreach($this->getState('query.order', array()) as $order){
            /* HERE IS THE PROBLEM : 2 underscores(_) instead of 1
             rapid and ugly solution : remove them hardly
            */
            $order = join('_', explode('__',$order));
            //echo 'order : ' . $order.'<br>';
            $query->order($order);
        }
        //echo $query->dump();
    }
}
+
+
++++++++++++++++++++++++++++++++
second file : orm.php
++++++++++++++++++++++++++++++++
The problem : the direction always setted to ASC
original : ~/administrator/components/com_jslsitmanager/classes/model/orm.php
forked : ~/administrator/components/com_jslsitmanager/fork/classes/model/orm.php
<?php
// no direct access
defined('_JEXEC') or die('Restricted access');

class JslsitmanagerClassModelOrm extends JslsitmanagerCkClassModelOrm
{
    /**
    * Ordering directive.
    *
    * @access    public
    * @param    array    $config    Ordering configuration.
    *
    *
    * @since    Cook 3.1
    *
    * @return    void
    */
    public function order($config)
    {
        foreach($config as $namespace => $dir)
        {
            /* HERE IS THE PROBLEM : $dir is lower cased ('asc', 'desc'), so $dir will be always converted into "ASC"
            Rapid and ugly solution : uppercase the passed "$dir" parameter
            */
            $dir = strtoupper($dir);
            if (!in_array($dir, array('ASC', 'DESC'), true))
                $dir = 'ASC';

            $fieldAlias = $this->tableFieldAlias($namespace);

            // Requirements
            $this->join($namespace);

            $this->model->addQuery('order', $fieldAlias . ' ' . $dir);
        }
    }
}
I hope this will help to find a solution.

Please Log in or Create an account to join the conversation.

Last edit: by lastradacook.

SQL error when making a sort 16 Jan 2017 22:40 #14947

  • admin
  • admin's Avatar
  • Offline
  • Administrator
  • Administrator
  • Chef
  • Posts: 3711
  • Thank you received: 986
Fixed.

There was 2 problems.

The uppercase solution is not ugly. The SQL case convention is not defined by Joomla, but it must stay consistent conventions for all the component.
I prefer when the keywords are uppercase.
The value send trough post can be lowecase (asc / desc), this is not a problem in my sense.
Coding is now a piece of cake

Please Log in or Create an account to join the conversation.

  • Page:
  • 1
Time to create page: 0.053 seconds

For starters it's just so easy to design an app in a way that I'm used to i.e. database first then views followed by customization. The fork system is pure brilliance from a developer standpoint as I can override things and still add and update my projects with minimal effort! Truly amazing to be able to build components in Joomla using incremental refinement without having to do everything by hand. Thanks for the great tool! I am so much more productive now than ever and I can't imagine building components any other way!!!!
Dave (Forum)

Get Started