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

#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, позволяя вам вызывать
методы для них (такие как извлечение значений из родительского или зависимого
строки).