2013-03-25 32 views
1

我需要创建一个CGridView一个按钮,使按钮调用这样的javascript函数:Yii的CGridView按钮 - 呼叫参数化的javascript函数

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'projectCities', 
    'summaryText' => '', 
    'dataProvider' => $model->getCitiesProvider(), 
    'columns' => array(
     'name', 
     'directional', 
     'customCount', 
     array(
      'class'=>'CButtonColumn', 
      'template'=>'{delete}', 
      'buttons' => array(
       'delete' => array(
        'url' => '', 
        'click' => '', 
        'options' => array(
         'onclick' => 'removeCity(this, $data->idCity, 
             $model->idProject); return false;', 
        ),       
       ) 
      ), 
     ) 
    ), 
    )); 

Ofcourse它不工作,因为生成的HTML是:

<a class="delete" title="Delete" onclick="removeCity(this, $data->idCity, $model->idProject); return false;"> 

有没有办法做到这一点,所以在javascript函数调用中会有正确的id?

回答

2
//Controller: 
public function gridButtons($model) 
{ 
    return array(
     'class'=>'CButtonColumn', 
     'template'=>'{delete}', 
     'buttons' => array(
      'delete' => array(
       'url' => '', 
       'click' => '', 
       'options' => array(
        'onclick' => sprintf(
         'js:removeCity(this, %d, %d);return false;', 
         $model->idCity, $model->idProject 
        ), 
       ),       
      ) 
     ), 
    ) 
} 
//view 
$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'projectCities', 
    'summaryText' => '', 
    'dataProvider' => $model->getCitiesProvider(), 
    'columns' => array(
     'name', 
     'directional', 
     'customCount', 
     array(   
      'value' => array($this, 'gridButtons'),    
     ),   
    ), 
)); 
+0

无法定义'“数据城市-ID” => $数据 - > idCity' - 它会告诉你错误'未定义的变量:data' – Joe 2013-03-25 12:56:46

+0

看看更新。 – cetver 2013-03-25 13:30:03

+0

好的工作。我想这很接近。我遇到了'$ model-> idProject'的问题。我想这是因为城市和项目表与“多对多”关系有关。所以我得到的财产“Cities.idProject”没有定义。我试图使用ORM访问表:'$ model-> projects-> idProject',但我得到'试图获取非对象的属性'错误。这很奇怪 - 如果没有项目分配给城市 - 它不会出现。 – Joe 2013-03-25 13:59:17

0

您可以使用双引号来激活您的字符串变量替换:

'onclick' => "js:removeCity(this, {$data->idCity}, {$model->idProject}); return false;", 
+0

这将导致语法错误 - 你不能像'$ {data-> idCity}那样做''(' - >'将会是意想不到的)。 – Joe 2013-03-26 08:00:49

+0

@Joe:事实并非如此。请阅读本页面上的“复杂(卷曲)语法”部分:http://www.php.net/manual/en/language.types.string.php。编辑:修正了错字:'$'必须在'{}'里面。 – 2013-03-26 08:06:41

+0

我同意在''''之间移动'$'时不会出现语法错误,但是 - 您将得到'未定义的变量:数据'错误。我检查了它:) – Joe 2013-03-26 08:26:47

0

我面临这个问题,也解决this.May是后您的问题是要“选项”阵列关闭“点击'参数,其中js函数有滞留。但在'点击'参数之前'选项'数组关闭此参数。请看这里,可能是这个解决问题对你有帮助。

$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'projectCities', 
'summaryText' => '', 
'dataProvider' => $model->getCitiesProvider(), 
'columns' => array(
    'name', 
    'directional', 
    'customCount', 
    array(
     'class'=>'CButtonColumn', 
     'template'=>'{delete}', 
     'buttons' => array(
      'delete' => array(      
     'url'=>'$data->id', 
     'visible'=>'true', 
     'options'=>array('class'=>'viewbtns'), 
     'click'=>'js: function(){ viewProfile((this).attr("href"),"openDialog"); return false; }', 

      ) 
     ), 
    ) 
), 
));