在静态调用的方法中使用窗口小部件

2 widget yii

通常,通过调用CController::widget()实例(CController通常$this在视图中)来使用窗口小部件.

但是,如果我正在编写一个静态方法,一个帮助器,那么我就无法访问一个实例CController.那么我该如何使用小部件呢?

让我们进一步说,这个辅助方法是eval()CDataColumn's value属性的'ed表达式中调用的.这种糟糕的表达几乎没有任何背景.帮助者应该如何使用小部件?


编辑:代码示例

根据要求,一个视图示例:

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $model->search(),
    'columns' => array(
        array(
            'name' => 'attrName',
            'value' => '--USE WIDGET HERE--',
        ),
    )
));
Run Code Online (Sandbox Code Playgroud)

小智 6

这个答案一般不会回答这个问题,但在特定情况下 - 如何访问控制器并在评估表达式的上下文中使用窗口小部件CDataColumn::$value- 您可以使用:

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $model->search(),
    'columns' => array(
        array(
            'name' => 'attrName',
            'value' => function ($data, $row, $column) {
                $controller = $column->grid->owner;
                $controller->widget(/* ... etc ... */);
            }, 
        ),
   )
));
Run Code Online (Sandbox Code Playgroud)

诀窍在于发现了CDataColumn::renderDataCellContent()use CComponent::evaluateExpression(),它将组件实例作为最后一个参数注入到回调中.在这种情况下,omponent是CDataColumn,如图所示引用控制器.

我不喜欢将PHP表达式编写为字符串文字,所以我很高兴找到这个选项.

http://www.yiiframework.com/doc/api/1.1/CDataColumn#value-detail的评论显示了我未尝试过的列值中的窗口小部件的另一种方式.