Zend在部分视图中将变量传递给PartialLoop

时间:2011-05-19 07:05:27

标签: php zend-framework partial-views

我在视图中有一个包含partialLoop的部分内容。 但是当我运行页面时,我有以下错误消息:

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

这就是我在视图中称呼我的部分的方式:

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

其中$ this-> post是数据库检索行

这是 my partial's 内容:

MY simplified Partial! 

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

这是 my partialLoop的内容:

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

bootstrap 中,我设置了:

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

这是从partials中调用partialLoops的正确方法吗?

Ps 我var_dumped $ this->对象在我的部分内部,它是一个PostRow OBJECT.I var将$ this->对象转换为_loop.phtml,我有5个NULLS(代表我的帖子的id,title,text,author,datetime fields)

感谢

卢卡

2 个答案:

答案 0 :(得分:4)

我认为原因是当您将$this->post传递给部分视图助手时:

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

部分视图助手将执行其toArray()方法。因此,您的$this->object是一个数组,并且您正在将数组传递给partialLoop。因此,在partialLoop中,您尝试在表示行发布对象的数组上执行countComments(),而不是实际的行对象。

为了避免这种情况,我建议使用数组表示法将变量传递给partial和partialLoop视图助手,例如:

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

希望这有帮助。

答案 1 :(得分:1)

此错误是由partialpartialLoop视图帮助程序的默认行为引起的,正如Marcin上面所述。 虽然令人困惑但手册确实解释了这个here

  

实现toArray()方法的对象。如果一个对象被传递,则有一个   toArray()方法,将toArray()的结果赋值给   将对象视为视图变量。

解决方案是明确告诉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(),因为您具有完全访问权限   到视图脚本中的行对象,允许您调用   它们的方法(例如从父级或从属级别检索值)   行)。