Base.Kladdr.GetKladdrListAutocomplete
Тут вроде бы все понятно - ''/int/controls/kladdr/list/autocomplete/'' ссылается на экшн ''Base.Kladdr.GetKladdrListAutocomplete'' (который мы опишем далее).
===== actions.xml =====
Добавим GetKladdrListAutocomplete в группу autocomplete.
../../Kladdr.Common/actions/controls/GetObjectsAutocomplete
'Kladdr'
array()
array( BaseFactory::CustomSql => KladdrUtility::GetTitleCustomSql( Request::getString( "q" ) ) )
array('label' => 'GetName', 'title' => 'GetName', 'id' => 'kladdrId')
Где GetObjectsAutocomplete - стандатный экшн, который должен быть у вас в пакете 'Kladdr'
|Название класса, по которому мы хотим искать((по сути, он должен называться Class, но так исторически сложилось, надо поправить))|
|goa_Search|array( "statusId" => 1 )
|Поисковый массив, который мы будем передавать в array( BaseFactory::CustomSql => KladdrUtility::GetTitleCustomSql( Request::getString( "q" ) ) )
|Массив с опциями, который передается в array('label' => 'GetName', 'title' => 'GetName', 'id' => 'kladdrId')
|Элемент массива, который будет преобразован в JSON отправлен в Response|
Здесь GetName() - это метод у класса Kladdr, c помощью которого выводится полный путь до деревни или города, обычно хватает поля title.
===== GetAction =====
В GetKladdrListAction нам нужно получить объект из поисковой формы и отправить его в Response для того, чтобы там его отобразить. Помним, что ищем мы по ''parentKladdrId''
protected function beforeAction() {
// get autocomplete objects
if( !empty( $this->search['parentKladdrId'] ) ) {
$searchParentKladdr = KladdrFactory::GetById( $this->search['parentKladdrId'] );
Response::setParameter( 'searchParentKladdr', $searchParentKladdr );
}
}
===== index.tmpl.php ======
В шаблон списка нужно добавить html-код в форму поиска и javascript для инициализации контрола.
Поисковая форма
= FormHelper::FormInput( '', !empty( $searchParentKladdr ) ? $searchParentKladdr->GetName() : '', 'parentKladdr-autocomplete', 'autocomplete', array( 'size' => 40 ) ); ?>
= FormHelper::FormHidden( 'search[parentKladdrId]', $search['parentKladdrId'], 'parentKladdr-value' ); ?>
Где-то внизу
===== SaveAction =====
Идея такая же, как и в GetAction, только у нас есть объект на форме.
protected function beforeSave() {
// Set Parent Kladdr Object for AutoComplete
if( !empty( $this->currentObject->parentKladdrId ) ) {
$this->currentObject->parentKladdr = KladdrFactory::GetById( $this->currentObject->parentKladdrId, array()
, array( BaseFactory::WithoutDisabled => true )
);
}
}
На самом деле этот код можно не писать, но тут он нужен для того, чтобы получить зависимые объекты для функции GetName(). Если используете обычные поля, то эту часть можно упустить.
===== data.tmpl.php =====
Шаблон для добавления и редактирования данных
Поля объекта
= FormHelper::FormInput( '', !empty( $object->parentKladdr ) ? $object->parentKladdr->GetName() : '', 'parentKladdr-autocomplete', 'autocomplete', array( 'size' => 40 ) ); ?>
= FormHelper::FormHidden( $prefix . '[parentKladdrId]', $object->parentKladdrId, 'parentKladdr-value' ); ?>
Где-то внизу