Сортировка и разбиение на страницы не работают после создания пользовательского поиска по ключевым словам, построенного с использованием реляционных таблиц - PullRequest
1 голос
/ 21 марта 2010

Я недавно начал создавать пользовательский поиск по ключевым словам, используя Yii 1.1.x

Поиск работает на 100%. Но как только я сортирую столбцы и использую нумерацию страниц в представлении администратора, поиск теряется и все результаты отображаются. Таким образом, с другими словами он не фильтруется, поэтому отображаются только результаты поиска. Каким-то образом это сбрасывает его.

В моем контроллере мой код выглядит следующим образом

$builder=Messages::model()->getCommandBuilder();

        //Table1 Columns
        $columns1=array('0'=>'id','1'=>'to','2'=>'from','3'=>'message','4'=>'error_code','5'=>'date_send');

        //Table 2 Columns
        $columns2=array('0'=>'username');

        //building the Keywords
        $keywords = explode(' ',$_REQUEST['search']);
        $count=0;
        foreach($keywords as $key){
            $kw[$count]=$key;
            ++$count;
        }   

        $keywords=$kw;

        $condition1=$builder->createSearchCondition(Messages::model()->tableName(),$columns1,$keywords,$prefix='t.');
        $condition2=$builder->createSearchCondition(Users::model()->tableName(),$columns2,$keywords);
        $condition = substr($condition1,0,-1) . " OR ".substr($condition2,1);
        $condition = str_replace('AND','OR',$condition);


$dataProvider=new CActiveDataProvider('Messages', array(
                'pagination'=>array(
                    'pageSize'=>self::PAGE_SIZE,
                ),
                'criteria'=>array(
                    'with'=>'users',
                    'together'=>true,
                    'joinType'=>'LEFT JOIN',
                    'condition'=>$condition,
                ),

                'sort'=>$sort,
            ));

$this->render('admin',array(
            'dataProvider'=>$dataProvider,'keywords'=>implode(' ',$keywords),'sort'=>$sort
        ));

и мой взгляд выглядит так

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        'id',
        array(
            'name'=>'user_id',
            'value'=>'CHtml::encode(Users::model()->getReseller($data->user_id))',
            'visible'=>Yii::app()->user->checkAccess('poweradministrator')
        ),
        'to',
        'from',
        'message',
        /*
        'date_send',
        */
        array(
            'name'=>'error_code',
            'value'=>'CHtml::encode($data->status($data->error_code))',
        ),
        array(
            'class'=>'CButtonColumn',
            'template'=>'{view} {delete}',
        ),


    ),

));

Я действительно не знаю, что мне теперь делать, так как я ужасно потерян, любая помощь будет высоко оценена

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Вы можете установить пользовательское состояние для ваших критериев поиска и проверять состояние каждый раз, когда контроллер загружает ваше представление.

Что-то вроде

if(isset($_REQUEST['search'])){
    $keywords = explode(' ',$_REQUEST['search']);
    Yii::app()->user->setState('keywords',$keywords);
}
else if(Yii::app()->user->hasState('keywords')){
    $keywords=Yii::app()->user->getState('keywords');
}

Недостатком здесь является то, что состояние ключевых слов будет поддерживаться на протяжении всей сессии.

0 голосов
/ 21 марта 2010

, поэтому мне не нравятся эти рамки. В сыром PHP я сделал бы это с помощью $link=http_build_query($_GET);, а затем использовал бы эту ссылку для разбивки на страницы и сортировки. Но вы должны найти способ сделать то же самое, используя вашу базовую идеологию. Могу поспорить, у них есть пример для такой обычной задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...