Филтриране на данни с помощта на ajax observefield

Опитах се да внедря филтриране на данни (списък на базата на избрана категория), използвайки падащо меню с наблюдателно поле и ajax пагинация. Използвам сесия, за да запомня избраната категория, за да запазя пагинацията.

Ето моят код (Cakephp 1.2)

С оглед :

echo $form->select('Category.id', $categories, null, array('id' => 'categories'),'Filter by Categories')
echo $ajax->observeField('categories' ,array('url' =>'update_category','update' => 'collectionDiv'));

В контролера:

if(!empty($this->data['Category']['id'])) 
{ 
    $cat_id=$this->data['Category']['id'];
    $filters=array('Collection.category_id' => $cat_id); 
    $this->set('collections', $this->paginate('Collection', $filters));
    $this->Session->write($this->name.'.$cat_id', $category_id);
}
else
{
    $cat_id=$this->Session->read($this->name.'.cat_id');
    $filters=array('Collection.category_id' => $cat_id);
    $this->set('collections', $this->paginate('Collection'));
}

Филтърът работи както исках, но проблемът е, че когато избера празна стойност („Филтър по категория), той все още помни последната сесия на категория, така че не мога да се върна към списъка по подразбиране (списък с всички записи без филтър).

Опитах се да поставя някакви условия, но пак не успях. Има ли друг начин? Моля, оценявам вашата помощ. благодаря

хермаван


person hermawan    schedule 30.10.2010    source източник


Отговори (2)


Може би не разбирам въпроса, но ми се струва, че си струва да се промени:

else
{
    $cat_id=$this->Session->read($this->name.'.cat_id');
    $filters=array('Collection.category_id' => $cat_id);
    $this->set('collections', $this->paginate('Collection'));
}

to:

else
{
    $this->set('collections', $this->paginate('Collection',array()));
}

Всъщност вашият код изглежда така или иначе прави това. Проверете какъв е URL адресът в горната част на прозореца на браузъра, след като се върне. Все още ли съдържа директиви за страниране от предишната заявка?

Може да искате да прегледате http://book.cakephp.org/view/167/AJAX-Pagination и се уверете, че сте „маркирали всички квадратчета“.

person Leo    schedule 31.10.2010
comment
благодаря за отговора. Опитах вашите съвети, но все още не работят. Да кажем, че избирам „Категория рисуване“, след което DIV променя съдържанието, както искам, но ако щракна върху номера на страницата, DIV ще съдържа всички данни, а не само „Категория рисуване“. - person hermawan; 31.10.2010
comment
Звучи ми така, сякаш ajax пагинацията не е настроена правилно, въпреки че започвам да мисля, че това може да е ограничение на пагинацията. Спомням си, че имах подобен проблем, когато промених оригиналната заявка по този начин - тя не следва на следващите страници. Реших го, като написах персонализиран метод за страници на съответния модел. Пагинирането е добро при вземане на заявка, пагиниране и колонно сортиране на резултатите. Освен това има нужда от помощ. - person Leo; 31.10.2010
comment
Благодаря на Лео, пагинацията е зададена правилно. Проблемът е, че трябва да се различаваме откъде е заявката? Когато ajax наблюдае поле, ще провери идентификатора на категорията, но ако Ajax пагинира, трябва да запомни категорията. Наблюдавам, когато ajax идва от страниране, $this-›passedArgs ще върне номера на страницата, но празен, когато се задейства от Ajax observfiled. Обяснявам моето решение. Благодаря за споделянето - person hermawan; 01.11.2010

Разбрах го, сега работи, както се надявам. Аз сам обяснявам условието и решението. Когато избера категория от падащия списък, тогава тя изобразява страницата, кодът е:

If ($this->data['Category']['id']) {
  $cat_id=$this->data['Category']['id'];
  $this->Session->write($this->name.'.category_id', $category_id);
  // I will use this session next when I click page number
  $filters=array('Collection.art_type_id' => $category_id); 
  $this->set('collections', $this->paginate('Collection', $filters));

}else{
//if clik page number, next or whatever, $this->data['Category']['id'] will empty so 
// use session to remember the category so the page will display next page or prev 
// page with the proper category, But the problem is, when I set category fillter to
// "All Category" it will dislpay last category taked from the session. To prevent it 
// I used $this->passedArgs['page']. When I clik the page paginator it will return 
// current number page, but it will be empty if we click dropdown. 

    if (!empty($this->passedArgs['page']) {
       $cat_id=$this->Session->read($this->name.'.category_id');
       $filters=array('Collection.category_id' => $cat_id);
       $this->set('collections', $this->paginate('Collection',$filters));
    }else{
       $this->set('collections', $this->paginate('Collection'));
  }
}

От този случай мисля, че наблюдателното поле няма да изпратиpassedArg, тъй като получаваме от url като от ajax връзка или html->link. Надявам се това да е полезно за някого

person hermawan    schedule 01.11.2010