рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдХреНрд░рд┐рдпрд╛рдПрдВ Yii2 рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ

рд╕рд╛рдЗрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рд╣реЛрддрд╛ рд╣реИред рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирдореВрдирд╛, рдкреГрд╖реНрда рдкрд░ рдЕрдВрдХ рд▓рдЧрд╛рдирд╛ред рд╣рд░ рдмрд╛рд░, рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЙрдмрд╛рдК рд╣реИред рдЬрдм рдЬрд┐рддрдиреА рдмрд╛рд░ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдиреА рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдПрдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рдЖрд▓реЗрдЦ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЧрд╛ рдХрд┐ рд╡рд╛рдИрдЖрдИ 2 рдврд╛рдВрдЪреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдПрдХ рд╕рдорд╛рди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рдХрд┐ рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╣реИ : рдПрдХ рдмрд╛рд░ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдордирдорд╛рдиреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рд╕реЗ рдмрд╛рдВрдзрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рддреЛ рдмреБрдирд┐рдпрд╛рджреА рд╕рд╛рдЗрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░ рдмреЗрд╕рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдФрд░ рдХреИрдкреНрдЪрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:

рд╕рд╛рдЗрдЯрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛
<?php namespace app\controllers; use Yii; use yii\web\Controller; class SiteController extends Controller { public function actions() { return [ 'error' => [ 'class' => 'yii\web\ErrorAction', ], 'captcha' => [ 'class' => 'yii\captcha\CaptchaAction', 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null, ], ]; } } 



рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?

  1. ListAction - рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдХрд╛рд░реНрд░рд╡рд╛рдИ , рдкреНрд░рд╢реНрдиреЛрдВ рдФрд░ рдЦреЛрдЬ рдореЙрдбрд▓ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
  2. DataProvider - рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рдПрдХ рдкрд░рдд, рдкреЗрдЬ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЫрдБрдЯрд╛рдИред
  3. рдЦреЛрдЬ рдореЙрдбрд▓ - рдПрдХ рдЦреЛрдЬ рдореЙрдбрд▓ рдЬреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╡рд╛рдВрдЫрд┐рдд рдХреНрд╡реЗрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдЯрд╛рдкреНрд░реЛрдЗрдб рдХреЛ рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрдирд╛рддрд╛ рд╣реИред

рдЕрдВрддрд┐рдо рджреЛ рдЪреАрдЬреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдорд╛рдирдХ рдЬреАрдЖрдИрдЖрдИ рдЙрддреНрдкрдиреНрди рд╕реАрдЖрд░рдпреВрдбреА рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдирдореВрдиреЗ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмреЗрдорд╛рдиреА рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдПрдЖрд░ рдореЙрдбрд▓ рдореЗрдВ рд╕реНрд╡рдпрдВ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ yii1 рдореЗрдВ рдерд╛)ред рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдЕрд▓рдЧ рд╣реЛрдирд╛ рдФрд░ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рдорд┐рд▓рддрд╛ рд╣реИред

ListAction рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдпрд╣ рд░рди рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╕рдордп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрдЧ yii \ base \ Action рд╕реЗ рд╡рд╛рд░рд┐рд╕ рд╣реЛрддрд╛ рд╣реИред рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдмрд╛рдзреНрдп рдХрд░рддреЗ рд╕рдордп, рдЙрд╕рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ, рд╣рдо рдЖрдзрд╛рд░ рд╕рд╛рд░ рд╡рд░реНрдЧ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджрд┐рдП рдЧрдП рдЦреЛрдЬ рдореЙрдбрд▓ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдХрд╕реНрдЯрдо рджреГрд╢реНрдп, рдбреЗрдЯрд╛ рдбрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛, рдкреГрд╖реНрда рдкрд░ рдЕрдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛, рдЖрджрд┐ред

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 <?php namespace app\modules\shop\actions; use Yii; use yii\base; use yii\web\Response; use app\modules\shop\components\FilterModelBase; use yii\widgets\LinkPager; class ListAction extends base\Action { /** *   * @var FilterModelBase */ protected $_filterModel; /** * -        * @var callable */ protected $_validationFailedCallback; /** *     , *  true,        - eg $_GET/$_POST[SearchModel][attribute] * @var bool */ public $directPopulating = true; /** *   ,  true,     html , *   AJAX  * @var bool */ public $paginationAsHTML = false; /** *   * @var string */ public $requestType = 'get'; /** *    * @var string */ public $view = '@app/modules/shop/views/list/index'; public function run() { if (!$this->_filterModel) { throw new base\ErrorException('   '); } $request = Yii::$app->request; if ($request->isAjax) { Yii::$app->response->format = Response::FORMAT_JSON; } //   $data = (strtolower($this->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; } } 


рдпрджрд┐ рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рджреГрд╢реНрдп рднреА рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рджреГрд╢реНрдп
 <?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 рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдирдореВрдирд╛ рддрд░реНрдХ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдореЙрдбрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 <?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 рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЦреЛрдЬ рдореЙрдбрд▓ рдореЗрдВ, рдбреЗрдЯрд╛ рдирдореВрдирд╛рдХрд░рдг рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИред рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЦреЛрдЬ рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ - рд╕рддреНрдпрд╛рдкрди, рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рддрд░реНрдХ, рдЖрджрд┐ред

рдбреЗрдЯрд╛ рдХрдВрдкреЛрдЬрд┐рд╢рди рд▓реЙрдЬрд┐рдХ рдмрд┐рд▓реНрдбрдореЙрдбрд▓ рдореЗрдердб рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реЛрддрд╛ рд╣реИред

рдиреАрдЪреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рдж рдЦреЛрдЬ рдореЙрдбрд▓ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

рдЦреЛрдЬ рдореЙрдбрд▓
 <?php namespace app\modules\shop\models\search; use app\modules\shop; use yii\data\ActiveDataProvider; use yii\data\Pagination; class ProductSearch extends shop\components\FilterModelBase { /** *     */ public $price; public $page_size = 20; /** *    * @return array */ public function rules() { return [ //   ['price', 'required'], //  ,       ['page_size', 'integer', 'integerOnly' => true, 'min' => 1] ]; } /** *    * @return ActiveDataProvider|\yii\data\DataProviderInterface */ public function search() { //        $query = shop\models\Product::find() ->with('categories'); /** *  DataProvider,   ,   */ $this->_dataProvider = new ActiveDataProvider([ 'query' => $query, 'pagination' => new Pagination([ 'pageSize' => $this->page_size ]) ]); //   ,    if ($this->validate()) { $query->where('price <= :price', [':price' => $this->price]); } return $this->_dataProvider; } /** *    , *     *   . * @return array|mixed */ public function buildModels() { $result = []; /** * @var shop\models\Product $product */ foreach ($this->_dataProvider->getModels() as $product) { $result[] = array_merge($product->getAttributes(), [ 'categories' => $product->categories ]); } return $result; } } 


рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП ListAction рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдФрд░ рдЙрддреНрдкрд╛рдж рдЦреЛрдЬ рдореЙрдбрд▓ рдХреЛ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:

рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рдХреА рд╕реНрдерд╛рдкрдирд╛
 <?php namespace app\modules\shop\controllers; use yii\web\Controller; use app\modules\shop\actions\ListAction; use app\modules\shop\models\search\ProductSearch; class ProductController extends Controller { public function actions() { return [ 'index' => [ 'class' => ListAction::className(), 'filterModel' => new ProductSearch(), 'directPopulating' => false, ] ]; } } 


рдЕрдЬрд╛рдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░, рд╣рдореЗрдВ JSON рдЗрд╕ рддрд░рд╣ рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ:

рдирдореВрдирд╛ рд▓реЗрдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо
 { "list": [ { "id": "7", "price": "50", "title": "product title #7", "description": "product description #7", "create_time": "0", "update_time": "0", "categories": [ { "id": "1", "title": "category title #1", "description": "category description #1", "create_time": "0", "update_time": "0" } ] } ], "pagination": { "pageVar": "page", "forcePageVar": true, "route": null, "params": null, "urlManager": null, "validatePage": true, "pageSize": 20, "totalCount": 1 } } 


рдпрджрд┐ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рд╕рд░рдгреА рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрдЧрд╛ред рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрдиреБрд░реЛрдз (рдЕрдЬрд╛рдХреНрд╕ рдирд╣реАрдВ) рдХреЗ рд╕рд╛рде рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦреЗрдВрдЧреЗ:



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореВрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдкрдХреЛ рдЗрд╕реЗ Yii2 рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

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


рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЪрдпрди рдФрд░ рдПрдХ рдЕрдиреНрдп рджреЛрд╣рд░рд╛рдИ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреА рд╣реИред

рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдкреАрдЖрдИ рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЕрдиреБрд░реЛрдз рдХреЗ рдЖрдзрд╛рд░ рдкрд░, JSON рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред

Source: https://habr.com/ru/post/In208556/


All Articles