2014-06-17 148 views
0

我有这个代码可以在Yii CGridView中创建和填充表格。CButtonColumn批准按钮执行PHP代码而不被点击

我的问题是位于'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作为更新命令,比如和插入。

回答

0

如果看到CButtonColumn,则表示'options'为HTML标记属性获取键值对。因此,您不应该像在这里所做的那样在这里放置PHP代码,除非您希望它们立即执行。这是错误的:

'options'=>array(
    'onclick'=> $model->approveRegistrants($model->user_id, $model->category), 
), 

你需要的是从YiiBooster扩展TbToggleColumn列批准/不批准项目:

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 
    } 
}