Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Пример применения standalone actions в Yii2

Anna | 31.05.2014 | нет комментариев

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

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

Коротко, что это: вероятность сделать один раз реализацию action-а и привязывать их к произвольным контроллерам. Так базовый SiteController приложения на основе basic application template реализует два action-аs_andmk!gt;requestType) === ‘post’ && $request->isPost) ? $_POST : $_GET; $this->_filterModel->load(($this->directPopulating) ? $data : [$this->_filterModel->formName() => $data]); // Изготавливаем выборку в модели поиска $this->_filterModel->search(); // Если при поиске случилась оплошность валидации if ($this->_filterModel->hasErrors()) { /** * В зависимости от запроса решаем что делать, * если ajax то сбрасываем ошибку, напротив если входящих данных нет, очищаем ошибки */ if ($request->isAjax){ return (is_callable($this->_validationFailedCallback)) ? call_user_func($this->_validationFailedCallback, $this->_filterModel) : [ 'error' => current($this->_filterModel->getErrors()) ]; } if (empty($data)) { $this->_filterModel->clearErrors(); } } if (!($dataProvider = $this->_filterModel->getDataProvider())) { throw new base\ErrorException(‘Не проинициализирован DataProvider’); } if ($request->isAjax) { // Возвращаем правильно сформированную коллекцию объектов return [ 'list' => $this->_filterModel->buildModels(), 'pagination' => ($this->paginationAsHTML) ? LinkPager::widget([ 'pagination' => $dataProvider->getPagination() ]) : $dataProvider->getPagination() ]; } return $this->controller->render($this->view ?: $this->id, [ 'filterModel' => $this->_filterModel, 'dataProvider' => $dataProvider, 'requestType' => $this->requestType, 'directPopulating' => $this->directPopulating ]); } public function setFilterModel(FilterModelBase $model) { $this->_filterModel = $model; } public function setValidationFailedCallback(callable $callback) { $this->_validationFailedCallback = $callback; } }

Так же необходимо сделать представление по умолчанию для итога данных если это не Ajax запрос.

представление по умолчанию

<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
/**
 * @var \yii\web\View $this
 * @var \yii\data\DataProviderInterface $dataProvider
 * @var \app\modules\shop\components\FilterModelBase $filterModel
 * @var ActiveForm: $form
 * @var string $requestType
 * @var bool $directPopulating
 */

// Формируем форму для поиска по safe аттрибутам
if (($safeAttributes = $filterModel->safeAttributes())) {
    echo Html::beginTag('div', ['class' => 'well']);
    $form = ActiveForm::begin([
            'method' => $requestType
        ]);
    foreach ($safeAttributes as $attribute) {
        echo $form->field($filterModel, $attribute)->textInput([
                'name' => (!$directPopulating) ? $attribute : null
            ]);
    }
    echo Html::submitInput('search', ['class' => 'btn btn-default']).
        Html::endTag('div');
    ActiveForm::end();
}

echo \yii\grid\GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $filterModel
    ]);

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

Базовая модель поиска

Представляет собой отвлеченный класс, от которого обязаны наследоваться модели поиска передаваемые в ListAction. Реализует базу для взаимодействия модели и ListAction-а. Логика выборки реализуется в наследуемых моделях.

реализация абстрактного класса

<?php

namespace app\modules\shop\components;

use yii\base\Model;
use yii\data\DataProviderInterface;

abstract class FilterModelBase extends Model
{
    /**
     * @var DataProviderInterface
     */
    protected $_dataProvider;

    /**
     * @return DataProviderInterface
     */
    abstract public function search();

    /**
     * Приобретение итогов выборки
     * Данный способ Зачастую переобределяется моделями поиска, скажем сгруппировать в под-массивы по датам и т.д.
     * @return mixed
     */
    public function buildModels()
    {
        return $this->_dataProvider->getModels();
    }

    public function getDataProvider()
    {
        return $this->_dataProvider;
    }
}

Осталось реализовать модель поиска и прикрепить ListAction для поиска по данной модели в произвольный контроллер. В модели поиска непременным является реализация выборки данных. Всё остальное зависит требований той либо другой модели поискаrmark! “pageVar”: “page”, “forcePageVar”: true, “route”: null, “params”: null, “urlManager”: null, “validatePage”: true, “pageSize”: 20, “totalCount”: 1 } }

При ошибке валидации массив будет содержать изложение ошибки. При обыкновенном запросе (не Ajax) мы увидим примерно такое:

Для примера был сделан маленький модуль на основе basic application template. Его необходимо подключить в настройках приложения Yii2 и запустить миграцию с тестовыми данными

php yii migrate --migrationPath=modules/shop/migrations

Резюмируя всё выше сказанное, данный функционал даёт вероятность сделать единообразную реализацию выборки коллекций и всякого иного повторяющегося функционала.

Как пример из действительности, мы используем данный функционал в API, один action реализует в зависимости от запроса итог результата в JSON либо веб-интерфейс для тестирования.

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB