2013-10-12 4 views
2

У меня проблема с функциональностью фильтра в CGridview. Ящик фильтра не работает вообще. Ничего не происходит, когда я что-то печатаю и нажимаю enter.Ошибка с Cgridview 'filter' Свойство, код ошибки :: отсутствует метод 'querystring'

Вот вид кода selectproducts.php ::

<div id="shortcodes" class="page"> 
<div class="container"> 

    <!-- Title Page --> 
    <div class="row"> 
     <div class="span12"> 
      <div class="title-page"> 
       <h2 class="title">Available Products</h2> 

      </div> 
     </div> 
    </div> 
    <!-- End Title Page --> 



    <!-- Start Product Section --> 
    <div class="row"> 


     <?php 


     $this->widget('bootstrap.widgets.TbGridView', array(
      'id' => 'products-grid', 
      'dataProvider' => $dataProvider, 
      'filter' => $dataProvider->model, 
      'ajaxUpdate' => TRUE, 
      'pager' => array(
       'header' => '', 
       'cssFile' => false, 
       'maxButtonCount' => 25, 
       'selectedPageCssClass' => 'active', 
       'hiddenPageCssClass' => 'disabled', 
       'firstPageCssClass' => 'previous', 
       'lastPageCssClass' => 'next', 
       'firstPageLabel' => '<<', 
       'lastPageLabel' => '>>', 
       'prevPageLabel' => '<', 
       'nextPageLabel' => '>', 
      ), 
      'columns' => array(
       'id', 
       array(
        'name' => 'name', 

       ), 
       'category', 
       'brand', 
       'weight_unit', 
       'price_unit', 
       'flavors', 
       array(
        'name' => 'providers', 
        'value' => function($data) { 
         return '<div class="provider-label label label-info"><a href="http://www.'.$data->providers. '">'. $data->providers .'</a></div>'; 
        }, 
        'type' => 'raw', 
       ), 
      ), 
     )); 
     ?> 

    </div> 
    <!-- End Product Section --> 


</div> 

Вот соответствующее действие в ProductsController, что делает этот вид. Переменная $ dataprovider в представлении представляет собой объект CActiveDataProvider, который содержит результат условного запроса.

public function actionDropdown() { 

    if (isset($_GET["Dropdown"])) { 
     $dropdownData = $_GET["Dropdown"]; 
     $this->category = $dropdownData["category"]; 
     $this->price = $dropdownData["price"]; 
    } 
    // separate the price text into min and max value 
    $priceText = explode(" - ", $this->price); 



    $criteria = new CDbCriteria; 
    $criteria->compare('category', $this->category, true); 

    $criteria->addBetweenCondition('price', substr($priceText[0], 1), substr($priceText[1], 1), 'AND'); 

    $dataProvider = new CActiveDataProvider('Products', array(
     'criteria' => $criteria, 
     'pagination' => array(
      'pageSize' => 20, 
     ), 
     'sort' => array(
      'defaultOrder' => 'price_unit, name', 
     ), 
    )); 


    $this->render('selectproducts', array(
     'dataProvider' => $dataProvider, 
     'criteria' => $criteria, 
    )); 
} 

А вот Продукция() модель поиск() функция ::

public function search() 
    { 
      // @todo Please modify the following code to remove attributes that should not be searched. 

      $criteria=new CDbCriteria; 

      $criteria->compare('id',$this->id); 
      $criteria->compare('name',$this->name,true); 
      $criteria->compare('category',$this->category,true); 
      $criteria->compare('brand',$this->brand,true); 
      $criteria->compare('weight',$this->weight,true); 
      $criteria->compare('weight_unit',$this->weight_unit,true); 
      $criteria->compare('price',$this->price,true); 
      $criteria->compare('price_unit',$this->price_unit,true); 
      $criteria->compare('flavors',$this->flavors,true); 
      $criteria->compare('providers',$this->providers,true); 

      return new CActiveDataProvider($this, array(
        'criteria'=>$criteria, 
      )); 
    } 

Теперь, когда я попал ввести в поле фильтра, я получаю эту ошибку, которая регистрируется в firebug

TypeError: $.param.querystring is not a function 
[Break On This Error] 

options.url = $.param.querystring(options.url, options.data); 

In file jquery.yiigridview.js 

Кто-нибудь знает, что вызывает эту ошибку. Я просто не могу понять, что вызывает это. И я также не знаю, какую модификацию я должен сделать в jquery.yiigridview.js, чтобы исправить эту ошибку.

