Организация поиска

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
vitto2
Сообщения: 2
Зарегистрирован: 2013.08.03, 22:52

Организация поиска

Сообщение vitto2 »

Я в Yii новичок. Хочу реализовать поиск. Искать буду с помощью sphinx. Пользователь передаёт данные контроллеру. Как правильно организовать поиск в Yii? Вот пример поиска из статьи:

Код: Выделить всё

public function actionSearch()
    {
        if(isset($_GET['q'])&&(trim($_GET['q']) !== '')) {
            $searchCriteria = new stdClass();
            $posts_paginator = new CPagination();
            $posts_paginator->pageSize = Yii::app()->params['postsPerPage'];
            $searchCriteria->select = 'id';
            $searchCriteria->query = htmlspecialchars($_GET['q']);
            $searchCriteria->paginator = $posts_paginator;
            $searchCriteria->from = 'postIndex';
            $resArray = Yii::App()->search->searchRaw($searchCriteria);
            $finded = array();
            foreach($resArray['matches'] as $key=>$somefinded) {
                $finded[] = $key;
            }
            if (count($finded) > 0) {
                $findedPosts = implode(',',$finded);
            }
        } 
        if (isset($findedPosts)) {
            $criteria=new CDbCriteria(array(
                'condition'=>'status='.Post::STATUS_PUBLISHED. ' AND id in ('.$findedPosts.')',
                'order'=>'update_time DESC',
                'with'=>'commentCount',
            ));
        } else {
            $criteria=new CDbCriteria(array(
                'condition'=>'status='.Post::STATUS_PUBLISHED.' AND id=0', # always not found
            ));
        } 
        if(isset($_GET['tag']))
            $criteria->addSearchCondition('tags',$_GET['tag']); 
        $dataProvider=new CActiveDataProvider('Post', array(
            'pagination'=>array(
                'pageSize'=>Yii::app()->params['postsPerPage'],
            ),
            'criteria'=>$criteria,
        )); 
        $this->render('index',array(
            'dataProvider'=>$dataProvider
        ));
    } 
Тут только один запрос, а у меня будет много данных из форм вроде дополнительных аттрибутов. По этому метод action тогда выйдет огромный. Лучше всё это дело засунуть в модель? Какая модель должна быть тогда? Посоветуйте правильный подход. Плюс выдача результата будет по типу гугла, подходит под это дело dataProvider или нужно сделать как то по другому?
vtec
Сообщения: 49
Зарегистрирован: 2010.11.16, 10:28

Re: Организация поиска

Сообщение vtec »

Чтобы темы не флудить напишу здесь, подскажите как сделать форму для поиска, чтобы в контроллер пришел GET в таком виде http://site/blog/?q=блаблабла, а не http://site/blog/?Blog[q]=блаблабла&Blog[yt0]=Найти
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Организация поиска

Сообщение yiijeka »

У кнопки submit убрать name
vtec
Сообщения: 49
Зарегистрирован: 2010.11.16, 10:28

Re: Организация поиска

Сообщение vtec »

А это: Blog[q]?
Нужно чтобы осталось просто q=блаблабла
HQ0
Сообщения: 182
Зарегистрирован: 2012.10.17, 17:21

Re: Организация поиска

Сообщение HQ0 »

name теперь не у кнопки сменить, а у инпут:текста :)
vtec
Сообщения: 49
Зарегистрирован: 2010.11.16, 10:28

Re: Организация поиска

Сообщение vtec »

Проблема решилась с помощью Chtml::beginForm

Но появилась новая проблема. Генерируется hidden input.
Ладно если бы он генерировался, так он еще и плодится. То есть, если я нажимаю кнопку найти, то url такой http://site/blog/?q=text, нажимаю на нее второй раз получаю http://site/blog/?q=text&q=text и т.д и при этом инпутов все больше становится.

Что я делаю не так?
Форма:

Код: Выделить всё

<?php
echo CHtml::beginForm('','get');
echo CHtml::textField('q',isset($_GET['q'])?$_GET['q']:'');
echo CHtml::submitButton('Найти',array('name'=>'','class'=>'btn'));
echo CHtml::endForm();
?>
vtec
Сообщения: 49
Зарегистрирован: 2010.11.16, 10:28

Re: Организация поиска

Сообщение vtec »

Всем спасибо, проблема решилась добавление CHtml::beginForm(Yii::app()->createUrl('blog/index'),'get');
Ответить