我有这样的代码,它可以在Yii CGridView中创建和填充一个表。
我的问题是,即使未单击“批准”按钮,也会为页面的每次刷新调用位于'approve'=>array('options'=>array('onclick'))中的函数。
我通过打印计数器的值来确定错误的发生。在批准时,计数器只应增加1,而不是每次刷新页面。
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'registrants-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'user_id',
'first_name',
'middle_name',
'last_name',
'gender',
'shirt_size',
'receipt_number',
'category',
array(
'class'=>'CButtonColumn',
'template'=>'{approve}, {update},{delete}',
'buttons'=>array(
'approve' => array(
'label'=>'Approve',
'options'=>array(
'onclick'=> $model->approveRegistrants($model->user_id, $model->category),
//ending approve-option array
),
//ending approve-button array
),
//ending buttons array
)
//ending table-last-column array
),
//ending table-columns array
),
//ending zii.widgets.grid.CGridview
));
?>这是我在模型中的作用。
public function approveRegistrants($user_id, $category){
$db = new PDO('mysql:host=localhost; dbname=secret; charset=utf8', 'Andy', '*****');
$getCounter = "SELECT registrants FROM counter order by registrants desc limit 1;";
$bool = false;
$show = '0';
do{
$result = $db->query($getCounter);
// $registrants = $db->query($getCounter);
// $result->setFetchMode(PDO::FETCH_ASSOC);
// $registrants = '1';
foreach ($result as $value){
$registrants = $value['registrants'];
echo 'hello'.$registrants.'</br>';
}
// $registrants = $result['registrants'];
// print_r($registrants);
$max_registrants = '3400';
if($max_registrants > $registrants){
// pdo that will use $updateCounterByOne
$updateCounterByOne = "UPDATE counter set registrants = registrants + 1 WHERE registrants = ". $registrants .";";
$updateCounter = $db->prepare($updateCounterByOne);
$updateCounter->execute();
// return affected rows
$returnAffectedRows = $updateCounter->rowCount();
$bool = true;
// break;
}
else{
echo "No more slot Available";
// break;
}
}while($returnAffectedRows == '0');
if($bool = true){
//sql syntax
$selectApprovedUser = "SELECT user_id FROM registrants WHERE user_id = '". $user_id ."';";
//pdo that will use $selectApprovedUser
$updateApprovedUser = "UPDATE registrants set approved = 'YES' where user_id = ". $selectApprovedUser .";";
$updateApproved = $db->prepare($updateApprovedUser);
$updateApproved->execute();
//pdo that will use $insertApprovedUser
$insertApprovedUser = "INSERT INTO approved_registrants (user_id, category, approved_date) VALUES ('".$user_id."', '".$category."', 'curdate()');";
$insertApproved = $db->prepare($insertApprovedUser);
$insertApproved->execute();
//execute trial
$selectSomething = "SELECT registrants from counter where tandem = '0'";
$doSelect = $db->prepare($selectSomething);
$doSelect->execute();
$hello = $doSelect->fetchAll();
echo $hello[0]['registrants'];
}
}我试图实现的是,当单击“批准”按钮时,它将获得user_id,并执行PDO命令,如update和insert。
发布于 2014-06-17 03:47:00
如果您看到CButtonColumn,它会声明'options'接受HTML属性的键值对。因此,您不应该像在这里那样放置PHP代码,除非您希望它们立即执行。这是错误的:
'options'=>array(
'onclick'=> $model->approveRegistrants($model->user_id, $model->category),
),您需要的是从TbToggleColumn扩展到“批准/不批准”项的YiiBooster列:
array(
'class' => 'bootstrap.widgets.TbToggleColumn',
'toggleAction' => 'user/toggleApproved',
'name' => 'isApproved',
'header' => 'Approved?'
),您还需要在控制器中执行相应的操作。不要忘记在控制器过滤器中添加'toggleApproved'。在本例中,我简单地倒置了单个列的值,但您可以使用此操作执行其他操作。
public function actionToggleApproved($id) {
$model = $this->loadModel($id);
if(!is_null($model) && $model->hasAttribute('isApproved')) {
$model->isApproved = $model->isApproved == 0 ? 1 : 0;
$model->update(); // no validation
}
}https://stackoverflow.com/questions/24255152
复制相似问题