【发布时间】:2012-07-04 16:01:07
【问题描述】:
我正在 Zend Framework 中制作一个 Web 应用程序。我已经到了清理的阶段。通常情况下,我有一些杂乱无章的视图脚本已经变得完全不可读(大量的(v)sprintf 和循环)。
有一种观点绝对是一场噩梦......(没有/不准确的 cmets,速记......所有事情都被认为是致命的罪过)。只是一个例子:
$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...
这不可能
【问题讨论】:
-
$Mylib_Model_Person是什么,可以 var_dump 吗? -
它只是一个对象,正如我所期望的那样。我自己写的循环工作得很好,数据是正确的。我只是似乎无法让 partialLoop 表现...
标签: php zend-framework partial-views