CGridView и eval

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
sandrain
Сообщения: 53
Зарегистрирован: 2011.10.27, 14:07

CGridView и eval

Сообщение sandrain »

Привет всем, есть следующий сегмент кода.

Код: Выделить всё

 $this->widget('zii.widgets.grid.CGridView', array(
      //...
     'columns' => array(
                         'value' => 'CHtml::image($this->grid->controller->widget("Resize",array(
                        "method" => "aaaa",
                        "path" => $data->mypath,
                        "x" => 100,
                        "y" => 100),
                        true));',
    ),
    //....
);
Мне одному кажется это ненормальным, что всё выполняется через eval... теряется половина удобств.
Есть ли выход из этой ситуации??
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: CGridView и eval

Сообщение slavcodev »

Код: Выделить всё

$this->widget('zii.widgets.grid.CGridView', array(
      //...
     'columns' => array(
                         'value' => function(){
                                     CHtml::image($this->grid->controller->widget("Resize",array(
                                           "method" => "aaaa",
                                           "path" => $data->mypath,
                                           "x" => 100,
                                           "y" => 100),
                                     true));
                          },
    ), 
Жду Yii 3!
sandrain
Сообщения: 53
Зарегистрирован: 2011.10.27, 14:07

Re: CGridView и eval

Сообщение sandrain »

mc-bear писал(а):

Код: Выделить всё

$this->widget('zii.widgets.grid.CGridView', array(
      //...
     'columns' => array(
                         'value' => function(){
                                     CHtml::image($this->grid->controller->widget("Resize",array(
                                           "method" => "aaaa",
                                           "path" => $data->mypath,
                                           "x" => 100,
                                           "y" => 100),
                                     true));
                          },
    ),

Благодарю. Однако:
я пробовал таким образом, выдаёт ошибку:
Fatal error: Using $this when not in object context in
Helecta
Сообщения: 4
Зарегистрирован: 2012.04.24, 16:30

Re: CGridView и eval

Сообщение Helecta »

Попробуйте вместо function() -> function($data)
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: CGridView и eval

Сообщение slavcodev »

/**
* @var string a PHP expression that will be evaluated for every data cell and whose result will be rendered
* as the content of the data cells. In this expression, the variable
* <code>$row</code> the row number (zero-based); <code>$data</code> the data model for the row;
* and <code>$this</code> the column object.
*/
public $value;
Жду Yii 3!
sandrain
Сообщения: 53
Зарегистрирован: 2011.10.27, 14:07

Re: CGridView и eval

Сообщение sandrain »

mc-bear писал(а):
/**
* @var string a PHP expression that will be evaluated for every data cell and whose result will be rendered
* as the content of the data cells. In this expression, the variable
* <code>$row</code> the row number (zero-based); <code>$data</code> the data model for the row;
* and <code>$this</code> the column object.
*/
public $value;

а можно поподробней что имелось ввиду? :?

я только понял, что this это объект колонки
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: CGridView и eval

Сообщение slavcodev »

Код: Выделить всё

'columns'=>array(
  array(
     'value'=>function($data,$row){
         // $data - это объект модель для текущей стройки
         // $row - это порядковый номер строчки начиная с нуля
         // $this - объект колонки, объект класса http://www.yiiframework.com/doc/api/1.1/CDataColumn/
     },
  ),
), 
Жду Yii 3!
sandrain
Сообщения: 53
Зарегистрирован: 2011.10.27, 14:07

Re: CGridView и eval

Сообщение sandrain »

У меня $this->grid->controller так и не заработал в том месте.

Сэм подсказал другое решение:

Код: Выделить всё

Yii::app()->getController()->widget()
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: CGridView и eval

Сообщение Ryadnov »

в функции нужно добавить 3-й параметр, именно он будет объектом колонки

Код: Выделить всё

'columns'=>array(
  array(
     'value'=>function($data,$row, $column){
         // $data - это объект модель для текущей стройки
         // $row - это порядковый номер строчки начиная с нуля
         // $column - объект колонки, объект класса http://www.yiiframework.com/doc/api/1.1/CDataColumn/
         return $column->grid->controller;
     },
  ),
),
 
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: CGridView и eval

Сообщение slavcodev »

третий параметр? первый раз слышу ни в доке ни в API его нет? ты уверен?
Жду Yii 3!
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: CGridView и eval

Сообщение Ryadnov »

mc-bear писал(а):третий параметр? первый раз слышу ни в доке ни в API его нет? ты уверен?
Да, но только для анономных функций
проверить можно если вывести func_get_args()
Это из CComponent

Код: Выделить всё

    public function evaluateExpression($_expression_,$_data_=array())
    {
        if(is_string($_expression_))
        {
            extract($_data_);
            return eval('return '.$_expression_.';');
        }
        else
        {
            $_data_[]=$this;
            return call_user_func_array($_expression_, $_data_);
        }
    }
 
соответственно объект CDataColumn это третий параметр в анонимной функции или $this при использовании eval
xap
Сообщения: 17
Зарегистрирован: 2013.08.05, 13:51

Re: CGridView и eval

Сообщение xap »

Подскажите как быть при таком оформление
в модели есть функция getCover()
return $path_to_photo;

Код: Выделить всё

        array('name' => 'name', 'type' => 'html', 'value' => '$data->getCover()', 'htmlOptions' => array('class' => 'textL')),
показывает путь как надо!

но надо добиться такого результата:

Код: Выделить всё

    'columns' => array(
....
        array('name' => 'name', 'type' => 'html', 'value' => 'CHtml::tag("div",array("class"=>"box","style"=>"background-image: url($data->getCover())"))', 'htmlOptions' => array('class' => 'textL')),
....
выдает
CException
Не определено свойство "Model.getCover".

я уже как только не экранировал.. не черта не помогает
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: CGridView и eval

Сообщение flashimage »

Код: Выделить всё

'CHtml::tag("div",array("class"=>"box","style"=>"background-image: url(".$data->cover.")"))...
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
xap
Сообщения: 17
Зарегистрирован: 2013.08.05, 13:51

Re: CGridView и eval

Сообщение xap »

Благодарю
Ответить