2014-09-30 2 views
0

Я работаю над формой поиска, у которой есть выпадающий фильтр меню. И сайт создан Yii.Как отобразить выпадающее меню фильтра выбранного значения после отправки формы?

Моя форма фильтра выглядит следующим образом, прежде чем он представлен: PIC 1 filter form

форму при выборе фильтров: PIC 2 form while select the filters

Но после того, как я нажимаю кнопку filter он приходит снова, как это: PIC3 after form is submitted

Но я хочу, чтобы форма оставалась PIC 2 aft er Я представляю форму, когда она показывает результаты.

Моя форма:

<div class="row"> 
    <div style="float: left"> 
     <label class="form_controller required">By Brand</label> 

     <select style="width: 148px;" id="select_options" name="SCDcustomer_contacts_cms[brand_select_option]"> 
      <option value="none">Select an option</option> 
      <option value="brand_preference">Brand Preference</option> 
      <option value="brand_purchased">Brand Purchased</option> 
     </select> 
    </div> 
    <div id="select_a_brand" name="select_a_brand"> 
     <?php echo $form->dropDownList($model,'brand_id', gGetBrandList('brand_id', 'brand_id, brand_name'), array('prompt'=>'Select a brand')); ?> 
    </div> 

    <script type="text/javascript"> 
     $(document).ready(function(){ 
      jQuery('#select_a_brand').hide(); 

      $("#select_options").change(function(){ 
       $("select option:selected").each(function(){ 

        if(($(this).attr("value")=="brand_preference") || ($(this).attr("value")=="brand_purchased")){         
         $("#select_a_brand").show(); 
        } 

        if($(this).attr("value")=="none"){         
         $("#select_a_brand").hide(); 
        } 

       }); 
      }); 
     }); 
    </script> 
</div> 

функция Правила является:

public function rules() 
    { 
     return array(   
      array('scd_cust_id,cust_id,order_first_name,order_surname,order_email,order_postcode, brand_id, brand_select_option', 'safe', 'on'=>'search'), 
     ); 
    } 

Форма фильтра:

if(!empty($filter)) { 
    if ($this->brand_select_option == "brand_preference") { 
       $criteria->select .= ', COUNT(*) as brand_preference';    
       $criteria->join .= ' INNER JOIN order_table ot ON ot.billing_contactid = t.contactid'; 
       $criteria->join .= ' INNER JOIN order_item oi ON ot.scd_order_id = oi.scd_order_id';   
       $criteria->join .= ' INNER JOIN johnanthony_rstest.product p ON p.product_id = oi.product_id'; 
       $criteria->condition .= (!empty($criteria->condition) ? ' AND ' : '') . 'p.brand_id=:brand_id'; 
       $criteria->group = 't.contactid'; 
       $criteria->order = 'COUNT(*) DESC'; 
       $criteria->params = array(':brand_id'=>$this->brand_id); 
       $paging['pagination']['route']='report/index?SCDcustomer_contacts_cms[brand_id]=' . $this->brand_id;//For ajax pagination URL 
      } 

      if ($this->brand_select_option == "brand_purchased") { 
       $criteria->select .= ', SUM(product_price) AS brand_purchased';  
       $criteria->join .= ' INNER JOIN order_table ot ON ot.billing_contactid = t.contactid'; 
       $criteria->join .= ' INNER JOIN order_item oi ON ot.scd_order_id = oi.scd_order_id'; 
       $criteria->join .= ' INNER JOIN johnanthony_rstest.product p ON p.product_id = oi.product_id'; 
       $criteria->condition .= (!empty($criteria->condition) ? ' AND ' : '') . 'p.brand_id=:brand_id'; 
       $criteria->group = 't.contactid'; 
       $criteria->order = 'SUM(product_price) DESC'; 
       $criteria->params = array(':brand_id'=>$this->brand_id); 
       $paging['pagination']['route']='report/index?SCDcustomer_contacts_cms[brand_id]=' . $this->brand_id;//For ajax pagination URL 
      } 
} 

Ajax файл:

