under22
چهارشنبه 14 اسفند 1392, 14:43 عصر
من با ویجت CGridView داده ها رو از مدل با استفاده از متد search میگیرم که در متد search کد های من به این شکل است .
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('description',$this->description,true);
$criteria->with = array('categoreis');
$criteria->compare('categoreis.name',$this->categoreis_search, true);
$criteria->compare('price',$this->price);
$criteria->compare('pic',$this->pic,true);
$criteria->compare('count',$this->count);
$criteria->compare('create_date',$this->create_date,true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort'=>array(
'attributes'=>array(
'categoreis_search'=>array(
'asc'=>'categoreis.name',
'desc'=>'categoreis.name DESC',
),
'*',
),
),
'pagination'=>array(
'pageSize'=>5,
),
)
);
}
و داخل ویو هم کد های من به این شکل است
<?php
Yii::app()->clientScript->registerScript('search', "
$('.search-button').click(function(){
$('.search-form').toggle();
return false;
});
$('.search-form form').submit(function(){
$('#product-grid').yiiGridView('update', {
data: $(this).serialize()
});
return false;
});
");
?>
<h1>Manage Products</h1>
<p>
You may optionally enter a comparison operator (<b><</b>, <b><=</b>, <b>></b>, <b>>=</b>, <b><></b>
or <b>=</b>) at the beginning of each of your search values to specify how the comparison should be done.
</p>
<?php echo CHtml::link('Advanced Search','#',array('class'=>'search-button')); ?>
<div class="search-form" style="display:none">
<?php
$this->renderPartial('_search',array(
'model'=>$model,
)); ?>
</div><!-- search-form -->
<?php
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'product-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'name',
'description',
'price',
'pic',
'count',
'create_date',
array('header'=>'categories','name' => 'categoreis_search', 'value' => '$data->categoreis->name'),
array(
'class'=>'CButtonColumn',
),
),
));
?>
و داخل کنترلر
public function actionIndex()
{
$model=new Product('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['Product']))
$model->attributes=$_GET['Product'];
$this->render('index',array(
'model'=>$model
));
}
وقتی در داخل cgridview سرچ رو بر اساس فیلدی که خودم اضافه کردم انجام میدم به درستی کار میکنه ولی وقتی سرچ رو بر اساس فیلد های دیگه انجام میدم این error رو به من میده
Error 500: <h1>CDbException</h1>
<p>CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous. The SQL statement executed was: SELECT COUNT(DISTINCT `t`.`id`) FROM `tbl_product` `t` LEFT OUTER JOIN `tbl_categoreis` `categoreis` ON (`t`.`categoreis_id`=`categoreis`.`id`) WHERE (id=:ycp0) (C:\xampp\htdocs\yii\framework\db\CDbCommand.php:5 43)</p><pre>#0 C:\xampp\htdocs\yii\framework\db\CDbCommand.php(43 3): CDbCommand->queryInternal('fetchColumn', 0, Array)
#1 C:\xampp\htdocs\yii\framework\db\ar\CActiveFinder. php(759): CDbCommand->queryScalar()
#2 C:\xampp\htdocs\yii\framework\db\ar\CActiveFinder. php(151): CJoinElement->count(Object(CDbCriteria))
#3 C:\xampp\htdocs\yii\framework\db\ar\CActiveRecord. php(1605): CActiveFinder->count(Object(CDbCriteria))
#4 C:\xampp\htdocs\yii\framework\web\CActiveDataProvi der.php(228): CActiveRecord->count(Object(CDbCriteria))
#5 C:\xampp\htdocs\yii\framework\web\CDataProvider.ph p(224): CActiveDataProvider->calculateTotalItemCount()
#6 C:\xampp\htdocs\yii\framework\web\CActiveDataProvi der.php(178): CDataProvider->getTotalItemCount()
#7 C:\xampp\htdocs\yii\framework\web\CDataProvider.ph p(168): CActiveDataProvider->fetchData()
#8 C:\xampp\htdocs\yii\framework\zii\widgets\CBaseLis tView.php(111): CDataProvider->getData()
#9 C:\xampp\htdocs\yii\framework\zii\widgets\grid\CGr idView.php(339): CBaseListView->init()
#10 C:\xampp\htdocs\yii\framework\web\CBaseController. php(147): CGridView->init()
#11 C:\xampp\htdocs\yii\framework\web\CBaseController. php(172): CBaseController->createWidget('zii.widgets.gri...', Array)
#12 C:\xampp\htdocs\test\protected\views\site\index.ph p(52): CBaseController->widget('zii.widgets.gri...', Array)
#13 C:\xampp\htdocs\yii\framework\web\CBaseController. php(126): require('C:\xampp\htdocs...')
#14 C:\xampp\htdocs\yii\framework\web\CBaseController. php(95): CBaseController->renderInternal('C:\xampp\htdocs...', Array, true)
#15 C:\xampp\htdocs\yii\framework\web\CController.php( 869): CBaseController->renderFile('C:\xampp\htdocs...', Array, true)
#16 C:\xampp\htdocs\yii\framework\web\CController.php( 782): CController->renderPartial('index', Array, true)
#17 C:\xampp\htdocs\test\protected\controllers\SiteCon troller.php(37): CController->render('index', Array)
#18 C:\xampp\htdocs\yii\framework\web\actions\CInlineA ction.php(49): SiteController->actionIndex()
#19 C:\xampp\htdocs\yii\framework\web\CController.php( 308): CInlineAction->runWithParams(Array)
#20 C:\xampp\htdocs\yii\framework\web\CController.php( 286): CController->runAction(Object(CInlineAction))
#21 C:\xampp\htdocs\yii\framework\web\CController.php( 265): CController->runActionWithFilters(Object(CInlineAction), Array)
#22 C:\xampp\htdocs\yii\framework\web\CWebApplication. php(282): CController->run('')
#23 C:\xampp\htdocs\yii\framework\web\CWebApplication. php(141): CWebApplication->runController('site')
#24 C:\xampp\htdocs\yii\framework\base\CApplication.ph p(180): CWebApplication->processRequest()
#25 C:\xampp\htdocs\test\index.php(13): CApplication->run()
#26 {main}</pre>
میشه کمک کنید
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('description',$this->description,true);
$criteria->with = array('categoreis');
$criteria->compare('categoreis.name',$this->categoreis_search, true);
$criteria->compare('price',$this->price);
$criteria->compare('pic',$this->pic,true);
$criteria->compare('count',$this->count);
$criteria->compare('create_date',$this->create_date,true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort'=>array(
'attributes'=>array(
'categoreis_search'=>array(
'asc'=>'categoreis.name',
'desc'=>'categoreis.name DESC',
),
'*',
),
),
'pagination'=>array(
'pageSize'=>5,
),
)
);
}
و داخل ویو هم کد های من به این شکل است
<?php
Yii::app()->clientScript->registerScript('search', "
$('.search-button').click(function(){
$('.search-form').toggle();
return false;
});
$('.search-form form').submit(function(){
$('#product-grid').yiiGridView('update', {
data: $(this).serialize()
});
return false;
});
");
?>
<h1>Manage Products</h1>
<p>
You may optionally enter a comparison operator (<b><</b>, <b><=</b>, <b>></b>, <b>>=</b>, <b><></b>
or <b>=</b>) at the beginning of each of your search values to specify how the comparison should be done.
</p>
<?php echo CHtml::link('Advanced Search','#',array('class'=>'search-button')); ?>
<div class="search-form" style="display:none">
<?php
$this->renderPartial('_search',array(
'model'=>$model,
)); ?>
</div><!-- search-form -->
<?php
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'product-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'name',
'description',
'price',
'pic',
'count',
'create_date',
array('header'=>'categories','name' => 'categoreis_search', 'value' => '$data->categoreis->name'),
array(
'class'=>'CButtonColumn',
),
),
));
?>
و داخل کنترلر
public function actionIndex()
{
$model=new Product('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['Product']))
$model->attributes=$_GET['Product'];
$this->render('index',array(
'model'=>$model
));
}
وقتی در داخل cgridview سرچ رو بر اساس فیلدی که خودم اضافه کردم انجام میدم به درستی کار میکنه ولی وقتی سرچ رو بر اساس فیلد های دیگه انجام میدم این error رو به من میده
Error 500: <h1>CDbException</h1>
<p>CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous. The SQL statement executed was: SELECT COUNT(DISTINCT `t`.`id`) FROM `tbl_product` `t` LEFT OUTER JOIN `tbl_categoreis` `categoreis` ON (`t`.`categoreis_id`=`categoreis`.`id`) WHERE (id=:ycp0) (C:\xampp\htdocs\yii\framework\db\CDbCommand.php:5 43)</p><pre>#0 C:\xampp\htdocs\yii\framework\db\CDbCommand.php(43 3): CDbCommand->queryInternal('fetchColumn', 0, Array)
#1 C:\xampp\htdocs\yii\framework\db\ar\CActiveFinder. php(759): CDbCommand->queryScalar()
#2 C:\xampp\htdocs\yii\framework\db\ar\CActiveFinder. php(151): CJoinElement->count(Object(CDbCriteria))
#3 C:\xampp\htdocs\yii\framework\db\ar\CActiveRecord. php(1605): CActiveFinder->count(Object(CDbCriteria))
#4 C:\xampp\htdocs\yii\framework\web\CActiveDataProvi der.php(228): CActiveRecord->count(Object(CDbCriteria))
#5 C:\xampp\htdocs\yii\framework\web\CDataProvider.ph p(224): CActiveDataProvider->calculateTotalItemCount()
#6 C:\xampp\htdocs\yii\framework\web\CActiveDataProvi der.php(178): CDataProvider->getTotalItemCount()
#7 C:\xampp\htdocs\yii\framework\web\CDataProvider.ph p(168): CActiveDataProvider->fetchData()
#8 C:\xampp\htdocs\yii\framework\zii\widgets\CBaseLis tView.php(111): CDataProvider->getData()
#9 C:\xampp\htdocs\yii\framework\zii\widgets\grid\CGr idView.php(339): CBaseListView->init()
#10 C:\xampp\htdocs\yii\framework\web\CBaseController. php(147): CGridView->init()
#11 C:\xampp\htdocs\yii\framework\web\CBaseController. php(172): CBaseController->createWidget('zii.widgets.gri...', Array)
#12 C:\xampp\htdocs\test\protected\views\site\index.ph p(52): CBaseController->widget('zii.widgets.gri...', Array)
#13 C:\xampp\htdocs\yii\framework\web\CBaseController. php(126): require('C:\xampp\htdocs...')
#14 C:\xampp\htdocs\yii\framework\web\CBaseController. php(95): CBaseController->renderInternal('C:\xampp\htdocs...', Array, true)
#15 C:\xampp\htdocs\yii\framework\web\CController.php( 869): CBaseController->renderFile('C:\xampp\htdocs...', Array, true)
#16 C:\xampp\htdocs\yii\framework\web\CController.php( 782): CController->renderPartial('index', Array, true)
#17 C:\xampp\htdocs\test\protected\controllers\SiteCon troller.php(37): CController->render('index', Array)
#18 C:\xampp\htdocs\yii\framework\web\actions\CInlineA ction.php(49): SiteController->actionIndex()
#19 C:\xampp\htdocs\yii\framework\web\CController.php( 308): CInlineAction->runWithParams(Array)
#20 C:\xampp\htdocs\yii\framework\web\CController.php( 286): CController->runAction(Object(CInlineAction))
#21 C:\xampp\htdocs\yii\framework\web\CController.php( 265): CController->runActionWithFilters(Object(CInlineAction), Array)
#22 C:\xampp\htdocs\yii\framework\web\CWebApplication. php(282): CController->run('')
#23 C:\xampp\htdocs\yii\framework\web\CWebApplication. php(141): CWebApplication->runController('site')
#24 C:\xampp\htdocs\yii\framework\base\CApplication.ph p(180): CWebApplication->processRequest()
#25 C:\xampp\htdocs\test\index.php(13): CApplication->run()
#26 {main}</pre>
میشه کمک کنید