Yii2. Установка расширений через Composer

10.04.2019

Теги: ComposerYii2ВиджетТеорияУстановкаФреймворк

Расширения — это готовые программные пакеты, позволяющие добавлять на сайт новый функционал. Например, после установки Yii2, доступно расширение Debug, представляющее из себя удобную панель в нижней части страницы. В ней можно смотреть различную отладочную информацию: запросы к БД, переменные окружения и многое другое. Есть удобный модуль Gii, позволяющий генерировать типовой код.

Использование сторонних расширений для фреймворка — достаточно простая процедура. Все, что необходимо сделать — это установить расширение через Composer и при необходимости настроить его по инструкции. После чего расширение готово к работе.

Найти расширения можно на официальном сайте Yii2, в разделе «Extensions». Давайте установим расширение JUI — это набор виджетов jQuery UI, представленных в качестве виджетов Yii2.

Для этого переходим в директорию проекта и выполняем команду:

> cd work/localhost25/www
> composer require --prefer-dist yiisoft/yii2-jui
Using version ^2.0 for yiisoft/yii2-jui
./composer.json has been updated
The "extra.asset-installer-paths" option is deprecated, use the "config.fxp-asset.installer-paths" option
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
  - Installing bower-asset/jquery-ui (1.12.1): Downloading (100%)
  - Installing yiisoft/yii2-jui (2.0.7): Downloading (100%)
Package yiisoft/yii2-codeception is abandoned, you should avoid using it. Use codeception/codeception instead.
Writing lock file
Generating autoload files

Если получено предупреждение

The "extra.asset-installer-paths" option is deprecated, use the "config.fxp-asset.installer-paths" option

надо заменить в composer.json секцию

"asset-installer-paths": {
    "npm-asset-library": "vendor/npm",
    "bower-asset-library": "vendor/bower"
}

на

"config": {
    "fxp-asset": {
        "installer-paths": {
            "npm-asset-library": "vendor/npm",
            "bower-asset-library": "vendor/bower"
        }
    }
}

Теперь можно использовать его где-нибудь в view-шаблоне:

echo DatePicker::widget([
    'model' => $model,
    'attribute' => 'added',
    'dateFormat' => 'php:d.m.Y',
]);

Давайте создадим форму обратной связи и используем виджет DatePicker для создания поля, позволяющего выбрать дату рождения. Данные формы сохраняются в таблицу базы данных.

<?php
namespace app\models;

use yii\db\ActiveRecord;

/**
 * Модель для формы обратной связи
 */
class Feedback extends ActiveRecord
{
    public function attributeLabels() {
        return [
            'name' => 'Ваше имя',
            'email' => 'Ваш email',
            'birthday' => 'День рождения',
            'body' => 'Сообщение',
        ];
    }

    public function rules() {
        return [
            // удалить пробелы для всех полей
            [['name', 'email', 'birthday', 'body'], 'trim'],
            // поле name обязательно для заполнения
            ['name', 'required', 'message' => 'Поле «Ваше имя» обязательно для заполнения'],
            // поле email обязательно для заполнения
            ['email', 'required', 'message' => 'Поле «Ваш email» обязательно для заполнения'],
            // поле email должно быть корректным адресом почты
            ['email', 'email', 'message' => 'Поле «Ваш email» должно быть адресом почты'],
            // поле birthday должно быть датой
            [
                'birthday',
                'date',
                'format' => 'php:d.m.Y',
                'message' => 'Поле «День рождения» должно быть датой'
            ],
            // поле body обязательно для заполнения
            ['body', 'required', 'message' => 'Поле «Сообщение» обязательно для заполнения'],
        ];
    }

    public function beforeSave($insert) {
        if (parent::beforeSave($insert)) {
            // преобразуем формат даты для записи в БД: 01.02.1970 -> 1970-02-01
            if ($this->birthday !== null) {
                $tmp = explode('.', $this->birthday);
                $this->birthday = $tmp[2].'-'.$tmp[1].'-'.$tmp[0];
            }
            return true;
        }
        return false;
    }
}
<?php
namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\Feedback;

class PageController extends Controller {
    public function actionIndex() {
        return $this->render('index');
    }

    public function actionFeedback()
    {
        $model = new Feedback();
        // если пришли post-данные...
        if ($model->load(Yii::$app->request->post())) {
            // ...проверяем и сохраняем эти данные
            if ($model->save()) {
                // данные прошли валидацию, отмечаем этот факт
                Yii::$app->session->setFlash(
                    'success',
                    true
                );
                // перезагружаем страницу, чтобы избежать повтороной отправки формы
                return $this->refresh();
            } else {
                // данные не прошли валидацию, отмечаем этот факт
                Yii::$app->session->setFlash(
                    'success',
                    false
                );
                // не перезагружаем страницу, чтобы сохранить пользовательские данные
            }
        }
        return $this->render('feedback', ['model' => $model]);
    }
}
<?php
/* @var $this yii\web\View */

use yii\widgets\ActiveForm;
use yii\helpers\Html;
use yii\jui\DatePicker;

$this->title = 'Обратная связь';
?>

<?php if (Yii::$app->session->hasFlash('success')): ?>
    <?php if (Yii::$app->session->getFlash('success')): ?>
        <p>Данные формы были успешно отправлены</p>
    <?php else: ?>
        <p>Допущены ошибки при заполнении формы</p>
    <?php endif; ?>
<?php endif; ?>

<div class="page-feedback">
    <h1><?= Html::encode($this->title) ?></h1>

    <?php $form = ActiveForm::begin(['id' => 'feedback-form', 'options' => ['novalidate' => '']]); ?>
        <?= $form->field($model, 'name')->textInput(); ?>
        <?= $form->field($model, 'email')->textInput(); ?>
        <?=
        $form->field($model, 'birthday')->textInput()->widget(
            DatePicker::class,
            [
                'dateFormat' => 'php:d.m.Y',
                'options' => [
                    'autocomplete'=>'off'
                ],
                'clientOptions' => [
                    'changeMonth' => true,
                    'changeYear' => true,
                    // период с 1950 года по (настоящее-10лет)
                    'yearRange' => '1950:-10',
                ]
            ]
        );
        ?>
        <?= $form->field($model, 'body')->textarea(['rows' => 5]); ?>
        <?= Html::submitButton('Отправить', ['class' => 'btn btn-primary']); ?>
    <?php ActiveForm::end(); ?>
</div>
CREATE TABLE `feedback` (
    `id` int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'Уникальный идентификатор',
    `name` varchar(100) NOT NULL COMMENT 'Имя автора сообщения',
    `email` varchar(100) NOT NULL COMMENT 'Почта автора сообщения',
    `birthday` date DEFAULT NULL COMMENT 'День рождения автора сообщения',
    `body` text NOT NULL COMMENT 'Текст сообщения'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Дополнительно

Поиск: Composer • Yii2 • Виджет • Установка • Фреймворк • Расширение • Extension • jQuery UI • DatePicker

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.