Альтернативный вариант CakePHP requestAction() с элементом

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

Я знаю только один способ сделать это с помощью requestAction(), но мне не нравится использовать эту функцию из соображений ресурсов, и это не рекомендуется в руководстве.

Может ли кто-нибудь пролить свет на другой метод?

Вот что у меня есть сейчас:

Действие контроллера птиц:

    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));
}

каталог: views/elements/element_array_pass.ctp

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

каталог: 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
Это было для модели, содержащейся, но я удалил ее, и это не имеет значения. Я думаю, что это может быть настройка php, но я использую php5, и все остальные мои скрипты работают так, как ожидалось.   -  person OldWest    schedule 21.07.2011


Ответы (2)


Вы можете передать дополнительные данные элементу через 2-й аргумент метода element().

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

// In element
var_dump($bird_elmnt_var);

Также прочитайте эта статья от Марка Стори.

person Stoosh    schedule 20.07.2011
comment
Это не работает. И я также читал заметки Марка до этого поста, и они не были эффективны в Cake 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