Как стать автором
Обновить

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

Хорошая статья. Сценарии были и в первой версии Yii.
Спасибо за статью, очень интересно. Жаль что релиза ещё долго ждать, и Макаров сам не рекомендовал использовать текущую версию Yii2 на продакшене из-за не стабильности и нерабочих кусков кода. Кстати на devconf2013 я у него спросил про LTS (Long Time Support), он обещал не забрасывать ветку первого Yii, и какие-то вещи туда дописывать, но в основном фиксы и заплатки. Остаётся только ждать :)
Скоро 1.1.14 релизнем. Один из самых внушительных релизов 1.1…
Александр, вы заинтриговали! Ждем с нетерпеньем. Это мой первый фреймворк (CI в расчет не беру) и я в него влюбился. У нас в компании на нем все проекты сейчас реализовываются.
А есть где посмотреть инфу о 14 релизе?
Спасибо большое! Плюсанул бы но карма маленькая пока, не дает :(
Присоединяюсь. Как и у вас, до Yii был только CI. Очень нравится Yii.
Хочу начать изучение Yii. Вопрос: есть ли смысл начинать писать на yii, если в будущем выйдет yii 2 и придется переходить на нее. Не получится что зря потрачу время, изучая yii? Или же базово все-таки 2-ая версия не будет отличаться от 1-ой?
И такой вопрос: начинаю читать документацию. Смотрю есть даже пара тестовых проектов. А кто-нибудь знает существует ли для Yii какие-нибудь курсы (может быть даже платные), мастер-классы и т.д.? Может какие-то подробно разобранные проекты (тестовые проекты). Боязно соваться в изучение, т.к. есть страх, что окажется не под силу (никогда не использовал фреймворки и даже плохо себе представляю что это). Сейчас имею свой рукописный движок (без использования какого-либо фреймворка). В прицнипе рабочий, на нем сделал кучу сайтов и продолжаю делать, но хочу перейти к более высокому уровню и отойти уже от быдлокодерства. Но бросать его и начинать изучать yii, не зная к чему это приведет — боязно. На своем движке я могу выполнить какую угодно прихоть клиента, а вот смогу ли я это же делать на yii — не знаю. И главный вопрос — сколько времени уйдет на изучение? Как он вообще, сложен в освоении? Если бросить все на пару месяцев и заняться только им, реально начать писать?
Господи, чего там изучать, какие курсы.
Всё есть на сайте yii в прекрасном виде.
Реально за 2 недели на нём начать писать. И потом оторваться не сможете.
Я до этого работал только с цмсками и однажды с ci. Первый тестовый учебный проект делал по инструкции на сайте русского комьюнити. Сначала было очень тяжело, заняло пару часов так как в инструкции были косяки, не все части описаны, плюс разбирался в офф доках. Второй раз уже все как по маслу.

По поводу разницы между 1.1 и 2. Лучше сейчас начать, так как концепцию понять можно на 1.1 версии. Зато потом легче будет осваивать вторую версию. У нас в компании решили пока сидеть на 1.1 и не спешить. Тем более версия 1.1 тоже восхитительна и реально быстра.

Сейчас даже первый клиентский сайт буду делать на заказ именно на Yii, а не на битриксе, который я любил до появления Yii в моей жизни :)
Пара моментов:

1. Правильно всё-таки не echo $this->render, а return $this->render, хотя работает и так и так.
2. deny all можно не писать в фильтре доступа, он по умолчанию всё запрещает.
Спасибо Александр!
Поправил!
Присоединяюсь, использование echo в контроллере не хорошая практика. Совсем не хорошая. :)
в CRUD получается так, что валидация 2 раза запускается
Исправил. Спасибо!
Можно еще упростить до
$model = new Blog();
if ($model->load($_POST) && $model->save()) {
    return Yii::$app->response->redirect(array('view', 'id' => $model->id));
} 
return $this->render('create', array('model' => $model));
А потом до

$model = new Blog();
if ($model->load($_POST) && $model->save()) 
    return Yii::$app->response->redirect(array('view', 'id' => $model->id));