Заранее спасибо. Maxx

РЕДАКТИРОВАТЬ

После того, как предложение от tinyByte ниже. Я попытался переместить логику CActiveDataProvider в модель, так что я могу использовать $ model-> search() в свойстве dataProvider GridView, но это не помогло по-прежнему той же ошибке.

Вот коды

контроллер :::

public function actionDropdown() { 

    $dataProvider = new Products; 

    if (isset($_GET["Dropdown"])) { 
     $dropdownData = $_GET["Dropdown"]; 
     $this->category = $dropdownData["category"]; 
     $this->price = $dropdownData["price"]; 
    } 


    $this->render('selectproducts', array(
     'dataProvider' => $dataProvider, 
     'category' => $this->category, 
     'price' => $this->price, 
     //'num' => $this->numResults, 
    )); 
} 

Вот модель ::

public function searchDropdown($category, $price) { 

    $this->priceText = explode(" - ", $price); 

    $this->criteria = new CDbCriteria; 
    $this->criteria->compare('category', $category, true); 

    $this->criteria->addBetweenCondition('price', substr($this->priceText[0], 1), substr($this->priceText[1], 1), 'AND'); 

    return new CActiveDataProvider('Products', array(
     'criteria' => $this->criteria, 
     'pagination' => array(
      'pageSize' => 25, 
     ), 
     'sort' => array(
      'defaultOrder' => 'price_unit, name', 
     ), 
    )); 



} 

А вот вид ::

<div id="shortcodes" class="page"> 
<div class="container"> 

    <!-- Title Page --> 
    <div class="row"> 
     <div class="span12"> 
      <div class="title-page"> 
       <h2 class="title">Available Products</h2> 

      </div> 
     </div> 
    </div> 
    <!-- End Title Page --> 



    <!-- Start Product Section --> 
    <div class="row"> 


     <?php 


     $this->widget('bootstrap.widgets.TbGridView', array(
      'id' => 'products-grid', 
      'dataProvider' => $dataProvider->searchDropdown($category, $price), 
      'filter' => $dataProvider, 
      'ajaxUpdate' => TRUE, 
      'pager' => array(
       'header' => '', 
       'cssFile' => false, 
       'maxButtonCount' => 25, 
       'selectedPageCssClass' => 'active', 
       'hiddenPageCssClass' => 'disabled', 
       'firstPageCssClass' => 'previous', 
       'lastPageCssClass' => 'next', 
       'firstPageLabel' => '<<', 
       'lastPageLabel' => '>>', 
       'prevPageLabel' => '<', 
       'nextPageLabel' => '>', 
      ), 
      'columns' => array(
       array(
        'name' => 'id', 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'name', 


       ), 
       'category', 
       'brand', 
       'weight_unit', 
       'price_unit', 
       'flavors', 
       array(
        'name' => 'providers', 
        'value' => function($data) { 
         return '<div class="provider-label label label-info"><a href="http://www.'.$data->providers. '">'. $data->providers .'</a></div>'; 
        }, 
        'type' => 'raw', 
       ), 
      ), 
     )); 
     ?> 

    </div> 
    <!-- End Product Section --> 


</div> 

Еще не работает. Т.е. ничего не происходит, когда я ввожу что-то в поле фильтра и нажимаю enter. Та же ошибка возникает ::

В Firebug

TypeError: $.param.querystring is not a function 
[Break On This Error] 

options.url = $.param.querystring(options.url, options.data); 

In file jquery.yiigridview.js 

И в Chrome я получаю сообщение немного более описательные ошибок.

Uncaught TypeError: Object function (e,n){var r,i=[],o=function(e,t) 

{t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&& 

x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)}); 
else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")} 

has no method 'querystring' 

jquery.yiigridview.js:310 

Я просто не могу понять, что делать.

EDIT

Ok после долгой борьбы я как-то удалось избавиться от ошибки, с помощью форума помощника собрата на Yii форуме http://www.yiiframework.com/forum/index.php/topic/47904-error-with-cgridview-filter-property-error-code-has-no-method-querystring/page_view_findpost_p_224169.

Вот что я добавил.

<script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.ba-bbq.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.jquery.ajaxqueue.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.autocomplete.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.bgiframe.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.maskedinput.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.metadata.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.treeview.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.treeview.async.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.treeview.edit.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.yii.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.yiiactiveform.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/jquery.yiitab.js"></script> 
    <script src="<?php echo Yii::app()->assetManager->baseUrl; ?>/28e7347b/punycode.js"></script> 

