Zend Передача переменной в 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);
Это содержимое моего partLoop:
echo $this->object->countComments();//no output!
В начальной загрузке я установил:
$view->partial()->setObjectKey('object');
$view->partialLoop()->setObjectKey('object');
Это правильный способ вызвать частичные циклы из партиалов??
Ps Я var_dumped объект $ this-> внутри моего партиала, и это PostRow OBJECT.I var сбросил $this->object в _loop.phtml и у меня есть 5 NULL (обозначающих поля id,title,text,author,datetime моего сообщение)
Спасибо
Лука
2 ответа
Я думаю, что причина в том, что когда вы проходите $this->post
в частичном представлении помощник, как это:
$this->partial('_post.phtml',$this->post);
помощник по частичному просмотру выполнит его toArray()
метод. Следовательно, ваш $this->object
это массив, и вы передаете массив в вашу частичную петлю. Итак, в вашей частичном цикле вы пытаетесь выполнить countComments()
в массиве, представляющем ваш объект записи строки, а не фактический объект строки.
Чтобы избежать этого, я бы порекомендовал передавать переменные в помощники представления частичного и частичного цикла с использованием нотации массива, например:
$this->partial('_post.phtml',array('post' => $this->post));
Надеюсь это поможет.
Эта ошибка вызвана поведением по умолчанию 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 в componentLoop (), так как тогда у вас есть полный доступ к вашим объектам строк в сценариях представления, что позволяет вам вызывать методы для них (например, получать значения из родительских или зависимых строк).