Yii2. Установка расширений через Composer
Расширения — это готовые программные пакеты, позволяющие добавлять на сайт новый функционал. Например, после установки 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