#php #zend-framework #partial-views
#php #zend-framework #частичные представления
Вопрос:
На мой взгляд, у меня есть частичное, содержащее частичный цикл. Но когда я запускаю страницу, у меня появляется следующее сообщение об ошибке:
Call to a member function countComments() on a non-object in ...'_loop.phtml'
Вот как я вызываю свой partial из моего представления:
echo $this->partial('_post.phtml',$this->post);
где $this-> post — строка, извлеченная из базы данных
Это содержимое моего partial:
MY simplified Partial!
echo $post->countComments();//the count number is correctly output..
echo $this->partialLoop('_loop.phtml',$this->object);
Это содержимое моего partialLoop:
echo $this->object->countComments();//no output!
В начальной загрузке я установил:
$view->partial()->setObjectKey('object');
$view->partialLoop()->setObjectKey('object');
Это правильный способ вызвать partialLoops из partials??
P.s. Я ввел var_dumped $this-> object внутри моего partial, и это объект PostRow.Я сбросил $ this-> object в _loop.phtml, и у меня есть 5 нулей (обозначающих поля id, title, text, author, datetime моего поста)
Спасибо
Luca
Комментарии:
1. Что это:
echo $post->countComments();
. Разве это не должно бытьecho $post->object->countComments();
?
Ответ №1:
Я думаю, что причина в том, что когда вы передаете $this->post
в помощник частичного представления, подобный этому:
$this->partial('_post.phtml',$this->post);
помощник по частичному просмотру выполнит свой toArray()
метод. Следовательно, ваш $this->object
является массивом, и вы передаете массив в свой partialLoop. Итак, в вашем partialLoop вы пытаетесь выполнить countComments()
для массива, представляющего ваш объект row post, а не фактический объект row.
Чтобы избежать этого, я бы рекомендовал передавать переменные помощникам partial и partialLoop view, используя нотацию массива, например:
$this->partial('_post.phtml',array('post' => $this->post));
Надеюсь, это поможет.
Комментарии:
1. Я var_dumped $this->object: внутри partial находится объект PostRow. Внутри partialLoop равно NULL. Полагаясь на ваш ответ, я не должен видеть массив?? спасибо
2. На самом деле внутри частичного цикла var_dump ($this-> object) выдает 5 нулей (я думаю, они обозначают поля id, title, text, author, datetime моей строки post)
3. Я решил, спасибо, но все еще не понимаю, что я на самом деле сделал, передав переменные с использованием обозначения массива. Любые дальнейшие объяснения были бы действительно оценены!
4. @luca. Итак, как вы это решили? Извините, у меня больше нет подсказок, что могло бы быть причиной первоначальной проблемы.
Ответ №2:
Эта ошибка вызвана поведением помощников по умолчанию partial
и partialLoop
view, как сказал Марчин выше. Хотя это сбивает с толку, в руководстве это объясняется здесь
Объект, реализующий метод toArray(). Если объект передается с помощью метода toArray(), результаты toArray() будут присвоены объекту view в качестве переменных view.
Решение состоит в том, чтобы явно указать partial передать объект. Как объясняется в руководстве:
// 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(), так как тогда у вас будет полный доступ
вашим объектам row в скриптах view, позволяя вам вызывать
методы для них (такие как извлечение значений из родительского или зависимого
строки).