ZendFrameworkでWebアプリケーションを作成しています。片付けの段階になりました。よくあることですが、私には、まったく読めなくなった厄介なビュースクリプトがいくつかあります(何トンもの(v)sprintf
'とループ)。
絶対的な悪夢である1つの見方があります...(コメントなし/不正確、速記...大罪とみなされるすべてのもの)。ほんの一例:
$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
そこに保持します。
私がやりたいこと、本質的にはarray_map
コールバックとしてpartialLoopを使用することが可能であると考えずにはいられません。そうでない場合、代替手段はありますか?何かご意見は?
私は試しましたが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!!
したがって、メソッドを使用しようとするとオブジェクトではなく、配列としてデータにアクセスしようとするとオブジェクトになり、マジックゲッターメソッド($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...
それは正しくありえない