我正在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...
那不可能是正确的
答案 0 :(得分:0)
我发现了问题所在。我们的开发服务器曾经在错误报告方面设置更好:
我假设E_ALL | E_STRICT
,但我只看到它变成了一个邋E_COMPILE_ERROR | E_ERROR | E_CORE_ERROR
。看到数组中的某些值可以是false
而不是一个对象,在partialLoop脚本中的某个位置,应该引发一个通知 - 当然还有正确的ini设置。
这是意外行为的原因;那个,还有一两个傻狗。