Урок 9: Виджеты и компоненты в Yii 2. Создание, настройка, примеры

В 9-ом уроке мы изучим в одну из самых мощных возможностей Yii 2, это работу с виджетами и компонентами. Если вы хотите создавать переиспользуемые блоки кода, кастомизировать интерфейсы и структурировать логику приложения, этот урок станет вашим надежным проводником. Мы разберем встроенные виджеты, научимся создавать свои, а также освоим настройку компонентов.

Что такое виджеты?

Виджеты в Yii 2 это специальные классы, которые инкапсулируют HTML-код, CSS/JS и логику для создания переиспользуемых элементов интерфейса. Представьте, что вы собираете конструктор: вместо того чтобы каждый раз писать код для меню, форм или таблиц с нуля, вы просто «вставляете» готовый блок. Это экономит время, уменьшает количество ошибок и делает код чище.

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

  • Переиспользование кода. Один раз создали, используете в любом месте проекта.
  • Упрощение шаблонов. Представления становятся чище и понятнее.
  • Инкапсуляция. Логика и стили виджета изолированы от основного кода.

Встроенные виджеты Yii 2

Yii 2 предлагает богатую коллекцию встроенных виджетов. Рассмотрим самые популярные.

1. GridView

GridView это «рабочая лошадка» для работы с таблицами данных. Он поддерживает сортировку, пагинацию, фильтрацию и даже AJAX-обновление. Вот пример использования:

php
use yii\grid\GridView;

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        'id',
        'name',
        'email:email',
        [
            'class' => 'yii\grid\ActionColumn',
            'header' => 'Действия',
        ],
    ],
]);

Здесь dataProvider это объект, предоставляющий данные (например из Active Record). Класс ActionColumn добавляет кнопки для просмотра, редактирования и удаления записей.

2. ActiveForm

ActiveForm упрощает создание форм, связанных с моделями. Он автоматически генерирует HTML-поля, добавляет валидацию и CSRF-защиту:

php
use yii\widgets\ActiveForm;

$form = ActiveForm::begin();

echo $form->field($model, 'username');
echo $form->field($model, 'password')->passwordInput();
echo Html::submitButton('Отправить');

ActiveForm::end();

3. Menu

Виджет Menu создает навигационное меню. Вы можете задавать пункты в виде массива, указывать активный элемент и настраивать стили:

php
echo Menu::widget([
    'items' => [
        ['label' => 'Главная', 'url' => ['site/index']],
        ['label' => 'О нас', 'url' => ['site/about']],
        ['label' => 'Контакты', 'url' => ['site/contact']],
    ],
]);

Совет от Максима: Изучите класс yii\bootstrap5\Widget (если используете Bootstrap), чтобы добавлять стилизованные виджеты, например, модальные окна или табы.

Создание своего виджета

Теперь создадим собственный виджет. Допустим, мы хотим выводить блок с последними статьями на сайте.

Шаг 1: Создание класса виджета

Виджеты обычно хранятся в директории widgets внутри вашего модуля или приложения. Создайте файл widgets/LastPostsWidget.php:

php
namespace app\widgets;

use yii\base\Widget;

class LastPostsWidget extends Widget
{
    public $limit = 5; // Количество статей
    
    public function init()
    {
        parent::init();
        // Инициализация параметров
    }
    
    public function run()
    {
        // Получаем последние статьи из БД
        $posts = Post::find()->orderBy('created_at DESC')->limit($this->limit)->all();
        
        // Рендерим представление виджета
        return $this->render('last-posts', [
            'posts' => $posts,
        ]);
    }
}

Шаг 2: Создание представления

В директории widgets/views создайте файл last-posts.php:

php
<div class="last-posts">
    <h3>Последние статьи</h3>
    <?php foreach ($posts as $post): ?>
        <div class="post">
            <?= Html::a($post->title, ['post/view', 'id' => $post->id]) ?>
        </div>
    <?php endforeach; ?>
</div>

Шаг 3: Использование виджета

Теперь вы можете вставить виджет в любое представление:

