Zend Передача переменной в PartialLoop внутри частичного представления

У меня есть частичное представление, содержащее partialLoop. Но когда я запускаю страницу, у меня появляется следующее сообщение об ошибке:

Call to a member function countComments() on a non-object in ...'_loop.phtml'

Вот как я называю свое частичное изнутри моего представления:

echo $this->partial('_post.phtml',$this->post);

где $this->post — полученная строка БД

Это содержимое моего фрагмента:

MY simplified Partial! 

echo $post->countComments();//the count number is correctly output..
echo  $this->partialLoop('_loop.phtml',$this->object);

Это содержимое моего частичного цикла:

echo $this->object->countComments();//no output!

В начальной загрузке я установил:

$view->partial()->setObjectKey('object');
$view->partialLoop()->setObjectKey('object');

Правильно ли это вызывать partialLoops из партиалов??

Ps Я var_dumped $this->object внутри моего партиала, и это ОБЪЕКТ PostRow.I var сбрасывает $this->object в _loop.phtml, и у меня есть 5 NULLS (обозначает id, title, text ,автор,поля datetime моего поста)

Благодарность

Лука


person luca    schedule 19.05.2011    source источник
comment
Что это: echo $post->countComments();. Разве это не должно быть echo $post->object->countComments(); ?   -  person user594791    schedule 19.05.2011


Ответы (2)


Я думаю, что причина в том, что когда вы передаете $this->post помощнику частичного представления следующим образом:

$this->partial('_post.phtml',$this->post);

помощник частичного представления выполнит свой метод toArray(). Следовательно, ваш $this->object представляет собой массив, и вы передаете массив в свой partialLoop. Итак, в вашем partialLoop вы пытаетесь выполнить countComments() для массива, представляющего ваш объект записи строки, а не фактический объект строки.

Чтобы избежать этого, я бы рекомендовал передавать переменные помощникам представления partial и partialLoop, используя нотацию массива, например:

$this->partial('_post.phtml',array('post' => $this->post));

Надеюсь это поможет.

person Marcin    schedule 19.05.2011
comment
Я var_dumped $this-›object: внутри partial это объект PostRow. Внутри partialLoop равен NULL. Опираясь на ваш ответ, я не должен видеть массив?? Спасибо - person luca; 19.05.2011
comment
На самом деле внутри частичного цикла var_dump($this-›object) выводит 5 NULL (я думаю, что они обозначают поля id, title, text, author, datetime строки моего сообщения) - person luca; 19.05.2011
comment
Я решил, спасибо, но все еще не понимаю, что я на самом деле сделал, передав переменные с использованием записи массива. Буду очень признателен за любые дальнейшие объяснения! - person luca; 19.05.2011
comment
@лука. Итак, как вы решили это? Извините, у меня больше нет подсказок, что может быть причиной первоначальной проблемы. - person Marcin; 19.05.2011

Эта ошибка вызвана поведением по умолчанию помощников представления partial и partialLoop, как сказал выше Марчин. Хотя это сбивает с толку, руководство объясняет это здесь

Объект, реализующий метод toArray(). Если объект передается и имеет метод toArray(), результаты toArray() будут присвоены объекту представления в качестве переменных представления.

Решение состоит в том, чтобы явно указать партиалу передать объект. Как поясняет инструкция:

// Tell partial to pass objects as 'model' variable
$view->partial()->setObjectKey('model');   
// Tell partial to pass objects from partialLoop as 'model' variable 
// in final partial view script: 
$view->partialLoop()->setObjectKey('model');

Этот метод особенно полезен при передаче Zend_Db_Table_Rowsets в partialLoop(), поскольку после этого вы получаете полный доступ к своим объектам-строкам в сценариях представления, что позволяет вам вызывать для них методы (например, извлекать значения из родительских или зависимых строк).

person Teddy Ort    schedule 12.01.2012