Нашел баг в CSort

Уже исправленные репорты или принятые предложения
Закрыто
Аватара пользователя
denis909
Сообщения: 103
Зарегистрирован: 2009.04.02, 16:04
Откуда: Санкт-Петербург
Контактная информация:

Нашел баг в CSort

Сообщение denis909 »

Почитал советы как делать сортировку по релейшену и ужаснулся, стал искать причину, почему это нельзя делать автоматически. И таки нашел. Баг в классе CSort:

Код: Выделить всё

    public function getDirections()
    {
        if($this->_directions===null)
        {
            $this->_directions = array();
            
            if(isset($_GET[$this->sortVar]) !== FALSE)
            {            
                $attributes = explode($this->separators[0], $_GET[$this->sortVar]);
                
                foreach($attributes as $attribute)
                {
                    $segments = explode($this->separators[1], $attribute);
                    
                    $count = count($segments);
                    
                    $descending = FALSE;
                    
                    if ($count > 0)
                    {
                        if (strcasecmp($segments[$count - 1], $this->descTag) === 0)
                        {                        
                            $descending = TRUE;
                            
                            unset($segments[$count - 1]);
                            
                            $attribute = implode($this->separators[1], $segments);
                        }
                    }
                    
                    if ($this->resolveAttribute($attribute) != FALSE)
                    {
                        $this->_directions[$attribute] = $descending;
                        
                        if ($this->multiSort == FALSE)
                        {
                            return $this->_directions;
                        }
                    }
                }                
            }
            
            if (count($this->_directions) === 0)
            {
                if (is_array($this->defaultOrder) === TRUE)
                {
                    $this->_directions = $this->defaultOrder;
                }
            }
        }
        
        return $this->_directions;
    } 
после замены этого кода, чтобы добавить сортировку в CGridView нужно:

1. CActiveDataProvider добавить конфигурацию сортировки:

Код: Выделить всё

        'dataProvider' => array(
            'sort' => array(
                'attributes' => array(
                    'id',
                    'element.created' => array(
                        'asc' => 'element.created',
                        'desc' => 'element.created DESC',
                        'label' => 'Name from config'
                    )
                )
            )
        ) 

 
2. должна быть объявлена связь element
3. поле element.created в конфигурации columns для СGridView
4. в конфигурацию CDbCriteria для CActiveDataProvider

Код: Выделить всё

        'criteria' => array(
            'with' => array(
                'element'
            )
        ) 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Нашел баг в CSort

Сообщение samdark »

Залил в SVN. Прошу хорошенько оттестить.
Аватара пользователя
denis909
Сообщения: 103
Зарегистрирован: 2009.04.02, 16:04
Откуда: Санкт-Петербург
Контактная информация:

Re: Нашел баг в CSort

Сообщение denis909 »

if ($count > 0) нужно заменить на if ($count > 1)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Нашел баг в CSort

Сообщение samdark »

Ок. С этим кодом Yii начинает пропускать в getDirections атрибуты с точкой в имени. Как это поможет?
Аватара пользователя
denis909
Сообщения: 103
Зарегистрирован: 2009.04.02, 16:04
Откуда: Санкт-Петербург
Контактная информация:

Re: Нашел баг в CSort

Сообщение denis909 »

Не совсем понял формулировку вопроса, что значит поможет..? После этого стало возможным в CGridView (и возможно где-то ещё) делать сортировку по столбцу, который не является аттрибутом основной модели, а получается из связи с другой моделью.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Нашел баг в CSort

Сообщение samdark »

Понял, но по-моему этого маловато. Автоматом, если не указывать attributes, а использовать все валидные атрибуты модели, работать не будет. А над этим кодом надо ещё чуть пошаманить…
Аватара пользователя
denis909
Сообщения: 103
Зарегистрирован: 2009.04.02, 16:04
Откуда: Санкт-Петербург
Контактная информация:

Re: Нашел баг в CSort

Сообщение denis909 »

Я понял, речь о том, чтобы от программиста требовалось только выполнить пункты 2 и 3, а 1 и 4 - сделал фреймворк, это разумно. У меня будет время попробовать разобраться с этим после новогодних праздников.
Закрыто