if (!empty($model->brand_id) && ($model->brand_select_option == "brand_preference")) { 
    array_push($options['columns'], array(
     'name'=>'brand_preference', 
     'filter'=>false, 
     'header'=>'Brand Preference (No of purchased items)', 
     'type'=>'raw', 
     'value'=>'$data->brand_preference', 

    )); 
} 
if (!empty($model->brand_id) && ($model->brand_select_option == "brand_purchased")) { 
    array_push($options['columns'], array(
     'name'=>'brand_purchased', 
     'filter'=>false, 
     'header'=>'Brand Purchased (Sum of purchased items)', 
     'type'=>'raw', 
     'value'=>'$data->brand_purchased', 

    )); 
} 

ответ

1

Основная проблема DOM обновляет страницу, потому что, вероятно, выполняется регулярная подача. Без метода отправки нельзя сказать ничего более конкретно. Если вы делаете ajax, вы получаете все данные в держателе данных json. Затем вы разбираете его в объект и html необходимые части, где вы хотите показать результаты. Всякая фильтрация и т. Д. Должна произойти в модели. Контроллер передает только значения.

Сделать кнопку Фильтр в ajaxButton:

<?php echo CHtml::ajaxSubmitButton(
    'Filter', 
    Yii::app()->createUrl('report/index'), 
    array(
     'type'=>'POST', 
     'data'=> 'js:{"SCDcustomer_contacts_cms[brand_select_option]": $('#select_options').val(), "SCDcustomer_contacts_cms[brand_id]": $('#select_brand').val() }', 
     'success'=>'js:function(data){ var data = JSON.parse(data); 
     $('#search-result-holder').html(data.search-results); }' 
     )); ?> 

UPDATE: 2014 - 09 - 30 Некоторые дополнительные данные для обработки.

Вы должны сделать дополнительный просмотр с помощью html, как вы хотели бы, чтобы ваши результаты выглядели. Передайте значения атрибута этому представлению через renderPartial (это должно произойти в контроллере). Например:

//Controller part which passes posted data to model 

<?php 
    public function actionIndex() { 
     .... 

     if(Yii::app()->request->isAjaxRequest){ 
      $attributes = Yii::app()->request->getParam('SCDcustomer_contacts_cms'); 
      $model->attributes = $attributes; 
     } 

    ... 
//Part of the controller which returns resulting model after specific functions 
     $model = $model->getDataByFilterQuery(); 
     $search_results = $this->renderPartial('report/extra-views/search-results', array('model'=>$model), true); 
     echo CJSON::encode(array('search-results'=>$search_results)); 
    ... 
} 

?> 

//In model 
public function brandPreference() { 
       $criteria = new CDbCriteria; 
       $criteria->select .= ', COUNT(*) as brand_preference';    
       $criteria->join .= ' INNER JOIN order_table ot ON ot.billing_contactid = t.contactid'; 
       $criteria->join .= ' INNER JOIN order_item oi ON ot.scd_order_id = oi.scd_order_id';   
       $criteria->join .= ' INNER JOIN johnanthony_rstest.product p ON p.product_id = oi.product_id'; 
       $criteria->condition .= (!empty($criteria->condition) ? ' AND ' : '') . 'p.brand_id=:brand_id'; 
       $criteria->group = 't.contactid'; 
       $criteria->order = 'COUNT(*) DESC'; 
       $criteria->params = array(':brand_id'=>$this->brand_id); 
       $paging['pagination']['route']='report/index?SCDcustomer_contacts_cms[brand_id]=' .    $this->brand_id;//For ajax pagination URL 
     return new CActiveDataProvider($this, array(
      'criteria' => $criteria, $paging 
     )); 

} 

public function brandPurchased() { 
       $criteria = new CDbCriteria; 
       $criteria->select .= ', SUM(product_price) AS brand_purchased';  
       $criteria->join .= ' INNER JOIN order_table ot ON ot.billing_contactid = t.contactid'; 
       $criteria->join .= ' INNER JOIN order_item oi ON ot.scd_order_id = oi.scd_order_id'; 
       $criteria->join .= ' INNER JOIN johnanthony_rstest.product p ON p.product_id = oi.product_id'; 
       $criteria->condition .= (!empty($criteria->condition) ? ' AND ' : '') . 'p.brand_id=:brand_id'; 
       $criteria->group = 't.contactid'; 
       $criteria->order = 'SUM(product_price) DESC'; 
       $criteria->params = array(':brand_id'=>$this->brand_id); 
       $paging['pagination']['route']='report/index?SCDcustomer_contacts_cms[brand_id]=' . $this->brand_id;//For ajax pagination URL 
     return new CActiveDataProvider($this, array(
      'criteria' => $criteria, $paging 
     )); 
} 



