Oct 23 2014
Yii2 создание блога (Часть 5 – вывод постов и категорий)
Пришло время вывести список постов и непосредственно сами посты на просмотр. Моделью постов предусмотрен статус публикации постов. Для того, что бы выводились посты только со статусом опубликовано, вносим изменения в модель постов.
/** * Возвращает опубликованные посты * @return ActiveDataProvider */ function getPublishedPosts() { return new ActiveDataProvider([ 'query' => Post::find() ->where(['publish_status' => self::STATUS_PUBLISH]) ]); }
И добавляем шаблоны для вывода списка постов, короткой и полной новости.
Список постов:
$this->title = 'Посты'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="col-sm-8 post-index"> <h1><?= Html::encode($this->title) ?></h1> <?php foreach ($dataProvider->models as $model) { echo $this->render('shortView', [ 'model' => $model ]); } ?> </div> <div class="col-sm-3 col-sm-offset-1 blog-sidebar"> <h1>Категории</h1> </div>
Короткая новость:
<h1><?= $model->title ?></h1> div class="meta"> <p>Автор: <?= $model->author->username ?> Дата публикации: <?= $model->publish_date ?> Категория: <?= $model->category->title ?></p> </div> <div class="content"> <?= $model->anons ?> </div>
Полная новость:
<h1><?= $model->title ?></h1> <div class="meta"> <p>Автор: <?= $model->author->username ?> Дата публикации: <?= $model->publish_date ?> Категория: <?= $model->category->title ?></p> </div> <div class="content"> <?= $model->anons ?> </div> <?= Html::a('Читать далее', ['view', 'id' => $model->id], ['class' => 'btn btn-success']) ?>
Для вывода категорий воспользуемся циклом, предыдущий шаблон примет вид:
<div class="col-sm-3 col-sm-offset-1 blog-sidebar"> <h1>Категории</h1> <ul> <?php foreach ($categories->models as $category) { echo $this->render('//category/shortViewCategory', [ 'model' => $category ]); } ?> </ul> </div>
В $this->render первым параметром передаётся путь к шаблону: ‘//category/shortViewCategory’. Путь начинается с двойного слыша, это alias к корню директории хранящей шаблоны.
Шаблон shortViewCategory очень прост:
<li><?= \yii\helpers\Html::a($model->title, ['category/index', 'id' => $model->id])?></li>
Для того, что бы выбрать все опубликованные посты относящиеся к категории в модель категории добавляем метод:
/** * Возвращает список постов принадлежащих категории. * @return ActiveDataProvider */ public function getPosts() { return new ActiveDataProvider([ 'query' => $this->hasMany(Post::className(), ['category_id' => 'id']) ->where([ 'publish_status' => Post::STATUS_PUBLISH ]) ]); }
А контролер отображения списка постов в категории примет вид:
public function actionIndex($id) { $category = Category::findOne(['id' => $id]); return $this->render('index', [ 'category' => $category->getCategory($id), 'posts' => $category->getPosts($id), 'categories' => $category->getCategories() ]); }
Полностью исходный код можно посмотреть на GitHub: https://github.com/Georgynet/Blog-Yii2
Pulse
Nov 11, 2014 @ 16:12:38
Продолжение будет?
Georgy Spack
Nov 12, 2014 @ 01:24:02
Надеюсь в ближайшее время руки дойдут, вообще хотелось бы ещё несколько статей сделать по тэгам, комментариям и правам.
Николай
Nov 13, 2014 @ 21:39:16
Здравствуйте. На гитхабе сказано, что для того, что бы развернуть блог необходимо склонировать репозиторий. Настроить подключение к БД и запустить миграции.
Объясните пожалуйска как это сделать?
И да, жду продолжения )
Georgy Spack
Nov 15, 2014 @ 00:45:08
Здравствуйте! Что бы получить базовые навыки использования Git можно пройти интерактивный курс http://githowto.com/ru или воспользоваться инструментами на GitHub: “Clone in Desktop”. После чего воспользовавшись консолью перейдите в директорию с развёрнутым проектом и выполните команду php yii migrate.
Для настройки подключения к БД создайте файл 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
Николай
Nov 19, 2014 @ 15:35:50
Там нет файла yii. Трудность составляют именно миграции.
Как я понял нужно склонировать в скачанный заранее “свежий” фреймворк?
В целом с задачей категорий справился, немного по другому и тоже годно.
Georgy Spack
Nov 19, 2014 @ 18:50:43
Вы composer запускали? В корне репозитория есть файл, composer.json, в котором описаны зависимости, если запустить composer, он сам подтянет framework.
Georgy Spack
Nov 19, 2014 @ 22:53:15
Спасибо за замечание, файл yii был в .gitignore, поэтому не попал в репозиторий. Теперь добавил.
Cyb
Feb 26, 2015 @ 15:34:54
Прошу прощения за глупый вопрос. Уже три других обучалова по Yii2 попробовал, а на этот урок возвращаюсь и толком не могу понять и продолжить.
“И добавляем шаблоны для вывода списка постов, короткой и полной новости.”
Куда мы их добавляем? Как должны называться файлы с содержимым, которое указано ниже? Кто эти шаблоны вызывает?
Я так понимаю, это где-то в папке view, вероятнее всего в post, но мне это, дураку, совершенно не очевидно.
Подскажите, будьте так добры!
Georgy Spack
Feb 27, 2015 @ 23:06:18
Название шаблона короткого поста (новости) shortView.php
Имя шаблона задаётся в строке:
https://github.com/Georgynet/Blog-Yii2/blob/d8025d6d08be4abc3196f246c69ca7a25655a9c9/frontend/views/post/index.php#L19
Размещён по пути /frontend/views/post/shortView.php так как вызывается из шаблона /frontend/views/post/index.php и указано просто имя шаблона, а значит поиск будет производиться в той же директории, в которой расположен шаблон из которого происходит вызов (/frontend/views/post/).
Название шаблона короткого поста (новости) view.php
Название берётся от имени экшена View контроллера Post https://github.com/Georgynet/Blog-Yii2/blob/d8025d6d08be4abc3196f246c69ca7a25655a9c9/frontend/controllers/PostController.php#L48
Следовательно шаблон view.php следует поместить в директорию /frontend/views/post/
Cyb
Mar 03, 2015 @ 17:23:01
Большое спасибо за исходник. Эта штука – отличный образец.
К слову, с данными уроками он не совсем совпадает 🙂 Но это уже детали и мелочи.
Низкий поклон за Ваш труд!
На всякий случай еще спрошу, не знаете ли других таких же движков на Yii2 для разбора содержимого? По большому счету, достаточно и Вашего, но лишние примеры лишними не будут 🙂
Georgy Spack
Mar 04, 2015 @ 09:24:43
Пожалуйста, я рад, что Вам нравится. Исходник отличается, так как я периодически в нём произвожу изменения.
> На всякий случай еще спрошу, не знаете ли других таких же движков на Yii2 для разбора содержимого?
Вот этот вопрос не очень понял, если вы имели в виду альтернативы https://github.com/, то как вариант ещё можно воспользоваться https://bitbucket.org/ . В отличии от github, на bitbucket можно создавать приватные репозитории бесплатно и команду до 5 человек.
Cyb
Mar 05, 2015 @ 11:09:00
Нет, я не про хранилище репо, а про движок.
Ваш движок – блога, интересно было бы еще исходники интернет-магазина на Yii посмотреть, к примеру. 🙂
Никогда не задумывался, а ведь, вероятно, на гитхабе можно попросту воспользоваться поиском… Погляжу, благодарю за наводку.
Дмитрий Елисеев
Feb 27, 2015 @ 11:25:45
> foreach ($dataProvider->models as $model) { … }
Это уже удобнее делать с ListView.
Валерий
Jan 21, 2017 @ 14:42:09
Конечно в репозитарии есть ShortView.php, однако в статье почему то вместо этого приведен снова список постов. Наверняка просто описка, но таких как я начинающих сначала это смущает и даже путает
Georg Spack
Jan 21, 2017 @ 18:54:46
Спасибо, поправил!
Валерий
Jan 21, 2017 @ 16:27:44
Цикл для вывода списка категорий в статье указан неверно (по крайней мере у меня выдает ошибку “неверный аргумент для foreach” – надо вместо
models as $category)
echo $this->render(‘//category/shortViewCategory’, [
‘model’ => $category
]);
}
?>
набрать
foreach ($dataProvider->models as $category) {
echo $this->render(‘//category/shortViewCategory’, [
‘model’ => $category
]);
}
?>
После этого справа выводится весь список категорий
Georg Spack
Jan 21, 2017 @ 18:49:36
Название переменной зависит от того, как вы её назовёте в момент передачи на шаблонизацию: https://github.com/Georgynet/Blog-Yii2/blob/master/frontend/controllers/CategoryController.php#L27
Валерий
Jan 23, 2017 @ 14:31:52
Я решил клонировать проект с GitHub, установил git, в консоли набрал git clone https://github.com/Georgynet/Blog-Yii2, получил папку Blog-Yii2, в консоли перешел в этот каталог, выполнил php init. В файле common\config\main-local.php настроил подключение к базе
‘db’ => [
‘class’ => ‘yii\db\Connection’,
‘dsn’ => ‘mysql:host=localhost;dbname=yii2_blog’,
‘username’ => ‘root’,
‘password’ => ”,
‘charset’ => ‘utf8’,
‘tablePrefix’ => ‘tbl_’,
],
База yii2_blog создана, в ней есть таблицы (6, не считая migration). Запускаю – об ошибках сообщений нет, но ничего, кроме Вход, не работает. В верхней строке выводится
Sllite.ru Блог Об мне Контакты Регистрация Вход
боле ничего, только заголовок справа Категории, в нижней строке
© sllite.ru 2017 Powered by Yii Framework
И больше ничего.
Очень прошу помочь разобраться, что я делаю не так
Валерий
Jan 23, 2017 @ 14:44:33
Может я и погорячился со своим обращением, получается, что пока таблицы category и post пустые, то ничего и не отображается. Добавил для пробы пару записей в canegory и post. При нажатии Блог появились Посты слева и Категории справа. Вот только непонятно – как вставлять новые посты (и категории)? Или это пример только для отображения Постов для выбранной Категории?
Валерий
Jan 23, 2017 @ 14:45:47
Забыл написать – добавление записей я проводил в phpMyAdmin
Georg Spack
Jan 23, 2017 @ 15:32:25
Посты и категории добавлять через раздел администрирования: http://blog-domain.local/admin/
Валерий
Jan 23, 2017 @ 18:07:37
Как я понимаю, в проекте есть файл .htaccess(его содержание
# Mod_Autoindex
# Запрещаем просмотр содержимого папок
Options -Indexes
# Mod_Rewrite
Options +FollowSymlinks
# Включаем mod_rewrite
RewriteEngine On
IndexIgnore */*
# Перенаправляем administrator на входной скрипт админки
RewriteRule ^admin/(.*)?$ /backend/web/$1 [L,PT]
# Перенаправляем все запросы на входной скрипт
RewriteRule ^([^/].*)?$ /frontend/web/$1
), который должен перенаправлять запрос на входной скрипт backend, если в адресе стоит admin. Но у меня по blog.yii2 запускается нормально frontend, а если набрать blog.yii2/admin – выдает
Not Found (#404)
Page not found.
The above error occurred while the Web server was processing your request.
Please contact us if you think this is a server error. Thank you.
Я настроил, чтобы по blog.admin вызывался \localhost\blog-yii2\backend\web\index.php – в этом случае получаем странность
Sllite.ru
Home
Logout (ovn)
Site
Forbidden (#403)
You are not allowed to perform this action.
The above error occurred while the Web server was processing your request.
Please contact us if you think this is a server error. Thank you.
© Sllite.ru 2017
Powered by Yii Framework
Я как начинающий понимаю, что где-то ошибся, но не могу понять где?
Валерий
Jan 24, 2017 @ 13:58:30
Я получил странный на вид результат – удалил клон, еще раз клонировал, выполнил init, настроил подключение к базе yii2_blog (без TablePrefix), выполнил migrate (созданы таблицы и пользователь demoadmin), запустил backend (чтобы создать категории и посты), вошел как demoadmin и получил такой вид
Sllite.ru
Home
Logout (demoadmin)
Site
Блог
Посты
Категории
Тэги
Комментарии
Пользователи
© Sllite.ru 2017
Powered by Yii Framework
При этом все работает – категории и посты создаются, при переходе к frontend все отображается как положено. Поясните – так и должно быть? Я только начинаю осваивать Yii2 и не понимаю, почему так по разному отображаются
Georg Spack
Jan 24, 2017 @ 16:04:27
>> подключение к базе yii2_blog (без TablePrefix)
Это точно не влияет на вывод никаким образом.
>> Я только начинаю осваивать Yii2 и не понимаю, почему так по разному отображаются
Админская и лицевая часть отличаются. Одна выводит в удобном виде для пользователя, другая для администратора.
Почему у вас не получилось в первый раз – не могу сказать, возможно что-то не так сделали.
Валерий
Jan 24, 2017 @ 18:24:23
Спасибо за помощь. Я и сам не понял, что я первый раз сделал не так. А подключение к базе TablePrefix я сделал специально – тогда создаются таблицы, в том числе user, и в ней пользователь demoadmin. А если установить TablePrefix, то demoadmin не создается – выдает ошибку в переводе “Таблица yii2_blog.user не найдена”. И все таки меня очень смущает внешний вид backend проекта – вроде как в текстовом виде. Скажем просто для Yii2-advanced внешний вид frontend и backend почти не отличаются, только для backend сразу просит ввести логин и пароль. Если бы Вы сообщили мне на почту свой e-mail, я бы переслал скриншоты. А то сомнения остаются.
Georg Spack
Jan 24, 2017 @ 19:28:13
Да, действительно, знака % не хватает в строке:
https://github.com/Georgynet/Blog-Yii2/blob/master/console/migrations/m160307_190534_default_user.php#L9
Должно быть так:
$this->insert(‘{{%user}}’, [
Тогда будет срабатывать.
По внешнему виду теперь понял, о чём вы. Поглядите, пути до css, похоже они не подтягиваются, поэтому и никакого оформления. Похоже правила с .htaccess не отрабатывают.
Валерий
Jan 24, 2017 @ 18:49:20
Забыл написать – если в пользовательской части войти как demoadmin, в панели навигации (вверху экрана) появляется пункт Панель управления, но при нажатии на него выдается Not Found (#404). Это тоже мне не понятно – опять я что-то сделал не так? Или это для доработки в будущем?
Georg Spack
Jan 24, 2017 @ 19:31:10
Похоже правила с .htaccess не отрабатывают.
Валерий
Jan 24, 2017 @ 20:09:02
Файл .htaccess в клоне проекта есть, я его не менял, его содержимое
# Mod_Autoindex
# Запрещаем просмотр содержимого папок
Options -Indexes
# Mod_Rewrite
Options +FollowSymlinks
# Включаем mod_rewrite
RewriteEngine On
IndexIgnore */*
# Перенаправляем administrator на входной скрипт админки
RewriteRule ^admin/(.*)?$ /backend/web/$1 [L,PT]
# Перенаправляем все запросы на входной скрипт
RewriteRule ^([^/].*)?$ /frontend/web/$1
Может дело в том, что я в настройках OpenServer на вкладке Домены создал записи для сокращения набора имени сайта, например Blog.Yii2 для папки localhost/blog-yii2/frontend/web и Blog.admin для localhost/blog-yii2/backend/web
Georg Spack
Jan 24, 2017 @ 21:10:57
Корень виртуального хоста должен быть в localhost/blog-yii2/ как раз там, где лежит .htaccess
Валерий
Jan 24, 2017 @ 20:48:57
Как я понимаю, путь к css прописывается в AppAsset.php. Но странно – во frontend и в backend они прописаны одинаково
public $css = [
‘css/site.css’,
];
при этом и во frontend и backend в папках web есть папка css, в которой файл site.css. Так что я пока не понимаю, в чем дело.
Наивный вопрос – а имеет значение, что клон проекта я установил а localhost, а не в установленный Yii2-advanced?
Georg Spack
Jan 24, 2017 @ 21:12:59
>>> при этом и во frontend и backend в папках web есть папка css, в которой файл site.css. Так что я пока не понимаю, в чем дело.
>>> Наивный вопрос – а имеет значение, что клон проекта я установил а localhost, а не в установленный Yii2-advanced?
Тут я вас не понимаю о чём вы говорите – 1 проект, один виртуальный хост. Смешивать ничего не нужно.
Валерий
Jan 25, 2017 @ 09:29:13
Файл .htaccess, содержание которого я приводил ранее, лежит именно в корне виртуального хоста localhost/blog-yii2. При этом в папках frontend/web и backend/web лежат еще файлы .htaccess со след.содержанием
# Если это папка или файл, открываем его
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# В противном случае перенаправляем на index.php
RewriteRule . index.php
Эти файлы изначально были в проекте. Странно только, что blog-yii2/frontend/web нормально подгружает css/site.css и оформление нормальное, а в практически зеркальном (в части .htaccess и определения в в AppAsset.php css/site.css) blog-yii2/backend/web оформление не подгружается. Это мне вообще непонятно.
Georg Spack
Jan 25, 2017 @ 10:38:19
Корень виртуального хоста должен быть в “localhost/blog-yii2/” указывать. Вы же выше пишите, что у вас 2 виртуальных хоста настроено:
>>> Может дело в том, что я в настройках OpenServer на вкладке Домены создал записи для сокращения набора имени сайта, например Blog.Yii2 для папки localhost/blog-yii2/frontend/web и Blog.admin для localhost/blog-yii2/backend/web
Если вы 2 виртуальных хоста настраиваете, то апач уже не смотрит на то, что лежит выше этих директорий и естественно правила не будут отрабатывать.
Валерий
Jan 26, 2017 @ 10:18:35
Я поискал в интернет и нашел интересную статью – http://lavrik-v.ru/info/265/Yii2_framework_nastrojka_htaccess_kogda_sajt_ne_v_korne.html. Решил попробовать сделать как в ней написано – изменил .htaccess в корне сайта и во frontend и backend (хотя как я понимаю, эти два .htaccess можно было не менять), изменил как описано в статье main.php во frontend/config и backend/config (и еще добавил ‘language’ => ‘ru-RU’, //Язык приложения русский) – и после этого при вызове localhost/blog-yii2/frontend/web нормально грузиться пользовательская часть, а при localhost/blog-yii2/backebd/web – администраторская (и все выглядит нормально, т.е. css подгружается). При этом если в пользовательской войти как demoadmin, появляется пункт Панель управления и при его выборе нормально переходит в admin, и можно нормально вернуться, выбрав Site. Немного непонятно, почему в admin списки Категорий и Комментариев не до конца русифицированы. И еще – при просмотре Пользователя названия полей формы также не русифицированы, а поля Created At и Updated At выводятся в числовой форме, а не в виде даты и времени. Это я сам исправлю (делал при проработке других примеров). Спасибо за помощь
Georg Spack
Jan 26, 2017 @ 10:34:09
Глянул статью, корневой .htaccess точно такой же, как в репозитории, не знаю, что вы меняли. Ну да ладно – главное разобрались.
Валерий
Jan 26, 2017 @ 10:43:25
Согласен, я как начинающий, не все понимаю. Но еще изменил main.php, указав подкаталог с примером (добавил для backend ‘homeUrl’ => ‘/Blog-Yii2/admin’, и изменил ‘baseUrl’ => ‘/Blog-Yii2/admin’,). Не знаю, может дело в этом