return $this->render('create', array('model' => $model));
Хоршая статья, хотя подучилось немного сумбурно.
Особенно меня радует в новой версии отдельные вьюшки. С отдельным классом удобней, что ли, стало.
Спасибо за статью. Добра вам.
Александр, какова была мотивация заменить точки на обратные слеши в псевдонимах классов?
Может потому, что теперь стали использовать пространства имен в ядре? Зачем городить точки, если есть обратные слеши? ;-)
HaruAtari верно предположил.
Хочу пример блога, где есть связь many-to-many, ибо AR больше не поддерживает, а такой тип связи никуда не исчез.
Все описанное понравилось кроме ActiveForm, уж слишком она громоздкая.
На мой взгляд было бы красивей
так
<?=$form = ActiveForm::begin($model, array('options' => array('class' => 'form-horizontal')));
echo $form->username->input($model->isNewRecord ? array() : array('readonly' => true));
echo $form->email->input();
if (!$model->isNewRecord) {
    if (Yii::$app->user->checkAccess('editProfile')) {
        echo $form->status->dropDown([
        	User::STATUS_ACTIVE => 'Active',
        	User::STATUS_INACTIVE => 'Inactive',
        	User::STATUS_DELETED => 'Deleted'
        ]);
        echo $form->role->dropDown([
        	User::ROLE_USER => 'User',
        	User::ROLE_ADMIN => 'Admin'
        ]);
    }
    echo Html::passwordInput(['name'=>'oldPassword']);
}
echo $form->password->passwordInput();
echo Html::passwordInput(['name'=>'rePassword']);
?>

<div class="form-actions">
    <?=$model->submitButton($model->isNewRecord ? 'Register' : 'Update', array('class' => 'btn btn-primary')); ?>
</div>

<?=$form->end(); ?>

А если модели две?
Ну тут я вижу 2 варианта
1) Такое достаточно редко и можно этим пренебречь
2) Можно использовать 2 объекта ActiveForm.
1) Это не так редко в проектах с сложной предметной областью.
2) Нельзя. Форма-то одна.

Если поменять в методе field параметры местами, то можно в конструкторе биндить модель, а затем просто дёргать типа
$form->field('username')->inputText();
$form->field('group', $modelGroups)->inputSelect();

$form->username — плохо, т.к. не будет автокомплита, да и IDE ругается на фейковые аттрибуты.

Вам бы Yii::$app вынести в отдельный метод контроллера $this->app()->....., так и симпатичнее и легко мокать либо перегружать в наследниках
Довольно часто получается, что нет какой-то главной модели и в форме поля намешаны:

model1Field1
model2Field1
model1Field2
model3Field1
Ну так мой вариант не мешает работать с несколькими, просто есть основная модель и необязательный параметр. Всего-то нужно местами параметры поменять для удобства.

Ну и если совсем уж теоретизировать, то модели всегда связанные и должна быть главная модель, а остальные просто браться от неё.
$form->field('username');
$form->field('Group.name'); // ооствественно тянется связанная модель 1-1 Group
$form->field('Group.Permissions.0'); // Тянется 1-1 Grup и из неё 1-* Permissions
$form->field('Group.Permissions.1');
Но реализация такого варианта обычно порождает массу говнокода внутри, чтобы получить красивое апи снаружи. Так что лучше остановить на модели по умолчанию.
Обычно это все же связные модели, с которыми можно работать одновременно.
Я даже не могу придумать варианте где на 1 форме могут быть поля из разных не связанных моделей.

Можно тогда для более сложный форм использовать такой вариант
Form::field($model, 'email')->textInput();
Ошибкаю Возможно после обновления фреймворка.
modules\rbac\components\PhpManager.php – yii\rbac\PhpManager::assign()

$this->assign(Yii::$app->user->identity->id, Yii::$app->user->identity->role);
Спасибо! Все исправил в новой версии приложения. Ссылки на неё в стаье подправил.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.