Oct 9 2014
Yii2 создание блога (Часть 3 – формы редактирования)
В предыдущей части было рассмотрено создание моделей и CRUD операции. В этой части рассмотрим настройку форм редактирования поподробней, сделаем их удобными для использования, для полей представляющих связи добавим поля с выпадающим списком и т.д.
Файлы с представлением (view) располагаются в директории ./views. В директории имеются поддиректории соответствующие названиям наших моделей. После генерации создаётся пять файлов:
_form.php: форма редактирования/создания объекта
create.php: шаблон страницы создания нового объекта
index.php: шаблон страницы вывода списка объектов
update.php: шаблон страницы редактирования объекта
view.php: шаблон страницы просмотра объекта
Начнём с формы создания/редактирования объекта. Для того что бы вывести список вариантов поля связанного с другой таблицей можно воспользоваться виджетом ActiveField::dropDownList. На вход он принимает два параметра: массив вариантов (id => label) и массив опций.
Для генерации массива представляющего key-value можно воспользоваться хэлпером ArrayHelper::map, которому передаём массив и два параметра-имена полей для ключа и значения соответственно.
Таким образом стандартно сгенерированный textInput
<?= $form->field($model, 'category_id')->textInput(['maxlength' => 10]) ?>
меняем на dropDownList:
<?= $form->field($model, 'category_id')->dropDownList( ArrayHelper::map($category, 'id', 'title') ) ?>
Теперь в переменную $category передадим список всех категорий. Для этого в контроллер ./controller/PostController.php внесём следующие изменения:
/** * Создание поста. * @return string|Response */ public function actionCreate() { $model = new Post(); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } else { return $this->render('create', [ 'model' => $model, 'category' => Category::find()->all(), 'authors' => User::find()->all() ]); } }
Аналогичные действия проделываем и для поля автор:
<?= $form->field($model, 'author_id')->dropDownList( ArrayHelper::map($authors, 'id', 'nickname') ) ?>
Пошаманим теперь со страницей вывода информации об авторе (view.php):
<?= DetailView::widget([ 'model' => $model, 'attributes' => [ 'id', 'title', 'anons:ntext', 'content:ntext', 'category_id', 'author_id', 'publish_status', 'publish_date', ], ]) ?>
Меняем на следующий виджет:
<?= DetailView::widget([ 'model' => $model, 'attributes' => [ 'id', 'title', 'anons:ntext', 'content:ntext', 'category.title', 'author.nickname', 'publish_status', 'publish_date', ], ]) ?>
Для того, что бы на странице со списком объектов в таблице вместо идентификаторов отображались значения отредактируем GridView::widget в файле index.php
<?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'title', 'anons:ntext', 'content:ntext', 'category.title', 'author.nickname', 'publish_status', 'publish_date', ['class' => 'yii\grid\ActionColumn'], ], ]); ?>
Антон
Oct 19, 2014 @ 17:29:50
Так и не понял как выводить при добавлении/редактировании список, например, с категориями. Делал по вашему уроку – Error. Делал по мануалам с других ресурсов – Error.
В чем проблема то?
Georgy Spack
Oct 19, 2014 @ 18:06:50
Опишите ошибку подробнее или посмотрите как это сделано в репозиторие: https://github.com/Georgynet/Blog-Yii2 рассматриваемого блога.
Pulse
Nov 08, 2014 @ 04:58:32
Чтобы всё работало, надо ещё в файл /views/post/create.php заменить:
render(‘_form’, [
‘model’ => $model
]) ?>
на:
render(‘_form’, [
‘model’ => $model, ‘category’ => $category, ‘authors’ => $authors
]) ?>
Georgy Spack
Nov 09, 2014 @ 15:24:18
Всё так, не описал этот момент в статье. Но можно увидеть в репозеторие: https://github.com/Georgynet/Blog-Yii2/blob/master/backend/views/post/create.php
erer
Nov 24, 2014 @ 14:57:18
Не получается, пишет Class ‘app\controllers\Category’ not found,
скачал ваше приложение, оно разворачивается на basic или dev?
Georgy Spack
Nov 26, 2014 @ 18:07:54
Если имеется ввиду шаблон базовый скелет, то это: yii2-app-advanced.
MrLeo
Nov 29, 2014 @ 00:58:18
не могу понять…
Блог на Yii Framework 2
Для того, что бы развернуть блог необходимо склонировать репозиторий.
Настроить подключение к БД и запустить миграции:
“`
yii migrate
“`
Georgy Spack
Nov 29, 2014 @ 12:44:24
Установить себе git после чего запустите команду из консоли:
git clone git@github.com:Georgynet/Blog-Yii2.git
Когда склонируется репозиторий, необходимо будет настроить подключение к БД. Для настройки подключения к БД создайте файл common/config/main-local.php и в нём настройте компонент db:
return [
'components' => [
'db' => [
'class' => '\yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
]
];
Подробней можно почитать тут: http://www.yiiframework.com/doc-2.0/yii-db-connection.html
После всего этого находясь в корне проекта выполняйте команду
php yii migrate
MrLeo
Dec 05, 2014 @ 13:28:25
из консоли запускаю под root: git clone git@github.com:Georgynet/Blog-Yii2.git и потом выводит: Cloning into ‘Blog-Yii2’…
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
Georgy Spack
Dec 06, 2014 @ 18:03:24
Об ошибке и о способах её решения можете прочесть по адресу https://help.github.com/articles/error-permission-denied-publickey/
Boris
Feb 11, 2015 @ 20:05:06
Короче делал по примеру, не работал выпадающий список, потом догнал , нужно было подключить в \view\post\ класс
use yii\helpers\ArrayHelper; и все должно заработать.
mika
Feb 12, 2015 @ 08:16:14
если честно, не совсем понимаю смысл содеянного. То есть, например, администратор блога решил написать новый пост, заходит в админку, пишет текст, заголовок, затем выбирает выпадающий список пользователей и получает портянку в 6 скролов экрана со списком всех 4 тысяч зарегистрировавшихся на его ресурсе юзеров? Не логичнее ли при создании нового поста автоматически подставлять в поле автор текущего залогиненого пользователя?
Georgy Spack
Feb 12, 2015 @ 09:22:37
Конечно логично, но что вам мешает сделать это самостоятельно? В статье дан лишь пример. Как вариант можно оставить возможность изменения автора, но по умолчанию отмечать выбранным текущего пользователя.
Если интересует как это реализовать, постараюсь в ближайшее время ответить.
Mika
Feb 12, 2015 @ 12:01:49
Да, у себя уже само собой реализовал. Интересно посмотреть ваш вариант для сравнения. Спасибо за статью.
Georgy Spack
Feb 14, 2015 @ 09:45:41
Мой вариант решения: https://github.com/Georgynet/Blog-Yii2/blob/master/backend/controllers/PostController.php#L82
На шаблонизацию формы передаём модель с уже установленным текущим автором.
Игорь
Feb 15, 2015 @ 17:23:18
Также в PostController.php надо добавить
use app\models\Category;
use app\models\User;
Georgy Spack
Feb 15, 2015 @ 18:30:04
Это зависит от того, в каком namespace лежат ваши модели. По моей задумки эти модели общие для админки и сайтовой части, поэтому они расположены в namespace common/models: https://github.com/Georgynet/Blog-Yii2/blob/master/backend/controllers/PostController.php#L5-L7
Следовательно в данном случае ничего добавлять не нужно.
Eliarh
Mar 11, 2015 @ 17:26:33
Звездочка (asterisk) в требуемых (required) полях
Вопрос
Как в Yii 2 поставить свой html код
в частности не безызвестный font awesome
рядом с требуемым для заполнения полем?
p.s.
в yii2 нашел только $requiredCssClass public property
в yii 1, как понимаю, было afterRequiredLabel
maximka
Mar 26, 2015 @ 16:05:53
при редактировании поста выдаёт ошибку
PHP Warning – yii\base\ErrorException
Invalid argument supplied for foreach()
http://prntscr.com/6lk2r8
Georgy Spack
Mar 31, 2015 @ 08:44:54
Проверьте, что первым аргументов в ArrayHelper::map() действительно приходит массив.
maximka
Mar 31, 2015 @ 10:41:49
С этой ошибкой разобрался уже
а будет пошаговая статья по RBAC как делать привязку по ролям и пользователям?
читал документацию, пробовал делать, пошли затыки, переделывал, уже не знаю куда копать
на форуме тоже молчат, отсылают к документации
версия yii basic
Georgy Spack
Mar 31, 2015 @ 10:59:39
По RBAC пока ничего не могу сказать, постараюсь написать, сейчас времени мало стало, поэтому ничего не хочется обещать.
maximka
Mar 31, 2015 @ 10:50:37
и ещё я не понял, у вас сначала блог делался на basic а теперь там всё advanced
Georgy Spack
Mar 31, 2015 @ 10:56:11
Верно заметили, сначала начинал делать на basic, но спустя некоторое время я заметил, что это будет не удобно и переделал на advanced (с 3й статьи). Страшного в этом ничего нет, изменились лишь namespace классов.
maximka
Mar 31, 2015 @ 11:36:15
получается что изза того что заменили файл User нельзя залогиниться на сайте
Georgy Spack
Mar 31, 2015 @ 15:47:05
Да, от части это так, но любая встретившаяся на вашем пути, при этом, решённая преграда_ вам будет в плюс, так лучше разберётесь в механизме работы. Была бы статья без изъян – это бы был просто копипаст со статьи в свои файлы.
Rena
Feb 12, 2016 @ 11:18:20
Спасибо за статью!
Но есть вопрос
У меня в вьюшке index yii при выводе значении в виджете, сообщает об ошибке
Он не понимает запись ‘category.title’,
А каким образом вы передаете в index значении таблиүы category. Не поняла(
Georgy Spack
Feb 16, 2016 @ 21:44:14
В модели Post присутствует связь с таблицей категорий?
/**
* @return ActiveQuery
*/
public function getCategory()
{
return $this->hasOne(Category::className(), ['id' => 'category_id']);
}
Никита
Feb 20, 2016 @ 21:01:34
При добавлении в PostController.php
‘category’ => Category::find()->all(),
‘authors’ => User::find()->all()
забыли указать, что для использования модели ее нужно сначала подключить, т.е.
use app\modules\blog\models\Category;
use app\modules\blog\models\User;
иначе будет ошибка “Class ‘app\controllers\Category’ not found”
Georgy Spack
Feb 21, 2016 @ 13:30:56
Спасибо за замечание. При написании заметки я предполагал, что это очевидно. К тому же на данном этапе в проекте нет других классов с такими именами, а следовательно нет неоднозначности в том, какой класс необходимо использовать.
Валерий
Jan 19, 2017 @ 18:53:09
В ./controller/PostController.php кроме public function actionCreate() надо аналогично изменитоть и public function actionUpdate(), и соответственно в /views/post/update.php
render(‘_form’, [
‘model’ => $model, ‘category’ => $category, ‘authors’ => $authors
]) ?>
Это мелочь, но я только осваиваю Yii2, так что сначала очень удивился, когда Создать работает, а Изменить нет. Конечно, в репозитарии это есть, но лучше бы сразу написать в статье
Georg Spack
Jan 20, 2017 @ 17:26:00
На счёт того, хорошо это или плохо – сколько людей, столько и мнений. Может вы и правы. Но с другой стороны, если чуть-чуть что-то осталось не дописанным, то для читающего – это возможность попробовать себя и не просто скопировать код и поглядеть на результат, а заодно что-то сделать самостоятельно.