public function getDataByFilterQuery() { 
    if($this->brand_select_option == 'brand_preference') 
     return $this->brandPreference(); 
    elseif($this->brand_select_option == 'brand_purchased') 
     return $this->brandPurchased(); 
    else 
     return null //or whatever you want 
} 


//Search result file 
    <?php $this->widget('zii.widgets.CDetailView', array(
    'data'=>$model, 
    'attributes'=>array(
     'id', 
     'brand', 
     'product_title', 
     'description' => array(
      'name' => 'description', 
      'value' => html_entity_decode(CHtml::decode($model->description)), //this is only for example purposes 
     ), 
     'price', 
     'date', 
    ), 
));?> 

//Index file 
... 
<?php echo CHtml::ajaxSubmitButton(
    'Filter', 
    Yii::app()->createUrl('report/index'), 
    array(
     'type'=>'POST', 
     'data'=> 'js:{"SCDcustomer_contacts_cms[brand_select_option]": $('#select_options').val(), "SCDcustomer_contacts_cms[brand_id]": $('#select_brand').val() }', 
     'success'=>'js:function(data){ var data = JSON.parse(data); 
     $('#search-result-holder').html(data.search-results); }' 
     )); ?> 

... 
<div id="search-result-holder"></div> 
... 

Вы также должны изменить его специально для своего случая. И я сомневаюсь, что переменная $ paging будет работать там, как есть. Я предпочитаю использовать параметр pagination в объекте CActiveDataProvider. Во втором варианте вы можете открыть массив и в пределах этого массива открыть массив параметров разбиения на страницы. Или делайте это здесь: CPagination documentation это зависит от вас.

+0

Спасибо за это. Это должно быть решением. Но я не могу просто скопировать его и работать. Я получаю сообщение об ошибке. Я помещаю код как это в мою форму вместо кнопки: http://tinypic.com/r/2rfzy2d/8 , и я получаю эту ошибку: ' Ошибка анализа: ошибка синтаксиса, неожиданная T_CONSTANT_ENCAPSED_STRING, ожидающая ')' в /var/www/vhosts/rstest.john-anthony.com/httpdocs/protected/modules/admincms/views/report/index.php в строке 86' –

+0

Это не будет работать, как показано в примере. Прежде всего, я сомневаюсь, что у вас есть div или любой другой тег html с идентификатором # search-result-holder (это должно быть место, где вы html ваши результаты). В связи с этим вы должны возвращать html-данные, сгенерированные в контроллере или другом представлении через renderPartial («отчет/дополнительный просмотр-папка/результат поиска», массив ('model' => $ model), true); Назначить рендеринг частичной переменной и echo CJSON :: encode (array ('search-results' => $ assign_to_renderPartial_variable)); Конечно, перед этим вам необходимо передать brand_id (SCDcustomer_contacts_cms [brand_id]) в атрибуты. – juslintek

+0

Мой файл вида (httpdocs \ protected \ modules \ admincms \ views \ report \ index.php) заканчивается следующим образом: http://tinypic.com/r/dqgk1d/8 и мой файл ajax (httpdocs \ protected \ modules \ admincms \ views \ report \ _ajaxContent.php): http://www.ldjf.org/_ajaxContent.zip Посмотрите на строку # 50 –

0

Кажется, вы загружаете страницу каждый раз, когда вы нажимаете кнопку «Фильтр», если вы используете Ajax для этого события щелчка без обратной передачи или если вам нужно обновить страницу, это самый простой способ сохранить раскрывающееся меню Index's который был выбран до того, как вы сделаете кнопку события фильтра, и когда вы снова загрузите свою страницу, вы просто передадите вам выпадающее меню с индексом, которое необходимо выбрать при загрузке страницы. Я надеюсь, что это вам поможет.

+0

спасибо за это. Да. Я хочу обновить страницу, когда она отправлена, потому что показать результаты. В то же время я хочу показать выбранные фильтры.'save drop down menu Index, который был выбран до того, как вы сделаете кнопку события фильтра, и когда вы снова загрузите свою страницу, вы просто передадите вам выпадающее меню с индексом, которое нужно выбрать при загрузке страницы.' Как я могу сделайте это в соответствии с моим кодом выше. Я сбиваю с толку. –

Смежные вопросы