Используйте виджет в статически вызываемом методе - PullRequest
2 голосов
/ 17 января 2012

Обычно виджет используется путем вызова CController::widget() в экземпляре CController, обычно $this в представлении.

Но если я пишу статический метод, скажем, помощник, то у меня нет доступа к экземпляру CController. Так как мне использовать виджет?

Скажем далее, что этот вспомогательный метод вызывается в выражении eval() в свойстве CDataColumn value. Это плохое выражение почти не имеет контекста. Как помощник должен использовать виджет?


РЕДАКТИРОВАТЬ: Пример кода

По запросу, пример просмотра:

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

Ответы [ 3 ]

6 голосов
/ 20 января 2012

Этот ответ не отвечает на вопрос в целом, но в конкретном случае - как получить доступ к контроллеру и использовать виджет в контексте оцененного выражения 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(), который вставляет экземпляр компонента в обратный вызов в качестве последнего параметра. В этом случае этим компонентом является CDataColumn, который ссылается на контроллер, как показано.

Мне не нравится писать выражения PHP как строковые литералы, поэтому я рад найти эту опцию.

Комментарий к http://www.yiiframework.com/doc/api/1.1/CDataColumn#value-detail показывает нам другой способ использования виджета в столбце со значением, которое я еще не пробовал.

3 голосов
/ 26 декабря 2014

Это рабочее решение для вызова виджетов в статических методах в Yii

Yii::app()->controller->widget('widget');
1 голос
/ 17 января 2012

Нет прямого способа вызвать виджет из контроллера, потому что вы не должны этого делать. Это все о MVC. Виджеты нужны и / или полезны только в представлениях, а доступ к представлениям осуществляется только через контроллеры. Это теория.

Полагаю, вы ошибаетесь. Правильный, MVC-дружественный способ сделать то, что вы пытаетесь сделать, заключается в использовании renderPartial (). Вы знаете: у вас есть определенный контент, и вы хотите его украсить (в вашем случае вы хотите впитать его внутри виджета, верно?) Перед его отображением конечному пользователю; Итак, из представления вы вызываете renderPartial (). Он отправит ваши данные в файл, где будет правильно оформлен. renderPartial () возвращает содержимое, правильно отформатированное, и теперь вы можете отобразить его в представлении.

К сожалению, в вашем конкретном случае вы работаете с сеткой (верно?), И, по крайней мере, с моей точки зрения, это немного усложняет ситуацию. Чтобы украсить содержимое для элемента CGridColumn-subclass (например, CDataColumn), вам необходимо переопределить метод renderDataCellContent (). Проверьте это здесь: http://www.yiiframework.com/doc/api/1.1/CDataColumn#renderDataCellContent-detail

...