Zend Framework partialLoop与关联模型数组

时间:2012-07-03 14:26:19

标签: php zend-framework partial-views

我正在Zend Framework中创建一个Web应用程序。我已经到了清理的阶段。通常情况下,我有几个混乱的视图脚本已经变得完全不可读(吨(v)sprintf和循环)。

有一种观点是绝对的噩梦......(没有/不准确的评论,速记......所有的事情都被认为是致命的罪恶)。举个例子:

$rows[$c] .= '<div>'.sprintf('<select id="%s" name="%1$s">',$t.'['.$ref->getCode().']').str_replace('>'.$ref->getCValue().'<',' selected="selected">'.$ref->getCValue().'<','<option>'.implode('</option><option>',$this->vals['P']).'</option>').'</select></div>';

在这种特殊情况下,我有一系列模型如下:

$arr = array('FOO'=> $Mylib_Model_Person,'BAR'=> $Mylib_Model_Person2);//1~50 mdls

我想使用部分循环,但是有一个问题:

$this->partialLoop('controller/_myPartial.phtml',array('model'=>$arr));
//in the partial loop:
Zend_Debug::dump($this->m);

我正确看到了所有模型,但他们的密钥都被转换为属性。

$this->FOO->someMethod();//works fine
我希望它成为:

<span><?php echo $key; ?></span><span><?php echo $model->someMethod(); ?></span>

我也尝试使用$this->partialLoop()->setObjectKey('Mylib_Model_Person');,但这似乎没有任何区别,除此之外让我感到困惑。

我看到的唯一解决方案是array_map,但这会破坏这一点(我试图以干净的视图脚本结束);或者重写我的服务层的一部分,以返回结构化的数据,并保留array_map

我不禁想到我想要做的事情,本质上使用partialLoop作为array_map回调,是可能的。如果不是,还有其他选择吗?有什么想法吗?

我已经尝试了get_object_properties($this),并且遍历对象属性,无济于事,循环根本没有被执行(?!)


事实证明$this->partialLoop()->setObjectKey('Mylib_Model_Person');应该是$this->partialLoop()->setObjectKey('model');。如果我改变了这一点,并通过转储$this->model开始部分循环,我会看到我的模型。但是:

echo $this->model->someMethod(); //throws error: method on non-object
Zend_Debug::dump(get_class_methods($this->model));//shows all methods, including someMethod()

并加重侮辱伤害,眼泪和混乱。该模型实现了toArray-thing,所以我尝试了:

echo $this->model['someData'];//Error: cannot use object of type Mylib_Model_Person as array!!

所以,当我尝试使用方法时,它不是一个对象,它是一个尝试以数组形式访问数据的对象,当使用魔术getter方法($this->model->some_Data)时,它不会做任何事情。没有错误,但也没有输出。视图按原样呈现。



我想我遇到了一个错误。我会支持它。考虑一下:

$methods = get_class_methods($this->model);
while($m = array_shift($methods))
{
    if (substr($m,0,3) === 'get')
    {
        Zend_Debug::dump($m);//e.g getName
        Zend_Debug::dump($this->model->{$m}());//'Foobar'
        $m = 'someMethod';//copy-paste, so typo's aren't to blame
        Zend_Debug::dump($this->model->{$m}());//'the data I was after'
    }
}

这样可行,但是,如果我尝试:

$this->model->{'someMethod'}();//Error again
//or even:
$m = 'someMethod';
echo $this->model->{$m}();//Error...

那不可能是正确的

1 个答案:

答案 0 :(得分:0)

我发现了问题所在。我们的开发服务器曾经在错误报告方面设置更好
我假设E_ALL | E_STRICT,但我只看到它变成了一个邋E_COMPILE_ERROR | E_ERROR | E_CORE_ERROR。看到数组中的某些值可以是false而不是一个对象,在partialLoop脚本中的某个位置,应该引发一个通知 - 当然还有正确的ini设置。

这是意外行为的原因;那个,还有一两个傻狗。

相关问题