php
use app\widgets\LastPostsWidget;

echo LastPostsWidget::widget([
    'limit' => 3, // Меняем лимит
]);

Практическая задача: Создайте виджет «Популярные товары», который выводит товары с наибольшим количеством просмотров. Добавьте параметр для настройки лимита.

Работа с компонентами: настройка и использование

Компоненты в Yii 2 это объекты, которые предоставляют специфическую функциональность на уровне всего приложения. Например, компоненты для работы с базой данных, кэшем, почтой или API.

Настройка компонентов

Компоненты настраиваются в файле config/web.php (или common/config/main.php для расширенных приложений). Например, добавим компонент для отправки email:

php
'components' => [
    'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        'useFileTransport' => false,
        'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.example.com',
            'username' => 'user@example.com',
            'password' => 'password',
            'port' => '587',
            'encryption' => 'tls',
        ],
    ],
],

Теперь компонент доступен через Yii::$app->mailer:

php
Yii::$app->mailer->compose()
    ->setFrom('noreply@site.com')
    ->setTo($user->email)
    ->setSubject('Добро пожаловать!')
    ->send();

Создание своего компонента

Допустим, мы хотим создать компонент для работы с API. Создайте класс components/ApiClient.php:

php
namespace app\components;

use yii\base\Component;

class ApiClient extends Component
{
    public $apiKey;
    public $baseUrl;
    
    public function getData($endpoint)
    {
        // Логика запроса к API
        return 'Данные из API';
    }
}

Зарегистрируйте компонент в конфиге:

php
'components' => [
    'apiClient' => [
        'class' => 'app\components\ApiClient',
        'apiKey' => 'your-api-key',
        'baseUrl' => 'https://api.example.com',
    ],
],

Используйте его в коде:

php
$data = Yii::$app->apiClient->getData('/posts');

Практическая задача: Создайте компонент «Logger», который записывает сообщения в файл. Добавьте метод log($message).

Пример: кастомный виджет для меню сайта

Давайте создадим виджет, который генерирует меню с поддержкой Bootstrap и подсветкой активного пункта.

Класс виджета widgets/MenuWidget.php:

php
namespace app\widgets;

use yii\base\Widget;
use yii\helpers\Html;

class MenuWidget extends Widget
{
    public $items = [];
    
    public function run()
    {
        $html = '<ul class="nav navbar-nav">';
        foreach ($this->items as $item) {
            $active = $this->isItemActive($item['url']);
            $html .= '<li class="' . ($active ? 'active' : '') . '">';
            $html .= Html::a($item['label'], $item['url']);
            $html .= '</li>';
        }
        $html .= '</ul>';
        return $html;
    }
    
    private function isItemActive($url)
    {
        $currentRoute = Yii::$app->controller->route;
        return $currentRoute === $url[0];
    }
}

Использование в layout’е:

php
echo MenuWidget::widget([
    'items' => [
        ['label' => 'Главная', 'url' => ['site/index']],
        ['label' => 'Блог', 'url' => ['post/index']],
        ['label' => 'Контакты', 'url' => ['site/contact']],
    ],
]);

Что мы сделали?

  • Проверяем активный пункт меню через сравнение текущего маршрута.
  • Используем Bootstrap-классы для стилизации.
  • Передаем массив пунктов меню в виджет.

Практическая задача: Добавьте поддержку вложенных пунктов меню (dropdown).

Итоги урока

Сегодня вы научились:

  1. Использовать встроенные виджеты Yii 2.
  2. Создавать собственные виджеты для переиспользуемых элементов.
  3. Настраивать и применять компоненты.

Домашнее задание:

  1. Создайте виджет «Хлебные крошки», который отображает текущий путь на сайте.
  2. Настройте компонент для кэширования данных в Redis.
  3. Модифицируйте виджет меню, добавив иконки к пунктам (используйте FontAwesome).

Виджеты и компоненты это инструменты, которые делают разработку в Yii 2 быстрой и удобной. Если что-то не получается, пишите вопросы в комментариях.

Полный курс по Yii 2 для начинающих

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий