Это расширение предоставляет унифицированную модель поиска для YII Activerecord.
Для получения информации о лицензии проверить лицензию.
Предпочтительным способом установки этого расширения является композитор.
Либо беги
php composer.phar require --prefer-dist yii2tech/ar-search
или добавить
"yii2tech/ar-search" : " * "к разделу «Требовать» вашего Composer.json.
Это расширение предоставляет унифицированную модель поиска для YII ActiveRecord через Special Model Class - yii2techarsearchActiveSearchModel .
Эта модель способна извлечь свои атрибуты, правила проверки и логику фильтрации из модели «Slave» исходной Activerecord, указанной через yii2techarsearchActiveSearchModel::$model . Таким образом, вам не нужно объявлять отдельный класс модели для поиска и определять логику фильтра. Например:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams ); ActiveSearchModel выбирает все «безопасные» атрибуты модели «рабов» и используют их в качестве собственных атрибутов. Таким образом, вы можете использовать любой атрибут, который помечается как «безопасная» в связанной модели Activerecord в объеме этого класса. Например:
<?php
namespace appmodels;
// ActiveRecord to be searched:
class Item extends yiidb ActiveRecord
{
public function rules ()
{
return [
[[ ' name ' , ' status ' , ' price ' ], ' required ' ],
[ ' name ' , ' string ' ],
[ ' status ' , ' integer ' ],
[ ' price ' , ' number ' ],
];
}
}
use yii2techarsearch ActiveSearchModel ;
// Create search model for declared ActiveRecord:
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
// safe attributes of `Item` are inherited:
$ searchModel -> name = ' Paul ' ;
$ searchModel -> price = 10.5 ;Унаследованные атрибуты могут использоваться при составлении веб -форм, которые должны собирать данные фильтра. Например:
<?php
use yii2techarsearch ActiveSearchModel ;
use yiiwidgets ActiveForm ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
?>
<?php $ form = ActiveForm :: begin (); ?>
<?= $ form -> field ( $ model , ' name ' )-> textInput () ?>
<?= $ form -> field ( $ model , ' price ' )-> textInput () ?>
...
<?php ActiveForm :: end (); ?>Метки и подсказки атрибутов также унаследованы от модели «рабов».
Основным методом yii2techarsearchActiveSearchModel является search() . Он загружает атрибуты фильтра из заданного массива данных, подтверждает их создает экземпляр yiidataActiveDataProvider применяя собственные атрибуты в качестве условия фильтра запроса.
ActiveSearchModel использует сложную логику для фильтрации запросов на основе типов атрибутов, указанных yii2techarsearchActiveSearchModel::$searchAttributeTypes , которое извлекается из yii2techarsearchActiveSearchModel::$model yii2techarsearchActiveSearchModel::$filterOperators . По умолчанию yiidbQueryInterface::andFilterWhere() будет использоваться для композиции фильтра. Для атрибутов «строки» он будет использоваться с оператором «как». Для метода «Integer» и «float» ('Double') andFilterCompare() будет использоваться, если он доступен.
Берегись! Не злоупотребляйте использованием ActiveSearchModel . Он был разработан, чтобы охватить только самые простые случаи, когда логика поиска тривиальна. Вы всегда должны создавать разделенную модель поиска в случае, она требует сложной логики композиции поискового запроса.
Возможно, вы захотите изменить некоторые настройки поставщика данных, созданный методом search() : Изменить настройки лиц или сортировки и так далее. Вы можете сделать это через yii2techarsearchActiveSearchModel::$dataProvider . Например:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
' dataProvider ' => [
' class ' => ' yiidataActiveDataProvider ' ,
' pagination ' => [
' defaultPageSize ' => 40
],
],
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams );
echo $ dataProvider -> pagination -> defaultPageSize ; // outputs `40` Вы можете использовать yii2techarsearchActiveSearchModel::EVENT_AFTER_CREATE_QUERY событие для настройки экземпляра поискового запроса Добавление соотношения. Отношение загрузки или постоянные условия. Например:
<?php
use yii2techarsearch ActiveSearchModel ;
use yii2techarsearch ActiveSearchEvent ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
]);
$ searchModel -> on ( ActiveSearchModel :: EVENT_AFTER_CREATE_QUERY , function ( ActiveSearchEvent $ event ) {
$ event -> query
-> with ([ ' category ' ])
-> andWhere ([ ' status ' => 1 ]);
}); Вы также можете указать объект запроса непосредственно через yii2techarsearchActiveSearchModel::$dataProvider . Например:
<?php
use yii2techarsearch ActiveSearchModel ;
use yiidata ActiveDataProvider ;
use appmodels Item ;
$ searchModel = new ActiveSearchModel ([
' model ' => Item :: className (),
' dataProvider ' => function () {
$ query = Item :: find ()
-> with ([ ' category ' ])
-> andWhere ([ ' status ' => 1 ]);
return ActiveDataProvider ([ ' query ' => $ query ]);
},
]); Вы можете управлять операторами, которые будут использоваться для фильтрации запроса через yii2techarsearchActiveSearchModel::$filterOperators . Он определяет отображение между типом атрибута и оператором, который будет использоваться с yiidbQueryInterface::andFilterWhere() . Каждое значение может быть скалярным именем оператора или обратным вызовом PHP, принимая экземпляр запроса, имя атрибута и значение. Например:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
' filterOperators ' => [
ActiveSearchModel :: TYPE_STRING => ' = ' , // use strict comparison for the string attributes
ActiveSearchModel :: TYPE_INTEGER => function ( yiidb ActiveQueryInterface $ query , $ attribute , $ value ) {
if ( $ attribute === ' commentsCount ' ) {
$ query -> andHaving ([ ' commentsCount ' => $ value ]);
} else {
$ query -> andFilterWhere ([ $ attribute => $ value ]);
}
},
],
]); ActiveSearchModel позволяет фильтрации для атрибутов, используя метод andFilterCompare() запроса (например: yiidbQuery::andFilterCompare() ), что позволяет указать значение фильтра в формате: {operator}{value} (например: >10 , <=100 и т. Д.). Список имен атрибутов, для которого разрешено использование такого сравнения, контролируется yii2techarsearchActiveSearchModel::$compareAllowedAttributes . Например:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
' compareAllowedAttributes ' => [
' price ' // allow compare for ' price ' only, excluding such fields like ' categoryId ' , ' status ' and so on.
],
]); Вы можете установить compareAllowedAttributes на * , что указывает на любой атрибут Float или Integer, который будет разрешен для сравнения.
Примечание:
yii2techarsearchActiveSearchModel::$filterOperatorsполучают приоритет надyii2techarsearchActiveSearchModel::$compareAllowedAttributes.
Хотя в большинстве случаев настройка yii2techarsearchActiveSearchModel::$model - это самый быстрый способ настройки экземпляра ActiveSearchModel , он не является обязательным. Вы можете избежать настройки модели «рабов» и напрямую настраивать все свойства, связанные с поиском. Например:
<?php
use yii2techarsearch ActiveSearchModel ;
use yiidata ActiveDataProvider ;
use appmodels Item ;
$ searchModel = new ActiveSearchModel ([
' searchAttributeTypes ' => [
' id ' => ActiveSearchModel :: TYPE_INTEGER ,
' name ' => ActiveSearchModel :: TYPE_STRING ,
' price ' => ActiveSearchModel :: TYPE_FLOAT ,
],
' rules ' => [
[ ' id ' , ' integer ' ],
[ ' name ' , ' string ' ],
[ ' price ' , ' number ' ],
],
' compareAllowedAttributes ' => [],
' dataProvider ' => function () {
$ query = Item :: find ()
-> with ([ ' category ' ])
-> andWhere ([ ' status ' => 1 ]);
return ActiveDataProvider ([ ' query ' => $ query ]);
},
]);