Как организовать вывод отзывов с тегами в PageBlocks
В этой инструкции я подробно расскажу, как настроить отдельные таблицы для тегов и отзывов, связать их между собой, а затем вывести отзывы на сайте по выбранным тегам. Всё будет описано как в режиме менеджера через интерфейс, так и в режиме разработки через код.
— Каждому отзыву можно привязать один или несколько тегов.
— В настройках блока указываем, какие теги использовать для фильтрации отзывов.
— На фронтенде выводим только те отзывы, у которых есть выбранные теги.


Результат:


В итоге получаем такую структуру таблицы:


Чанк review.tpl
Результат:

Для разработчиков процесс еще быстрее.
Шаг 1. Создаем таблицу тегов в MainMenu.php
Шаг 2. Создаем таблицу отзывов
Шаг 3. Создаем блок для вывода отзывов
в Resource.php:
Шаг 4. Создаем чанк reviews
Чанк создается такой же, как описан выше в режиме менеджера.
В чанке review.tpl мы добавили ссылки на отдельные страницы тегов:
Теперь настроим роутинг, чтобы при переходе по таким ссылкам показывались отзывы только с выбранным тегом.
Готово!
Теперь при переходе на страницу типа /reviews/154 будут выводиться только те отзывы, которые связаны с выбранным тегом.
Таким образом, мы легко можем:
Основная идея
— Создаем две отдельные таблицы: Теги и Отзывы.— Каждому отзыву можно привязать один или несколько тегов.
— В настройках блока указываем, какие теги использовать для фильтрации отзывов.
— На фронтенде выводим только те отзывы, у которых есть выбранные теги.
Режим Менеджера
Шаг 1. Создаем таблицу тегов
Добавляем новую таблицу с единственным полем Title:
Шаг 2. Создаем меню для тегов
Добавляем новый пункт меню для управления тегами:
Результат:

Шаг 3. Создаем таблицу отзывов
Создаем аналогичную таблицу для отзывов с полями:- Имя ($name)
- Дата ($date)
- Сообщение ($message)
- Теги ($tags — поле отношений many-to-many)

В итоге получаем такую структуру таблицы:

Шаг 4. Создаем блок Reviews
Создаем новый блок Reviews, который будет использовать нужные нам отзывы:
Шаг 5. Создаем чанк reviews
<h1>{$title}</h1>
{'!pbRelationship'|snippet: [
'relation_type' => 'many_to_many',
'primary_id' => $tags|join,
'tpl' => '@FILE chunks/review.tpl'
]}
Чанк review.tpl
<div class="card mb-3">
<div class="card-header">
{$date|date:'d.m.Y'}
</div>
<div class="card-body">
<blockquote class="blockquote mb-0">
<p>{$message}</p>
<footer class="blockquote-footer">{$name}</footer>
</blockquote>
{if $tags}
{'!pbTables'|snippet: [
'id' => $tags|join,
'tpl' => '@INLINE <a href="/reviews/{$id}" class="card-link">{$title}</a>'
]}
{/if}
</div>
</div>
Результат:

Режим Разработки
Для разработчиков процесс еще быстрее.
Шаг 1. Создаем таблицу тегов в MainMenu.php
Menu::make('Tags')
->description('Список тегов')
->parent('pageblocks')
->icon('fa-tags')
->fields([
Field::make('Tags')
->type('table')
->fields([
Field::make('Title')->required(),
])
->columns([
Column::make('Title')
])
->searchable()
]),
Шаг 2. Создаем таблицу отзывов
Menu::make('reviews')
->title('Отзывы')
->description('Список отзывов')
->icon('fa-star')
->position(1)
->parent('pageblocks')
->fields([
Field::make('reviews')
->label('Отзывы')
->type('table')
->fields([
Field::make('name')
->label('Имя')
->width(70)
->required(),
Field::make('date')
->label('Дата')
->type('date')
->width(30)
->storage('timestamp')
->dateFormat('Y-m-d, H:i')
->required()
->default(time()),
Field::make('message')
->label('Отзыв')
->type('textarea')
->height(100)
->required(),
// Создаем поле отношений многие к многим
Field::make('Tags')
->type('relationship')
->relationType('many_to_many') // тип отношения
->relatedModel(MainMenu::class) // где находиться таблица тегов
->relatedTableName('tags') // название таблицы
->displayField('title')
->valueField('id')
])
->columns([
Column::make('name')
->label('Имя')
->width(150),
Column::make('message')
->label('Отзыв'),
Column::make('date')
->label('Дата')
->width(150)
->render('date'),
])
->searchable()
]),
Шаг 3. Создаем блок для вывода отзывов
в Resource.php:
Block::make('Reviews') // автоматически устанавливается чанк reviews для блока
->fields([
Field::make('Title')
->required(),
Field::make('Tags')
->type('select')
->multiple() // можно выбрать несколько тегов
->model(\MainMenu::class) // Выбираем модель, где находиться таблица тегов
->fieldName('tags') // имя таблицы
->displayField('title')
->valueField('id')
->sortby('menuindex')
->required()
])
Шаг 4. Создаем чанк reviews
Чанк создается такой же, как описан выше в режиме менеджера.
Роутинг
В чанке review.tpl мы добавили ссылки на отдельные страницы тегов:
<a href="/reviews/154" class="card-link">Рекомендую</a>
Теперь настроим роутинг, чтобы при переходе по таким ссылкам показывались отзывы только с выбранным тегом.
Шаг 1. Создаем маршрут в web.php
use PageBlocks\App\Http\Controllers\ReviewsController;
Route::get('/reviews/{id}', [ReviewsController::class, 'index'])->where('id', '[0-9]+');
Шаг 2. Создаем контроллер ReviewsController
<?php
namespace PageBlocks\App\Http\Controllers;
class ReviewsController extends Controller
{
public function index(int $id)
{
if (!$this->modx->resource = $this->modx->getObject(\modResource::class, ['alias' => 'reviews'])) {
abort();
}
return response()->view('templates/reviews', compact('id'));
}
}
Шаг 3. Создаем шаблон reviews
Шаблон унаследуем от базового шаблона — base.tpl{extends 'templates/base.tpl'}
{block 'content'}
<div class="container">
<h1>{$modx->resource->pagetitle}</h1>
{'!pbRelationship'|snippet: [
'relation_type' => 'many_to_many',
'primary_id' => $id,
'tpl' => '@FILE chunks/review.tpl'
]}
</div>
{/block}
Готово!
Теперь при переходе на страницу типа /reviews/154 будут выводиться только те отзывы, которые связаны с выбранным тегом.
Заключение
Таким образом, мы легко можем:
- Создать отзывы с тегами
- Гибко настраивать, какие отзывы выводить на разных страницах
- Масштабировать систему без дублирования данных
Поблагодарить автора
Отправить деньги