|
Фильтр является частным случаем формы, поэтому он обладает ее возможностями, настроенными специальным образом:
- Отображение управляющих элементов фильтра (поле ввода, календарь, выпадающий список)
- Отправка введенных данных (фильтрация элементов компоненты табличного списка)
Создание формы
Компонента формы поддерживает следующие возможности:
- Класс контроллера, наследуемый от AMI_ModFilter
- Класс отображения, наследуемый от AMI_ModFilterView
- Класс модели, наследуемый от AMI_Filter (следует обратить внимание, что фильтр не работает с моделью элемента – у фильтра своя специфическая модель)
Пример классов компонент фильтра:
class AmiSample_FilterAdm extends AMI_ModFilter{
}
class AmiSample_Filter extends AMI_Filter{
public function __construct(){
$this->addViewField(
array(
'name' => 'nickname',
'type' => 'input',
'flt_type' => 'text',
'flt_default' => '',
'flt_condition' => 'like',
'flt_column' => 'nickname'
)
);
}
}
class AmiSample_FilterView extends AMI_ModFilterView{
public function __construct(){
parent::__construct();
$this->addPlaceholders(array('nickname' => 'datefrom.before'));
}
protected function getModLocalePath(){
return '_local/plugins_distr/' . $this->getModId() . '/templates/filter.lng';
}
}
Описание методов, использованных в примере, будет приведено ниже.
Определение списка и порядка полей
Для добавления поля фильтра необходимо использовать метод addViewField. Пример:
$this->addViewField(
array(
'name' => 'nickname',
'type' => 'input',
'flt_type' => 'text',
'flt_default' => '',
'flt_condition' => 'like',
'flt_column' => 'nickname'
)
);
Параметром метода является ассоциативный массив. В зависимости от типа добавляемого поля, необходимо указывать различные элементы в массиве.
Общие параметры:
| Ключ | Значение | Комментарий |
| name | Строка | Название поля |
| type | input, checkbox, datetime, date, select, radio, hidden | Тип поля |
flt_type | static, hidden, text, date, select, radio, submit, button, checkbox, subcats_search, flagmap, Vsplitter, Hsplitter, Sblock, Fblock, search, sql, timestamp, numeric | Тип обработки поля |
| value | Строка | Текущее значение |
| flt_default | Строка | Значение по умолчанию |
| flt_condition | like|=|<=|>= | Условие фильтрации |
| flt_column | Строка | Название поля модели, по которому идет фильтрация |
| html | Строка | HTML код элемента управления |
Порядок элементов формы задается при помощи формирования позиций элементов (ссылка на раздел про позиции в компоненте списка), аналогично заданию порядка столбцов в табличном списке.
При добавлении поля создается позиция элемента. Если параметр position не указан явно, то позиция элемента добавляется там, где происходило последнее добавление элементов.
Для создания собственного элемента управления, необходимо передать значение html в массиве параметров. Пример:
$this->addField(array('name' => 'my_ctrl', 'html' => $ctrlHtml));
Примеры реализации
Задача. Есть модель, содержащая 3 свойства: id, nickname, birth. Необходимо создать классы компонента фильтра, отображающих 3 эти поля: nickname – поле ввода (фильтрация по значению), birth – 2 поля календаря (от – до).
class AmiSample_FilterAdm extends AMI_ModFilter{
}
class AmiSample_Filter extends AMI_Filter{
public function __construct(){
$this->addViewField(
array(
'name' => 'nickname',
'type' => 'input',
'flt_type' => 'text',
'flt_default' => '',
'flt_condition' => 'like',
'flt_column' => 'nickname'
)
);
$this->addViewField(
array(
'name' => 'datefrom',
'type' => 'datefrom',
'flt_type' => 'date',
'flt_default' => AMI_Lib_Date::formatUnixTime(AMI_Lib_Date::UTIME_MIN),
'flt_condition' => '>=',
'flt_column' => 'birth'
)
);
$this->addViewField(
array(
'name' => 'dateto',
'type' => 'dateto',
'flt_type' => 'date',
'flt_default' => AMI_Lib_Date::formatUnixTime(AMI_Lib_Date::UTIME_MAX),
'flt_condition' => '<',
'flt_column' => 'birth'
)
);
}
}
class AmiSample_FilterView extends AMI_ModFilterView{
public function __construct(){
parent::__construct();
// Add admin filter form placeholder for nickname
$this->addPlaceholders(array('nickname' => 'datefrom.before'));
}
protected function getModLocalePath(){
return '_local/plugins_distr/' . $this->getModId() . '/templates/filter.lng';
}
}
Подробное описание логики работы примера в более сложном виде описано в главе «Пример реализации плагина».
|