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

时间:2012-01-17 17:10:58

标签: widget yii

通常,在CController::widget()的实例上调用CController来使用小部件,通常是视图中的$this

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

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


编辑:代码示例

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

value

3 个答案:

答案 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