Передача данных из компонента CakePHP помощнику - PullRequest
4 голосов
/ 03 июля 2011

Мне нужно обмениваться данными между компонентом и помощником. Я преобразовываю свой генератор форм данных самостоятельно сделанного платежного сервиса в плагин CakePHP, и я хотел бы иметь возможность заполнять данные платежа из контроллера (используя компонент) и использовать помощника для распечатки данных.

Все, что я до сих пор пробовал, показалось мне немного странным, поэтому позвольте мне спросить вас: существует ли какой-нибудь элегантный способ передачи данных от компонента к помощнику?


редактирование:

Я решил эту конкретную ситуацию, добавив исходный экземпляр класса formadata в ClassRegistry во время инициализации компонента. Таким образом, помощник также может получить доступ к экземпляру, используя ClassRegistry.

Однако это работает только для объектов, поэтому вопрос остается открытым.

Ответы [ 3 ]

6 голосов
/ 09 июня 2012

Имея подобную проблему, я нашел, что это решение работает лучше всего для меня.

Вы можете использовать вспомогательный метод __construct в паре с массивом $ controller-> helpers.

Поскольку Helper::_construct() вызывается после Component::beforeRender, вы можете изменить массив $controller->helpers['YourHelperName'] для передачи данных вашему помощнику.

Код компонента:

<?php

public function beforeRender($controller){
    $controller->helpers['YourHelperName']['data'] = array('A'=>1, 'B'=>2);
}
?>

Код помощника:

<?php

function __construct($View, $settings){
    debug($settings);       
            /* outputs:
                array(
                    'data' => array(
                        'A' => (int) 1,
                        'B' => (int) 2
                    )
                )
            */
}

?>

Я использую CakePHP 2.0, поэтому это решение следует протестировать для более ранних версий.

4 голосов
/ 03 июля 2011

Есть ли элегантный способ передачи данных от компонента к помощнику?

Да, точно так же, как вы передаете любые данные помощнику.По вашему мнению.

Внутри вашего компонента я бы сделал что-то вроде следующего.Действие beforeRender() представляет собой обратный вызов компонента CakePHP .

public function beforeRender(Controller $controller) {
    $yourVars = 'some data';
    $goHere = 'other stuff';

    $controller->set(compact('yourVars', 'goHere'));
}

Тогда, по вашему мнению, вы можете передавать данные своим помощникам, как обычно.

// view or layout *.ctp file
$this->YourHelper->yourMethod($yourVars);
$this->YourHelper->otherMethod($goHere);
0 голосов
/ 19 февраля 2013

В дополнение к тому, что @Vanja, вы также можете сделать это непосредственно перед созданием нового представления в вашем контроллере:

// In your controller method
// must be set prior to instantiating view
$this->helpers['YourHelperName']['paramsOrAnyName'] = ['var' => $passed_var];

$_newView = new View($this);
$return_result = $_newView->render($element_to_view, $layout);
...