【问题标题】:Yii CGridView button - call parametrized javascript functionYii CGridView 按钮 - 调用参数化的 javascript 函数
【发布时间】:2013-03-25 12:41:33
【问题描述】:

我需要用一个按钮创建一个 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;',
                    ),                          
                )
            ),
        )
    ),
    ));

当然不行,因为生成的html是:

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

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

【问题讨论】:

    标签: php javascript yii cgridview cbuttoncolumn


    【解决方案1】:
    //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'),            
            ),        
        ),
    ));
    

    【讨论】:

    • 你不能定义'data-city-id' =&gt; $data-&gt;idCity - 它会告诉你错误Undefined variable: data
    • 干得好。我猜它非常接近。我有$model-&gt;idProject 的问题。我想这是因为 Cities 和 Projects 表与many-to-many 关系相关。所以我收到Property "Cities.idProject" is not defined.。我尝试使用 ORM:$model-&gt;projects-&gt;idProject 访问该表,但出现 Trying to get property of non-object 错误。这很奇怪——如果没有分配给城市的项目——它就不会出现。
    • $model-&gt;projects 是数组。在gridButtons 内部检查$model-&gt;projects 是否为空,您可以访问它$model-&gt;projects[0]-&gt;id
    • 我试过了,但上面写着htmlspecialchars() expects parameter 1 to be string, array given
    【解决方案2】:

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

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

    【讨论】:

    • 这会导致语法错误——你不能像${data-&gt;idCity}那样做某事(-&gt;会出乎意料)。
    • @Joe:这不是真的。请阅读此页面上的“复杂(卷曲)语法”部分:php.net/manual/en/language.types.string.php。编辑:修正错字:$ 必须在{} 内。
    • 我同意在 $ 之间移动 {} 时不会出现语法错误,但随后 - 你会收到 Undefined variable: data 错误。我检查了它:)
    • 哦,对了。变量仅适用于某些属性,主要是与 URL 相关的。
    【解决方案3】:

    我遇到了这个问题,也解决了这个问题。可能是你的问题是在 'click' 参数后关闭 'option' 数组,其中 js 函数有停留。但是 'option' 数组在下面的 'click' 参数之前关闭。请看这个,也许这个解决问题对你有帮助。

    $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; }',
    
                )
            ),
        )
    ),
    ));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多