Yii 1.1.11
30 июля 2012
Команда Yii зарелизила версию 1.1.11, в которую вошли более ста улучшений и багфиксов.
Этот релиз особенный потому как является первым с тех пор, как код Yii мигрировал на GitHub. Сообщество восприняло миграцию очень хорошо и выложилось по полной, прислав в виде pull-request новые возможности, исправления, unit-тесты и переводы.
За всё это огромное спасибо! Особенно отметим: resurtm, DaSourcerer, cebe и suralc.
Можно ознакомиться со списком изменений и новыми возможностями. Если планируете обновиться, внимательно читайте инструкции.
После релиза обнаружились некоторые неприятные ошибки. Работаем.
Ну а теперь рассмотрим некоторые изменения.
Поддержка полей HTML5 в CHtml
В CHtml
добавлены новые методы:
CHtml::dateField()
CHtml::rangeField()
CHtml::numberField()
CHtml::emailField()
CHtml::urlField()
CHtml::activeDateField()
CHtml::activeRangeField()
CHtml::activeNumberField()
CHtml::activeEmailField()
CHtml::activeUrlField()
Использовать так:
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 по email OK
Я правильно понимаю, что обновление простой заменой, без правок кода? За исключением CHtml::encode() ;)
я когда гденить виду ник Dr.Death сразу вспоминаю encode, htmlspecialchars и true третим параметром
Не ну если бы он мне не подгаживал своей работой я бы молчал. И не true а false, и не третьим, а четвертым :D
Dr.Death, да, но сначала погоняйте локально. Релиз готовил не только core team. Могли что-то просмотреть.
Эх, а изменений то намного больше......
Максим, см. CHANGELOG мы и так еле живые :)
Не знаю бага или нет, но если в CDbCriteria указать нужные поля в select то findAll() ничего не отдает, без select т.е. * отдает. Причем оба запроса отдают напрямую выполняясь в базе
Dr.Death, подробнее, пожалуйста. В 1.1.10 работало? На простых вещах воспроизводится?
В 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
тоже пусто, напрямую нормально...На другой таблице тоже повторить не могу...
Dr.Death, на github сумеете закинуть?
Не, я не умею :D
Плохо. Я сформулировать проблему не смогу потому как понимаю не до конца пример.
Ха, решил потыкаться еще раз, нашел источник проблемы, проблема возникает если наследовать от AActiveRecord которая identity map о которой как то уже писали, видимо в ней что то с новым глючит :D
А ну все! Сам олень :D
primary key необходимо выбирать :)
Релиз в мой день рождения вышел. Спасибо за подарок! )
rmrevin, с прошедшим.
Не смогла удержаться Google translate инструкции по обновлению - Замените каталог "рамки" с новой точки или желудочно-кишечного тракта к новому Сорри за оффтоп
Вот какой косяк заметил. Есть кроновый контроллер.
Периодически выдает
Если почистить куки и заного залогиниться, то все нормально
Сделайте чтоли нормальный крон консольный…
Как смог на хостинге так и сделал...
Трейс этой штуки можно увидеть?
Намылил
Dr.Death, куда? Ничего не получил.
[email protected]
Не пришло. В спаме нет. Давайте на какой-нибудь gist или pastebin.
pastebin.com/hN2rChgS
Стоит воспользоваться
headers_list
вCHttpSession::regenerateID
и посмотреть, что за заголовки уже отсылались. Станет понятней.По ходу написания вылез следующий косяк...
Почему то order, limit указанные после bindValues не применяются
Какой именно запрос выходит?
Ну все что после bindValues() из запроса убирается
А, это особенность prepared statement. Для того, чтобы сделать
bindValue
нужно скомпилировать его. А после компиляции, естественно, менять не выйдет.А кто бы знал, на вид аналог CDbCriteria и нигде не написано, что так не делать