通常,在CController::widget()
的实例上调用CController
来使用小部件,通常是视图中的$this
。
但是,如果我正在编写一个静态方法,一个帮助器,那么我就无法访问CController
的实例。那我该如何使用小工具?
让我们进一步说明,在eval()
的{{1}}属性的CDataColumn
'ed表达式中调用了这个辅助方法。这种糟糕的表达几乎没有任何背景。帮助者应该如何使用小部件?
根据要求,提供了一个视图示例:
value
答案 0 :(得分: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 ... */);
},
),
)
));
诀窍是发现CDataColumn::renderDataCellContent()
使用CComponent::evaluateExpression()
,它将组件实例作为最后一个参数注入回调。在这种情况下,omponent是CDataColumn
,它引用控制器,如图所示。
我不喜欢将PHP表达式编写为字符串文字,所以我很高兴找到这个选项。
对http://www.yiiframework.com/doc/api/1.1/CDataColumn#value-detail的评论显示了我未尝试过的列值中的窗口小部件的另一种方法。
答案 1 :(得分:3)
这是在Yii中用静态方法调用小部件的工作解决方案
Yii::app()->controller->widget('widget');
答案 2 :(得分:1)
没有直接的方法可以从控制器中调用小部件,因为你不应该这样做。这都是关于MVC的。窗口小部件仅在视图中需要和/或有用,并且视图仅通过控制器访问。这就是理论。
我猜你错误地接近了这个问题。一个正确的,MVC友好的方式来做你正在尝试做的事情涉及使用renderPartial()。你知道:你有一些特定的内容,你想装饰它(在你的情况下,你想在一个小部件中吸收它,对吧?),然后再将它显示给最终用户;所以,从视图中,您调用renderPartial()。它会将您的数据发送到正确装饰的文件。 renderPartial()返回格式正确的内容,现在您可以在视图中显示它。
不幸的是,在您的特定情况下,您正在使用网格视图(对吗?),至少从我的角度来看,它会使事情变得更难。为了装饰CGridColumn子类元素(如CDataColumn)的内容,您需要覆盖renderDataCellContent()方法。请在此处查看:http://www.yiiframework.com/doc/api/1.1/CDataColumn#renderDataCellContent-detail