2012-01-16 9 views
0

私はdoctrine 'class table inheritance'パターンを使用していて、オブジェクトは自分のパラレルクラスを参照しています。 例:Symfony 2のオブジェクトタイプの関数で小枝テンプレートをレンダリングする方法

class Pet { 
    protected $id; 

    protected $age; 
} 

class Dog extends Pet { 
    protected $ownedBones; 
} 

class Cat extends Pet { 
    protected $killedBirds; 
} 

class Owner { 
    private $pets; 
} 

今、私は自分のタイプの機能に私の息子のオブジェクトをレンダリングするための良いテンプレートを選択するために小枝をしたいと思います。だから猫はスーパーCatly divを持つことができ、私の犬もクールなテンプレートを持つことができます。 は、私はそのような何かをしようとした:

{%for pet in owner.pets%} 
    <div class="pet"> 
     {{ pet }} 
    </div> 
{%endfor%} 

私は素敵だ:

Fatal Error: Object of class 'the right type of object' could not be converted to string in ...

だから私は答えに近いかもしれませんか? 私はちょっとした初心者ですので、どんな援助も重宝されるでしょう。

+0

クラスに '__toString()'関数を追加しようとしていますか?私は小枝が自動的にそれを使用することを願っています。 'return $ this-> name;'のような単純なものを試してみてください。 – Maerlyn

+0

しかし、私が{%raw%} {%endraw%}を入れずに(悪いものにつながる可能性がある)私は "

blabla
"を取得します。 – Azr

答えて

2

ペットクラスに抽象メソッドを追加する必要があります。 IE:

class Pet 
{ 
    abstract function render(); 
} 

このメソッドを実装する必要があります。たとえば、次のテンプレートで

class Dog extends Pet 
{ 
    public function render() 
    { 
     return sprintf('<div class="dog">%s</div>', 'blabla'); 
    } 
} 

、単にrenderメソッドを呼び出します。

{{ pet.render() }} 

さもないとあなたはいつもgetTemplate()共有方法のancheを作成することができ小枝でそれを含める:{% include pet.template %}

+0

これは解決策のおかげですが、もし私がきれいにしたいのであれば、この種のメソッドはクラス内にすべきではないでしょうか? – Azr

+1

あなたはいつでも 'getTemplate()'共有メソッドを作成して、それをtwigにインクルードすることができます: '{%include pet.template%}' –

+0

どうすればいいですか?スマートなアイデア:Dありがとう 編集:今すぐ試して – Azr

0

はちょうど別です方法をチェックしないで、タイプをチェックしてプロパティを確認してください:

{% if pet.ownedBones is defined %} 
woot that's a dog 
{% else %} 
it's somthing else 
{% endif %} 
関連する問題