通常,通过调用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的评论显示了我未尝试过的列值中的窗口小部件的另一种方式.
| 归档时间: |
|
| 查看次数: |
3810 次 |
| 最近记录: |