<rmcreative>

RSS

Yii 1.1.11

30 июля 2012

Команда Yii зарелизила версию 1.1.11, в которую вошли более ста улучшений и багфиксов.

Этот релиз особенный потому как является первым с тех пор, как код Yii мигрировал на GitHub. Сообщество восприняло миграцию очень хорошо и выложилось по полной, прислав в виде pull-request новые возможности, исправления, unit-тесты и переводы.

За всё это огромное спасибо! Особенно отметим: resurtm, DaSourcerer, cebe и suralc.

Можно ознакомиться со списком изменений и новыми возможностями. Если планируете обновиться, внимательно читайте инструкции.

После релиза обнаружились некоторые неприятные ошибки. Работаем.

Ну а теперь рассмотрим некоторые изменения.

Поддержка полей HTML5 в CHtml

В CHtml добавлены новые методы:

Использовать так:

echo CHtml::activeNumberField($model, 'fieldName');

CFormatter::formatSize()

Новый метод, позволяющий получить нормально читаемый размер из размера в байтах:

echo Yii::app()->format->formatSize(115969);
// покажет: 113.25 KB

Коды возврата консольного приложения

Теперь можно вернуть integer из действия консольного приложения. Значение будет использовано как код возврата.

Подробнее в руководстве.

CJavaScript::encode() и js:

Если вы использовали CJavaScript::encode() и при этом брали значение из формы или URL, ваше приложение, скорее всего уязвимо. Чтобы закрыть уязвимость, необходимо передать вторым параметром true:

CJavaScript::encode($userInput, true);

Параметр запретит использовать префикс js:. Если вам всё-таки необходимо передать выражение JavaScript обрамите его CJavaScriptExpression:

CJavaScript::encode(new CJavaScriptExpression('alert("Yii!");'), true);

Второй параметр (safe) не влияет на поведение CJavaScriptExpression.

HTTP-кэширование

В дополнение к обычному кешированию страниц, в новой версии можно использовать CHttpCacheFilter. Этот фильтр отсылает заголовки HTTP, которые дают клиенту понять, что содержимое страницы не менялось с последнего запроса. Серверу в этом случае нет необходимости повторно отсылать содержимое. Настраивается CHttpCacheFilter также, как и COutputCache:

public function filters()
{
    return array(
        array(
            'CHttpCacheFilter + index',
            'lastModified'=>Yii::app()->db->createCommand("SELECT MAX(`update_time`) FROM {{post}}")->queryScalar(),
        ),
    );
}

Подробнее в руководстве

Исключение правил валидации модели

Если вы не хотите использовать для валидации одно из правил когда активен определённый сценарий, то можете теперь указать параметр except, содержащий список сценариев. Синтаксис такой же, как и у on:

// строка имён через запятую (пробелы игнорируются)
array('username', 'required', 'except'=>'ignore, this, scenarios, at-all',)

Подробнее в руководстве

Новый инструментарий и документация для переводчиков

Новая документация задаёт рабочий процесс для перевода с использованием github. Инструменты позволяют получить все изменения, произведённые с последнего обновления перевода. Надеемся, что это поможет поддерживать переводы документации в актуальном состоянии.