Ошибка исчезла, но фильтр все еще не работает. Значок загрузки ajax отображается менее секунды, а затем ничего не происходит. Я также вижу правильный параметр поиска, который передается в массиве.

Вот массив, который я вижу передается

Dropdown[category] Chant Books 
Dropdown[price] $340 - $476 
Products[brand] 
Products[category] 
Products[flavors] 
Products[name] Owl Chant Scroll 
Products[price_unit]  
Products[providers] 
Products[weight_unit] 
Products_page 1 
ajax products-grid 
yt0 
+0

Так кто-нибудь знает, как это исправить. Я буквально застрял в этом. – Maxx

ответ

1

Попробуйте этот код

$this->widget('bootstrap.widgets.TbGridView', array(
      'id' => 'products-grid', 
      'dataProvider' => $model->customeSearch(), // add your method of search here 
      'filter' => $model, // for validation 
      'ajaxUrl'=> Yii::app()->request->getUrl(), 
      ... 
+0

Да, теперь это работает. Спасибо – Maxx

0

Атрибут фильтра для проверки, необходимо предоставить функцию поиска для атрибута «DataProvider» вашей сетки

$this->widget('bootstrap.widgets.TbGridView', array(
     'id' => 'products-grid', 
     'dataProvider' => $model->customeSearch(), // add your method of search here 
     'filter' => $model, // for validation 
     ... 
     'columns' => array(
      array(
       'name' => 'someCol', 
       'value' => '$data->someCol', 
       'filter' => CHtml::dropdownList(...), // put an input here for your filter 
      ), 

),

+0

Привет, Спасибо за вашу помощь. Я попытался применить ваши советы, но все равно дал мне ту же ошибку. Ознакомьтесь с приведенным выше изменением. Я думаю, что это как-то связано с javascript-файлом jquery.yiigridview.js. Но я не могу понять, какую модификацию я должен сделать с этим файлом, чтобы исправить это. – Maxx

0

Ну, наконец, проблема решена. Оказалось, что мне нужно добавить свойство ajaxUpdate и ajaxURL виджета Gridview. И сделайте еще одно действие для фильтра ajax.

'ajaxUpdate' => 'products-grid', 
      'ajaxUrl' => Yii::app()->createUrl('products/UpdateGrid'), 

В любом случае, вот код, который работает сейчас.

методы действий в контроллере продукции ::

public function actionDropdown() { 

    /* 
    * create the session to store the dropdown variables 
    * 
    * 
    */ 

    $this->session = new CHttpSession; 
    $this->session->open(); 

    $dataProvider = new Products; 
    $products = new Products('search'); 
    $products->unsetAttributes(); 

    if (isset($_GET["Dropdown"])) { 
     $dropdownData = $_GET["Dropdown"]; 
     $this->category = $dropdownData["category"]; 
     $this->price = $dropdownData["price"]; 

     $this->session["category"] = $this->category; 
     $this->session["price"] = $this->price; 
    } 

    if (isset($_GET["Products"])) { 
     $products->attributes = $_GET["Products"]; 
    } 

    $this->render('selectproducts', array(
     'dataProvider' => $dataProvider, 
     'products' => $products, 
     'category' => $this->category, 
     'price' => $this->price, 
      //'num' => $this->numResults, 
    )); 
} 

public function actionUpdateGrid() { 

    $products = new Products; 

    $products->unsetAttributes(); 


    if (isset($_GET["Products"])) { 
     $products->attributes = $_GET["Products"]; 

    } 




    $this->renderPartial('_selectproducts', array(
     'products' => $products, 
     'category' => $this->category, 
     'price' => $this->price, 

    )); 

} 

Модель Код продукта ::

/** 
* Retrieves a list of models based on the current search/filter conditions. 
* 
* Typical usecase: 
* - Initialize the model fields with values from filter form. 
* - Execute this method to get CActiveDataProvider instance which will filter 
* models according to data in model fields. 
* - Pass data provider to CGridView, CListView or any similar widget. 
* 
* @return CActiveDataProvider the data provider that can return the models 
* based on the search/filter conditions. 
*/ 
public function search() { 
    // @todo Please modify the following code to remove attributes that should not be searched. 

    $criteria = new CDbCriteria; 

    $criteria->compare('id', $this->id); 
    $criteria->compare('name', $this->name, true); 
    $criteria->compare('category', $this->category, true); 
    $criteria->compare('brand', $this->brand, true); 
    $criteria->compare('weight', $this->weight, true); 
    $criteria->compare('weight_unit', $this->weight_unit, true); 
    $criteria->compare('price', $this->price, true); 
    $criteria->compare('price_unit', $this->price_unit, true); 
    $criteria->compare('flavors', $this->flavors, true); 
    $criteria->compare('providers', $this->providers, true); 




    return new CActiveDataProvider($this, array(
     'criteria' => $criteria, 
    )); 
} 

/** 
* Returns the static model of the specified AR class. 
* Please note that you should have this exact method in all your CActiveRecord descendants! 
* @param string $className active record class name. 
* @return Products the static model class 
*/ 
public static function model($className = __CLASS__) { 
    return parent::model($className); 
} 

/* 
* Dropdown search 
* 
* 
*/ 

public function searchDropdown($category, $price) { 

    $this->priceText = explode(" - ", $price); 

    $this->criteria = new CDbCriteria; 
    $this->criteria->compare('category', $category, true); 

    $this->criteria->addBetweenCondition('price', substr($this->priceText[0], 1), substr($this->priceText[1], 1), 'AND'); 

    return new CActiveDataProvider('Products', array(
     'criteria' => $this->criteria, 
     'pagination' => array(
      'pageSize' => 25, 
     ), 
     'sort' => array(
      'defaultOrder' => 'price_unit, name', 
     ), 
    )); 
} 

public function searchGrid() { 

    $session = new CHttpSession; 
    $session->open(); 


    $category = $session["category"]; 


    $this->criteria = new CDbCriteria; 

    $this->priceText = explode(" - ", $session["price"]); 
    $this->criteria->compare('category', $category, true); 

    $this->criteria->addBetweenCondition('price', substr($this->priceText[0], 1), substr($this->priceText[1], 1), 'AND'); 

    /* 
    * 
    * compare the names to see if the flavor or weight is present 
    * 
    */ 

    $this->criteria->compare('name', $this->flavors, TRUE); 
    $this->criteria->compare('name', $this->weight, TRUE); 

    $this->criteria->compare('id', $this->id); 
    $this->criteria->compare('name', $this->name, true); 
    $this->criteria->compare('category', $this->category, true); 
    $this->criteria->compare('brand', $this->brand, true); 
    $this->criteria->compare('weight', $this->weight, true); 
    $this->criteria->compare('weight_unit', $this->weight_unit, true); 
    $this->criteria->compare('price', $this->price, true); 
    $this->criteria->compare('price_unit', $this->price_unit, true); 
    $this->criteria->compare('flavors', $this->flavors, true); 
    $this->criteria->compare('providers', $this->providers, true); 


    return new CActiveDataProvider($this, array(
     'criteria' => $this->criteria, 
     'pagination' => array(
      'pageSize' => 25, 
     ), 
     'sort' => array(
      'defaultOrder' => 'price_unit, name', 
     ), 
    )); 

} 

И мнения ::

имя вида :: - selectproducts.php

<div id="shortcodes" class="page"> 
<div class="container"> 

    <!-- Title Page --> 
    <div class="row"> 
     <div class="span12"> 
      <div class="title-page"> 
       <h2 class="title">Available Products</h2> 

      </div> 
     </div> 
    </div> 
    <!-- End Title Page --> 



    <!-- Start Product Section --> 
    <div class="row"> 


     <?php 
     $this->widget('bootstrap.widgets.TbGridView', array(
      'id' => 'products-grid', 
      'dataProvider' => $dataProvider->searchDropdown($category, $price), 
      'filter' => $products, 
      'ajaxUpdate' => 'products-grid', 
      'ajaxUrl' => Yii::app()->createUrl('products/UpdateGrid'), 
      'pager' => array(
       'header' => '', 
       'cssFile' => false, 
       'maxButtonCount' => 25, 
       'selectedPageCssClass' => 'active', 
       'hiddenPageCssClass' => 'disabled', 
       'firstPageCssClass' => 'previous', 
       'lastPageCssClass' => 'next', 
       'firstPageLabel' => '<<', 
       'lastPageLabel' => '>>', 
       'prevPageLabel' => '<', 
       'nextPageLabel' => '>', 
      ), 
      'columns' => array(
       array(
        'name' => 'name', 
        'value' => function($data) { 
         return '<div class="custom-badge">' . $data->name . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'category', 
        'value' => function($data) { 
         return '<div class="grid-glow">' . $data->category . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'brand', 
        'value' => function($data) { 
         return '<div class="grid-glow">' . $data->brand . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'weight_unit', 
        'value' => function($data) { 
         return '<div class="grid-glow">' . $data->weight_unit . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'price_unit', 
        'value' => function($data) { 
         return '<div class="grid-price-glow">' . $data->price_unit . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'flavors', 
        'value' => function($data) { 
         return '<div class="grid-glow">' . $data->flavors . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'providers', 
        'value' => function($data) { 
         return '<div class="provider-label label label-info"><a href="http://www.' . $data->providers . '">' . $data->providers . '</a></div>'; 
        }, 
        'type' => 'raw', 
       ), 
      ), 
     )); 
     ?> 

    </div> 
    <!-- End Product Section --> 


</div> 

имя вида :: - _selectproducts.php

<?php 

     $this->widget('bootstrap.widgets.TbGridView', array(
      'id' => 'products-grid', 
      'dataProvider' => $products->searchGrid($category, $price), 
      'filter' => $products, 
      'ajaxUpdate' => TRUE, 
      'pager' => array(
       'header' => '', 
       'cssFile' => false, 
       'maxButtonCount' => 25, 
       'selectedPageCssClass' => 'active', 
       'hiddenPageCssClass' => 'disabled', 
       'firstPageCssClass' => 'previous', 
       'lastPageCssClass' => 'next', 
       'firstPageLabel' => '<<', 
       'lastPageLabel' => '>>', 
       'prevPageLabel' => '<', 
       'nextPageLabel' => '>', 
      ), 
      'columns' => array(
       array(
        'name' => 'name', 
        'value' => function($data) { 
         return '<div class="custom-badge">' . $data->name . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'category', 
        'value' => function($data) { 
         return '<div class="grid-glow">' . $data->category . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'brand', 
        'value' => function($data) { 
         return '<div class="grid-glow">' . $data->brand . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'weight_unit', 
        'value' => function($data) { 
         return '<div class="grid-glow">' . $data->weight_unit . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'price_unit', 
        'value' => function($data) { 
         return '<div class="grid-price-glow">' . $data->price_unit . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'flavors', 
        'value' => function($data) { 
         return '<div class="grid-glow">' . $data->flavors . '</div>'; 
        }, 
        'type' => 'raw', 
       ), 
       array(
        'name' => 'providers', 
        'value' => function($data) { 
         return '<div class="provider-label label label-info"><a href="http://www.' . $data->providers . '">' . $data->providers . '</a></div>'; 
        }, 
        'type' => 'raw', 
       ), 
      ), 
     )); 
     ?> 

Ну как вы видите Аякса фильтр нужен новый способ действий, который будет оказывать частичный вид, содержащий только результат сетки. Я надеюсь, что это поможет кому-то, кто застрял с той же ошибкой.

Спасибо, Maxx

2

Из моего опыта, причиной этой ошибки является JQuery конфликт: есть один вы загружаете, а другой один нагружен cgridview. Решение удалить ваш JQuery, или если вы должны иметь его - удалить Yii одно:

$cs=Yii::app()->clientScript; 
$cs->scriptMap=array(
    'jquery.js'=>false, 
); 
+0

Спасибо. Я также добавил '$ cs-> coreScriptPosition = CClientScript :: POS_END;' после этого, потому что в противном случае была ошибка в скрипте из-за загрузки jQuery после загрузки плагина, поэтому jQuery не был определен. – ivkremer

0

Refresh YII файлы расслоение плотной.В конфигурации:

'components'=>array(

    'clientScript' => array(
     'packages' => array(
      'jquery' => array(
       'baseUrl' => 'js', 
       'js' => array(
        'jquery-1.10.2.js', 
        'jquery-migrate-1.2.1.min.js', 
       ) 
      ), 
     ), 
    ), 

)

0

TypeError: $.param.querystring is not a function

[Перерыв на этой ошибке]

options.url = $.param.querystring(options.url, options.data);

В файле jquery.yiigridview.js

Я также столкнулся с той же проблемой сообщалось выше, и это очень легко разрешить. Обычно это происходит, когда jQuery, который вы включили, конфликтует с по умолчанию js, добавленным jquery.yiigridview.js.

Попробуйте удалить min.js, который вы включили, это будет работать абсолютно нормально.

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