Как установить начальное значение быстрого поиска?

где я хочу поставить начальное значение. Я видел, что в быстром поиске есть элемент «q», но я не могу получить к нему доступ, например, это не находит элемент q:

$quickSearch->getElement('q');

Как я могу получить доступ к быстрому поиску, чтобы установить начальное значение?


person mcanedo    schedule 21.02.2012    source источник


Ответы (2)


Глядя на источник этого может помочь вам узнать вещи. Agile Toolkit разработан таким образом, что разработчик должен воспользоваться знанием исходного кода.

QuickSearch является производным от Filter, который является производным от Form, поэтому где-то должен быть addField. Взглянув на QuickSearch, вы найдете его внутри функции RecallAll(). Вызовов этой функции нет, поэтому мы должны заглянуть в родительский класс — Filter.

Фильтр устанавливает хук в API для вызова функции RecallAll после завершения инициализации. Это означает, что для доступа к полю вы можете либо переопределить метод, либо добавить хук самостоятельно.

Зацепка:

$this->api->addHook('post-init',function() use($quickSearch){
    $quickSearch->getElement('q')->set('hello');
});

Расширение

class MyQuicksearch extends QuickSearch {
    function recallAll(){
        parent::recallAll();
        $this->getElement('q')->set('hello');
    }
}

Наконец, вы можете воспользоваться знанием того, откуда функция RecallAll загружает свои значения по умолчанию, и просто сделать следующее:

$quicksearch->memorize('q','hello');
person romaninsh    schedule 21.02.2012
comment
Еще раз спасибо, в итоге я использовал: if($qs-›recall('q')==''){ $qs-›memorize('q',$default); } - person mcanedo; 24.02.2012

чтобы решить эту проблему, мы должны сначала понять, как поле поиска класса QuickSearch добавляется к базовому классу Grid. поэтому после изучения исходного кода мы видим, что:

  1. Класс QuickSearch не отслеживает (и не сохраняет ссылку PUBLIC) поля Form_Field q
  2. Form_Field q ТОЛЬКО добавляется ВО ВРЕМЯ этапа рендеринга сетки.

Зная это, мы можем теперь приступить к добавлению изменений к элементу адреса № 1.

во-первых, нам нужно добавить переменную для отслеживания Form_Field q в классе QuickSearch:

 var $search_field=null; // add this line (1)
 function recallAll(){
    $ff=$this->addField('line','q','');
    $this->search_field=$ff; // and this line (2)
    parent::recallAll();
    :
    :
 }

во-вторых, чтобы обратиться к пункту № 2, на нашей странице, где определена сетка, нам нужно добавить дополнительный хук, например:

 class page_gridsearchtest extends Page {
    var $search=null;

    function init() {
       parent::init();

       $g = $this->add('MVCGrid');
       $g->setModel('Employees');
       if($g){
          $this->search=$g->addQuickSearch(array('fullname'));
          if($this->search)
             $this->api->addHook('post-init',array($this,'MyHook')); // add hook
       }
    }
    function MyHook(){ // hooked method
       if($this->search->search_field) {
          if($this->search->search_field->get()=='')
             $this->search->search_field->set('Juan'); // set initial search if blank
          $this->search->search_field->setCaption('Employee Name Search');
       }
    }
 }

это установит CAPTION рядом с полем быстрого поиска и добавит поисковый текст DEFAULT, если поле поиска пусто.

если это одноразовая вещь, то это может быть полезно в качестве быстрого исправления, потому что непосредственное внесение изменений в исходный код библиотеки очень неортодоксально и не соответствует концепции расширения и подкласса ООП, продвигаемой ATK.

person Open Technologist    schedule 21.02.2012
comment
Кстати, третий аргумент addHook — это приоритет, который может добавить хук, который будет выполняться первым, таким образом вам не нужно проверять наличие пустого значения. В противном случае - отличный ответ, вы действительно понимаете Agile Toolkit, @OT :) - person romaninsh; 22.02.2012