2

i'm facing a problem passing the correct value to the grid widget in the view. The data is being passed from jquery using ajax.

Here is the code::

$('#find-product').click(function(e) {
    e.preventDefault();


    alert($('#find-product').data("url"));


    /*
     * Make the ajax call to send the selected option to the controller for processing
     * URL : $('#find-product').data("url") , the path of the controller's action
     * Dropdown : the obejct that is passed to the controller
     * 
     * Dropdown.category : the category selected
     * Dropdown.price : the price range selected
     * 
     * 
     */

    $.ajax({
        url: $('#find-product').data("url"),
        data: {
            Dropdown: {
                category: $('#supp-category').find(":selected").text(),
                price: $('#supp-price').find(":selected").text()
            }

        },
        type: "POST",
        error: function(xhr, tStatus, e) {
            if (!xhr) {
                alert(" We have an error ");
                alert(tStatus + "   " + e.message);
            } else {
                alert("else: " + e.message); // the great unknown
            }
        },
        success: function(resp) {
            document.location.href = $('#find-product').data("url");
        }

    })
});

So i want to send the object named Dropdown to the controller action. In this case its /products/dropdown.

In the actionDropdown() i'm trying to form a CDbCriteria and passing it to CActiveDataProvider so that i may use it to render the grid.

Here is the code for the actionDropdown in the ProductsController ::

public function actionDropdown() {


    $criteria = new CDbCriteria;
    $criteria->compare('category', $_POST['Dropdown']['category'], true);

    $dataProvider = new CActiveDataProvider('Products', array(
            'criteria' => $criteria,

    ));


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



}

And here is the view, called selectproducts.

<div class="row">


        <?php
        $this->widget('bootstrap.widgets.TbGridView', array(
            'id' => 'products-grid',
            'dataProvider' => $dataProvider,

            'filter' => $dataProvider,
            'columns' => array(
                'id',
                'name',
                'category',
                'brand',
                'weight_unit',
                'price_unit',
                'flavors',
                'providers',
            ),
        ));
        ?>

    </div>

Now this is giving me an CException error. Here is the error stack trace::

    CException

CActiveDataProvider and its behaviors do not have a method or closure named "getValidators". (/var/www/html/yii/framework/base/CComponent.php:266)

#0 /var/www/html/yii/framework/web/helpers/CHtml.php(2236): CComponent->__call('getValidators', Array)
#1 /var/www/html/yii/framework/web/helpers/CHtml.php(2236): CActiveDataProvider->getValidators('id')
#2 /var/www/html/yii/framework/web/helpers/CHtml.php(1434): CHtml::activeInputField('text', Object(CActiveDataProvider), 'id', Array)
#3 /var/www/html/EasyAesthetics/protected/extensions/yiibooster/widgets/TbDataColumn.php(109): CHtml::activeTextField(Object(CActiveDataProvider), 'id', Array)
#4 /var/www/html/EasyAesthetics/protected/extensions/yiibooster/widgets/TbDataColumn.php(74): TbDataColumn->renderFilterCellContent()
#5 /var/www/html/yii/framework/zii/widgets/grid/CGridView.php(532): TbDataColumn->renderFilterCell()
#6 /var/www/html/yii/framework/zii/widgets/grid/CGridView.php(510): CGridView->renderFilter()
#7 /var/www/html/yii/framework/zii/widgets/grid/CGridView.php(480): CGridView->renderTableHeader()
#8 /var/www/html/yii/framework/zii/widgets/CBaseListView.php(167): CGridView->renderItems()
#9 [internal function]: CBaseListView->renderSection(Array)
#10 /var/www/html/yii/framework/zii/widgets/CBaseListView.php(150): preg_replace_callback('/{(\w+)}/', Array, '{summary}?{item...')
#11 /var/www/html/yii/framework/zii/widgets/CBaseListView.php(135): CBaseListView->renderContent()
#12 /var/www/html/yii/framework/web/CBaseController.php(173): CBaseListView->run()
#13 /var/www/html/EasyAesthetics/protected/views/products/selectproducts.php(37): CBaseController->widget('bootstrap.widge...', Array)
#14 /var/www/html/yii/framework/web/CBaseController.php(126): require('/var/www/html/E...')
#15 /var/www/html/yii/framework/web/CBaseController.php(95): CBaseController->renderInternal('/var/www/html/E...', Array, true)
#16 /var/www/html/yii/framework/web/CController.php(869): CBaseController->renderFile('/var/www/html/E...', Array, true)
#17 /var/www/html/yii/framework/web/CController.php(782): CController->renderPartial('selectproducts', Array, true)
#18 /var/www/html/EasyAesthetics/protected/controllers/ProductsController.php(248): CController->render('selectproducts', Array)
#19 /var/www/html/yii/framework/web/actions/CInlineAction.php(49): ProductsController->actionDropdown()
#20 /var/www/html/yii/framework/web/CController.php(308): CInlineAction->runWithParams(Array)
#21 /var/www/html/yii/framework/web/filters/CFilterChain.php(133): CController->runAction(Object(CInlineAction))
#22 /var/www/html/yii/framework/web/filters/CFilter.php(40): CFilterChain->run()
#23 /var/www/html/yii/framework/web/CController.php(1145): CFilter->filter(Object(CFilterChain))
#24 /var/www/html/yii/framework/web/filters/CInlineFilter.php(58): CController->filterAccessControl(Object(CFilterChain))
#25 /var/www/html/yii/framework/web/filters/CFilterChain.php(130): CInlineFilter->filter(Object(CFilterChain))
#26 /var/www/html/yii/framework/web/CController.php(291): CFilterChain->run()
#27 /var/www/html/yii/framework/web/CController.php(265): CController->runActionWithFilters(Object(CInlineAction), Array)
#28 /var/www/html/yii/framework/web/CWebApplication.php(282): CController->run('dropdown')
#29 /var/www/html/yii/framework/web/CWebApplication.php(141): CWebApplication->runController('products/dropdo...')
#30 /var/www/html/yii/framework/base/CApplication.php(180): CWebApplication->processRequest()
#31 /var/www/html/EasyAesthetics/index.php(13): CApplication->run()
#32 {main}

I cannot for the life of me figure out what is causing this error. Please provide any sort of help, any tip that will head me in the right direction.

Thanks, in advance. Maxx

Maxx
  • 592
  • 18
  • 42

1 Answers1

4

The problem is with filter param in TbGridView. Filter must be instance of your model, not dataprovider.

$this->widget('bootstrap.widgets.TbGridView', array(
    'id' => 'products-grid',
    'dataProvider' => $dataProvider,

    'filter' => $dataProvider->model, // Simplest way
    'columns' => array(
        'id',
        'name',
        'category',
        'brand',
        'weight_unit',
        'price_unit',
        'flavors',
        'providers',
    ),
));

Or just assign YourModel::model() as your filter param.

  • Many thanks to you, that solved the CException error. But i'm getting a new error. Its giving me Undefined index: Dropdown on line $criteria->compare('category', $_POST['Dropdown']['category'], true); Can you please provide any suggestion on how to do this correctly – Maxx Oct 11 '13 at 07:10
  • Undefined index is common mistake in php, please see this answer for reference: http://stackoverflow.com/questions/4261133/php-notice-undefined-variable-and-notice-undefined-index or ask another question as this is unrelated. –  Oct 11 '13 at 07:12