CakePHP requestAction() алтернативна опция с елемент

Аз съм в ситуация, в която се опитвам да предам стойност от действие на контролер към елемент директно.

Единственият начин, по който знам как да направя това, е с requestAction(), но не ми харесва да използвам тази функция поради ресурсни причини и не се препоръчва в ръководството.

Може ли някой да хвърли малко светлина върху друг метод?

Ето какво имам сега:

Действие на Bird Controller:

    function element_array_pass() {
    $this->paginate['Bird'] = array(
        'fields'  => array('id', 'name'),
        'contain' => array('id', 'name'),
        'order'   => 'Bird.id'
    );
    $bird_elmnt = $this->paginate('Bird');
    $this->set(compact('bird_elmnt', $bird_elmnt));
}

dir: views/elements/element_array_pass.ctp

debug($bird_elmnt); // nothing being passed here.

dir: views/birds/index.ctp

Включвам елемента в този файл, но масивът няма да премине.

echo $this->element('element_array_pass',array("bird_elmnt" => $bird_elmnt)); // call to element.

Бих искал да включа този елемент в моя index.ctp със стойности, предадени от action(), който включих по-горе.


person OldWest    schedule 20.07.2011    source източник
comment
Вярвам, че paginate е обект, а не масив. Потърсете го в ръководството. Трябва да показва как да получите достъп до него.   -  person Eric    schedule 20.07.2011
comment
paginate е масив в контролера   -  person Anh Pham    schedule 20.07.2011
comment
Добавих актуализирания си код въз основа на моето проучване на идеите по-долу, но той все още не работи.   -  person OldWest    schedule 21.07.2011
comment
и какво искаш да кажеш с това? 'contain' => array('id', 'name')   -  person Anh Pham    schedule 21.07.2011
comment
Това беше за Containable Model, но го премахнах и няма значение. Мисля, че може да е настройка на php, но използвам php5 и всичките ми други скриптове работят според очакванията.   -  person OldWest    schedule 21.07.2011


Отговори (2)


Можете да подадете допълнителни данни към елемент чрез втория аргумент на метода element().

echo $this->element('birds_paginator_element', array(
    'bird_elmnt_var' => $bird_elmnt
));

// In element
var_dump($bird_elmnt_var);

Също така прочетете тази статия от Mark Story.

person Stoosh    schedule 20.07.2011
comment
Това не работи. Прочетох и бележките на Марк преди тази публикация и те не бяха ефективни в Торта 1.3. Но благодаря за идеите. - person OldWest; 21.07.2011
comment
API за 1.3 казва, че все още приема втори аргумент като допълнителни параметри за елемент, с изключение на двата специални параметъра, които са cache & plugin: api.cakephp.org/class/view#method-Viewelement - person Stoosh; 21.07.2011
comment
Не съм сигурен, но със сигурност не работи, това е всичко, което знам на този етап. Все още опитва различни неща. - person OldWest; 21.07.2011

person    schedule
comment
Трябва да е нещо друго, което се обърка. Предавам данни на елементи през цялото време. Опитайте да регистрирате данните на всяка стъпка, за да видите къде сте ги загубили. - person Anh Pham; 21.07.2011
comment
Тествах моите променливи на контролера и те съдържат правилните масивни структури и данни. Губи се в слоя елемент. Елементът изглежда не извлича предадената стойност. - person OldWest; 21.07.2011
comment
тествахте ли отново $bird_elmnt непосредствено преди ехото на елемента? - person Anh Pham; 21.07.2011
comment
Добре, променливата се предава добре, но само ако е изпратена от действието index(). Създадох действие element_array_pass() и се опитвам да предам стойността на това действие, но използвам изгледа index.ctp. Така че се опитвам да получа достъп до предадената стойност от функция, която не е зададена за текущия изглед. Разбирате ли какво имам предвид? Моята цел с всичко това беше да създам независимо действие, което връща масив, който мога да използвам за моя елемент във всеки изглед. - person OldWest; 21.07.2011
comment
@OldWest ни позволи да продължим тази дискусия в чата - person Anh Pham; 21.07.2011
comment
Просто исках първоначалната ми публикация да не показва, че използвам index.ctp и се опитвах да изтегля стойността от друго действие на контролера. Приемам този отговор, защото работи, но всъщност не реши първоначалния ми проблем, избягвайки използването на requestAction(). Благодаря за съдействието все пак. - person OldWest; 21.07.2011
comment
добре, причината requestAction е скъпа, защото трябва да инициализира друг контролер. Ако имате нужда от данните от конкретен контролер в приложението, ще трябва да инициирате този контролер така или иначе, с requestAction или не. Както и да е, този вид проблеми обикновено се свеждат до преосмисляне на цялостния дизайн на вашето приложение. - person Anh Pham; 21.07.2011