четверг, 10 ноября 2011 г.

Строка поиска по названию товара без обновления страницы (Ajax)

Сегодня расскажу, как сделел строку поиска по названиям товара. Её можно увидеть в каталоге.

Помог мне в этом форум yiiframework.ru
И подсказаный там мануал http://www.yiiframework.com/wiki/185/clistview-ajax-filtering/

Самоу строку поиска (форму с текстовым полем для ввода и кнопкой submit) добавляю в файл Z:\home\catalog.loc\www\protected\views\assortiment\index.php

<h1>
<?
echo Yii::t('main-ui', 'Assortiments');
?>
</h1>

<?php 
echo CHtml::beginForm(CHtml::normalizeUrl(array('assortiment/index')),
'get', array('id'=>'filter-form'))
. CHtml::textField('string', (isset($_GET['string'])) ?
 $_GET['string'] : '', array('id'=>'string'))
. CHtml::submitButton('Search', array('name'=>''))
. CHtml::endForm();
Yii::app()->clientScript->registerScript('search',
"var ajaxUpdateTimeout;
var ajaxRequest;
$('input#string').keyup(function(){
ajaxRequest = $(this).serialize();
clearTimeout(ajaxUpdateTimeout);
ajaxUpdateTimeout = setTimeout(function () {
$.fn.yiiListView.update(
// this is the id of the CListView
'ajaxListView',
{
url: '" . CController::createUrl('assortiment/index') . "',
data: ajaxRequest
}
)
},
// this is the delay
300);
});"
);

Тут добавлена форма и javascript, который организует отсылку данных формы в нужное действие контроллера.

Теперь надо присланные данные обработать в контроллере в действии, которое выполняется (assortiment/index). В файле Z:\home\catalog.loc\www\protected\controllers\ AssortimentController.php в действии index (приведу это действие полностью)

/**
* Lists all models.
*/
public function actionIndex($string = '')
{
echo $string;
if(!empty($_GET['category']))
{
$criteria=new CDbCriteria(array(
'condition'=>
'(category_id=:id or cat_parent=:id) and
t.shown_'.Yii::app()->params['region'].'=1 and
category.shown_'.Yii::app()->params['region'].'=1',
'params' => array(':id'=>(int)$_GET['category']),
'with' => array('category'),
));
}         
else
{
$criteria=new CDbCriteria(array(
'condition'=>'t.shown_'.Yii::app()->params['region'].'=1
 and category.shown_'.Yii::app()->params['region'].'=1',
'with' => array('category'),                              
));   
}
//Добавлена эта часть кода:
//Просто добавляет $criteria->addSearchCondition
//Если строка $string  пришла
if( strlen( $string ) > 0 ) {
$criteria->addSearchCondition( 't.name_'.Yii::app()->language,
$string,true, 'AND' );
}
//Была добавлена эта часть кода.
$dataProvider=new CActiveDataProvider('Assortiment',array(
'criteria'=>$criteria));           
$this->render('index',array('dataProvider'=>$dataProvider,
));
}
И как бы всё работает :)
Продолжение следует.

Комментариев нет:

Отправить комментарий