Пишу в этой теме так как мне показалась наиболее подходящей. В общем на Yii пишу впервые , поэтому вопрос звучит таким образом: как создать расширенный поиск по категориям, например: в продаже имеется квартира которая находится в N-ой области N-ом городе, цена на нее лежит в пределах(пределы можно задавать), и тип валюты, все эти данные “хаваются” из базы.
Если есть темы в которых это уже описывалось, киньте урл плз. Помогите, люди добрые)
Даже на мой взгляд абсолютного новичка решение "не самое красивое".
В примере создания блога yii приводится идеальное решение для такого рода типовой задачи.
Напишу как сам понял, может кому будет интересно.
В модели определяется специальный метод:
/**
* Retrieves a list of models based on the current search/filter conditions.
* @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
*/
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('title',$this->title,true);
$criteria->compare('content',$this->content,true);
$criteria->compare('tags',$this->tags,true);
$criteria->compare('status',$this->status);
$criteria->compare('create_time',$this->create_time);
$criteria->compare('update_time',$this->update_time);
$criteria->compare('author_id',$this->author_id);
$criteria->order='update_time desc';
return new CActiveDataProvider('Post',array(
'pagination'=>array('pageSize'=>100,),
'criteria' => $criteria, // array('order' => 'update_time desc',$criteria,),
));
}
В рендируемое нужным действием контроллера представление вставляется
такой вот widget():
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'post-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'title',
'content',
'tags',
'status',
array( // display 'create_time' using an expression
'name'=>'create_time',
'value'=>'date("d.m.Y H:i:s",$data->create_time)',
),
array( // display 'update_time' using an expression
'name'=>'update_time',
'value'=>'date("d.m.Y H:i:s",$data->update_time)',
),
array( // display 'author.username' using an expression
'name'=>'author_id',
'value'=>'$data->author->username',
),
array(
'class'=>'CButtonColumn',
),
),
)); ?>
[b]Вот и все дела !
Вот эта строчка ‘filter’=>$model, обеспечивает вверху выводимой виджетом таблицы
строку с пустыми атрибутами модели. Вводите нужные значения атрибутов и фильтруйте
вывод нужных записей как душе угодно ! Для цифровых полей даже допускается перед значениями атрибутов писать реально работающие логические операторы такие как <, <= и т.д. Стоит сделать еще маленькое, но м.б. существенное замечание - в спец. методе
public function search() каждый последующий критерий поиска соединяется с предыдущим логической связкой AND, которую, при желании, можно поменять на любую лог. связку, допустимую в SQL-запросе.
Для полноты приведу действие контроллера, где происходит рендирование представления
с этим виджетом:[/b]
/**
* Manages all models.
*/
public function actionAdmin()
{
$model=new Post('search');
if(isset($_GET['Post']))
$model->attributes=$_GET['Post'];
$this->render('admin',array(
'model'=>$model,
));
}
Вообще-то, как посмотрю, доскональное изучение примера yii выводит на хороший базовый
уровень, позволяющий "не городить огород", как вот тут нам нагородили…
Может я, как новичек, чего не понял но вот в описание CListView такой пример:
$dataProvider=new CActiveDataProvider(‘Post’);
$this->widget(‘zii.widgets.CListView’, array(
'dataProvider'=>$dataProvider,
'itemView'=>'_post', // refers to the partial view named '_post'
[b]'sortableAttributes'=>array(
'title',
'create_time'=>'Post Time',[/b]
),
));
The above code first creates a data provider for the Post ActiveRecord class. It then uses CListView to display every data item as returned by the data provider. The display is done via the partial view named ‘_post’. This partial view will be rendered once for every data item. In the view, one can access the current data item via variable $data. For more details, see itemView.
In order to support sorting, one has to specify the sortableAttributes property. By doing so, a list of hyperlinks that can sort the data will be displayed.
Тут, собственно, как и для Grid, две сортировки - одна постоянная в самом dataProvider,
а другая динамическая по полям в sortableAttributes. Я пробовал, очень хорошо получается - вверху
для каждого из полей в sortableAttributes вывовдятся этакие "пипочки", при нажатие на которые происходит соответствующая сортировка. При рефреше происходит возврат к сортировке, заложенной для dataProvider.
Это параметры сортировки а не фильтрации, т.е сверху списка появляются кнопки нажимая которые можно отсортировать по цене или дате. Я написал виджет который позволяет выбирать из базы допустим определенный город или диапазон цен и показывать только эти результаты используя AJAX, т.е фильтровать результат а не сортировать его. Пример можно посмотреть [url="http://ovlix.com/ru/realestate/buy"]здесь[/url].
Над картой пока что работаю, так что скоро будет, да и автокомплит в этих полях тоже помогает пользователям будет удобно пользоваться и фильтром и картой. . Почтовый сервер i.ua проверю может блокируется у хостера. Проект пока в ранней альфе так что ошибки не исключены…