1

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...

それは正しくありえない

4

1 に答える 1

0

私は問題が何であるかを知りました。私たちの開発サーバーは、エラー報告の点でより適切に設定されていました。
私は想定E_ALL | E_STRICTしていましたが、それが雑然としたものに変更されているのを見つけただけでしE_COMPILE_ERROR | E_ERROR | E_CORE_ERRORた。配列内の一部の値はfalseオブジェクトではなくオブジェクトである可能性があるため、partialLoopスクリプトのある時点で、通知が発生するはずです。もちろん、正しいini設定を使用します。

それが予期しない動作の原因でした。それと、ばかげたバグが1つか2つあります。

于 2012-07-04T08:01:07.867 に答える