Комментарии RSS

  1. №6506
    Dr.Death
    Dr.Death 30.07.2012, 21:06:43

    Я правильно понимаю, что обновление простой заменой, без правок кода? За исключением CHtml::encode() ;)

  2. №6507
    Serge Bezborodov
    Serge Bezborodov 30.07.2012, 21:28:36

    я когда гденить виду ник Dr.Death сразу вспоминаю encode, htmlspecialchars и true третим параметром

  3. №6508
    Dr.Death
    Dr.Death 30.07.2012, 21:30:46

    Не ну если бы он мне не подгаживал своей работой я бы молчал. И не true а false, и не третьим, а четвертым :D

  4. №6509
    Sam
    Sam 30.07.2012, 21:31:14

    Dr.Death, да, но сначала погоняйте локально. Релиз готовил не только core team. Могли что-то просмотреть.

  5. №6510
    Максим
    Максим 30.07.2012, 22:00:54

    Эх, а изменений то намного больше......

  6. №6511
    Sam
    Sam 30.07.2012, 22:15:14

    Максим, см. CHANGELOG мы и так еле живые :)

  7. №6516
    Dr.Death
    Dr.Death 31.07.2012, 12:42:11

    Не знаю бага или нет, но если в CDbCriteria указать нужные поля в select то findAll() ничего не отдает, без select т.е. * отдает. Причем оба запроса отдают напрямую выполняясь в базе

  8. №6520
    Sam
    Sam 31.07.2012, 19:22:39

    Dr.Death, подробнее, пожалуйста. В 1.1.10 работало? На простых вещах воспроизводится?

    $criteria = new CDbCriteria();
    $criteria->select = 'id';
    $posts = Post::model()->findAll($criteria);
  9. №6523
    Dr.Death
    Dr.Death 31.07.2012, 19:39:57

    В 1.1.10 таже петрушка... $oCriteria = new CDbCriteria(array( 'select' => 'list_key', )); $aListItems = Lists::model()->findAll($oCriteria); пустое, запрос SELECT list_key FROM lists lists возврашает

    На другом сайте повторить не смог

    $oCriteria = new CDbCriteria(array( 'select' => '1', )); $aListItems = Lists::model()->findAll($oCriteria); SELECT 1 FROM lists lists тоже пусто, напрямую нормально...

    На другой таблице тоже повторить не могу...

  10. №6526
    Sam
    Sam 31.07.2012, 20:26:12

    Dr.Death, на github сумеете закинуть?

  11. №6530
    Dr.Death
    Dr.Death 31.07.2012, 21:48:41

    Не, я не умею :D

  12. №6531
    Sam
    Sam 31.07.2012, 21:54:57

    Плохо. Я сформулировать проблему не смогу потому как понимаю не до конца пример.

  13. №6532
    Dr.Death
    Dr.Death 31.07.2012, 22:02:13

    Ха, решил потыкаться еще раз, нашел источник проблемы, проблема возникает если наследовать от AActiveRecord которая identity map о которой как то уже писали, видимо в ней что то с новым глючит :D

  14. №6533
    Dr.Death
    Dr.Death 31.07.2012, 22:04:34

    А ну все! Сам олень :D

    'select' => 'list_id, list_key, list_value',

    primary key необходимо выбирать :)

  15. №6535
    rmrevin
    rmrevin 01.08.2012, 13:20:18

    Релиз в мой день рождения вышел. Спасибо за подарок! )

  16. №6536
    Sam
    Sam 01.08.2012, 15:16:05

    rmrevin, с прошедшим.

  17. №6539
    porcelanosa
    porcelanosa 02.08.2012, 1:06:20

    Не смогла удержаться Google translate инструкции по обновлению - Замените каталог "рамки" с новой точки или желудочно-кишечного тракта к новому Сорри за оффтоп

  18. №6551
    Dr.Death
    Dr.Death 10.08.2012, 16:45:39

    Вот какой косяк заметил. Есть кроновый контроллер.

        protected function beforeAction($action) {
            // check key
            if(Yii::app()->user->isGuest) {
                $sKey = Yii::app()->input->get('key');
                if(!$sKey or $sKey != Yii::app()->params['secretKey']) {
                    throw new CHttpException(404);
                }
            }
    
            set_time_limit(0);
    
            return parent::beforeAction($action);
        }
    
    

    Периодически выдает

    session_regenerate_id() [function.session-regenerate-id]: Cannot regenerate session id - headers already sent

    Если почистить куки и заного залогиниться, то все нормально

  19. №6554
    Sam
    Sam 10.08.2012, 18:42:58

    Сделайте чтоли нормальный крон консольный…

  20. №6555
    Dr.Death
    Dr.Death 10.08.2012, 18:45:45

    Как смог на хостинге так и сделал...

  21. №6557
    Sam
    Sam 10.08.2012, 20:21:31

    Трейс этой штуки можно увидеть?

  22. №6562
    Dr.Death
    Dr.Death 11.08.2012, 0:27:21

    Намылил

  23. №6567
    Sam
    Sam 12.08.2012, 13:09:04

    Dr.Death, куда? Ничего не получил.

  24. №6568
    Dr.Death
    Dr.Death 12.08.2012, 13:09:52

    sam@rmcreative.ru

  25. №6569
    Sam
    Sam 13.08.2012, 1:39:45

    Не пришло. В спаме нет. Давайте на какой-нибудь gist или pastebin.

  26. №6570
    Dr.Death
    Dr.Death 13.08.2012, 10:15:24
  27. №6571
    Sam
    Sam 13.08.2012, 16:31:17

    Стоит воспользоваться headers_list в CHttpSession::regenerateID и посмотреть, что за заголовки уже отсылались. Станет понятней.

  28. №6574
    Dr.Death
    Dr.Death 14.08.2012, 16:27:45

    По ходу написания вылез следующий косяк...

    $aAds = Yii::app()->db->createCommand()
                            ->select('a.ad_id')
                            ->from(Ad::model()->tableName(). ' AS a')
                            ->where('a.ad_action = :ad_action')
                            ->order('a.ad_id DESC')
                            ->limit(10)
                            ->bindValues(array(
                                ':ad_action' => 'sell',
                            ))
                            ->queryAll();
    
    

    Почему то order, limit указанные после bindValues не применяются

  29. №6575
    Sam
    Sam 15.08.2012, 2:18:34

    Какой именно запрос выходит?

  30. №6576
    Dr.Death
    Dr.Death 15.08.2012, 10:27:15

    Ну все что после bindValues() из запроса убирается

    $aAds = Yii::app()->db->createCommand()
                            ->select('a.ad_id')
                            ->from(Ad::model()->tableName(). ' AS a')
                            ->bindValues(array(
                                ':ad_action' => 'sell',
                            ))
                            ->where('a.ad_action = :ad_action')
                            ->order('a.ad_id DESC')
                            ->limit(10)
                            ->queryAll();
    system.db.CDbCommand.query(SELECT `a`.`ad_id` FROM `realty_ads` `a`. Bound with :ad_action='sell')
    $aAds = Yii::app()->db->createCommand()
                            ->select('a.ad_id')
                            ->from(Ad::model()->tableName(). ' AS a')
                            ->where('a.ad_action = :ad_action')
                            ->bindValues(array(
                                ':ad_action' => 'sell',
                            ))
                            ->order('a.ad_id DESC')
                            ->limit(10)
                            ->queryAll();
    system.db.CDbCommand.query(SELECT `a`.`ad_id` FROM `realty_ads` `a` WHERE a.ad_action = :ad_action. Bound with :ad_action='sell')
    $aAds = Yii::app()->db->createCommand()
                            ->select('a.ad_id')
                            ->from(Ad::model()->tableName(). ' AS a')
                            ->where('a.ad_action = :ad_action')
                            ->order('a.ad_id DESC')
                            ->bindValues(array(
                                ':ad_action' => 'sell',
                            ))
                            ->limit(10)
                            ->queryAll();
    system.db.CDbCommand.query(SELECT `a`.`ad_id` FROM `realty_ads` `a` WHERE a.ad_action = :ad_action ORDER BY `a`.`ad_id` DESC. Bound with :ad_action='sell')
    $aAds = Yii::app()->db->createCommand()
                            ->select('a.ad_id')
                            ->from(Ad::model()->tableName(). ' AS a')
                            ->where('a.ad_action = :ad_action')
                            ->order('a.ad_id DESC')
                            ->limit(10)
                            ->bindValues(array(
                                ':ad_action' => 'sell',
                            ))
                            ->queryAll();
    system.db.CDbCommand.query(SELECT `a`.`ad_id` FROM `realty_ads` `a` WHERE a.ad_action = :ad_action ORDER BY `a`.`ad_id` DESC LIMIT 10. Bound with :ad_action='sell')
  31. №6578
    Sam
    Sam 15.08.2012, 14:37:23

    А, это особенность prepared statement. Для того, чтобы сделать bindValue нужно скомпилировать его. А после компиляции, естественно, менять не выйдет.

  32. №6580
    Dr.Death
    Dr.Death 15.08.2012, 14:41:31

    А кто бы знал, на вид аналог CDbCriteria и нигде не написано, что так не делать

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.