Как организовать вывод отзывов с тегами в PageBlocks

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

Основная идея

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

Режим Менеджера



Шаг 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 будут выводиться только те отзывы, которые связаны с выбранным тегом.

Заключение


Таким образом, мы легко можем:
  • Создать отзывы с тегами
  • Гибко настраивать, какие отзывы выводить на разных страницах
  • Масштабировать систему без дублирования данных
Aleksandr Huz
29 апреля 2025, 16:50
modx.pro
319
+6
Поблагодарить автора Отправить деньги

Комментарии: 0

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0