2

knplabs で DoctrineBehaviors を使用する良い方法を探しています。

このバンドルの助けを借りて、ソナタ管理バンドルでフォームをすでにレンダリングしています: https://github.com/a2lix/TranslationFormBundle

今、私は翻訳されたフィールドを管理者リストに入れたいと思っています。

現時点では、次の方法で動作します。

/**
 * @ORM\Entity
 * @ORM\Table(name="sport") 
 */

class Sport
{
...

    public function getNom(){
        return $this->translate()->getNom();
    }
}

それはうまくいきましたが、元のエンティティのすべての翻訳済みフィールドを再マップする必要があります。特に代理翻訳の魔法に関しては、何かが欠けていると確信しています。

アップデート:

class Sport
{

    use \Knp\DoctrineBehaviors\Model\Translatable\Translatable;

    public function __call($method, $arguments)
    {
        return $this->proxyCurrentLocaleTranslation($method, $arguments);
    }   
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    // Need this method for the admin list template
    public function getNom(){
         return $this->translate()->getNom();
    }

    // Work even the precedent method not here, the proxy call work fine.
    public function __toString(){
         return $this->getNom();
    }
}

class SportTranslation
{
    use ORMBehaviors\Translatable\Translation;

    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $nom;

    /**
     * @return string
     */
    public function getNom()
    {
        return $this->nom;
    }

    /**
     * @param  string
     * @return null
     */
    public function setNom($nom)
    {
        $this->nom = $nom;
    }
}

@nifr さん、素早い返信ありがとうございます。プロキシ メソッドはコントローラーで動作します (スポーツの __toString メソッドを試してみましたが、問題なく動作しています)。

しかし、問題はどうやらソナタ管理バンドルから来ているようです。テンプレートコードを確認しましたが、なぜ機能しないのかわかりません。

より良い解決策が見つかるまで、私は醜い方法を維持します。

現時点では、管理リスト テンプレートに値を出力する唯一の方法です。

もっと良いものを見つけたら、この投稿を更新します。

4

2 に答える 2

3

Knp\DoctrineBehaviors マジック プロキシ翻訳の使用方法

命名規則 ( Translation クラスの接尾辞がTranslation ) に従っているMyClassとします。MyClassTranslation

翻訳する必要のないプロパティのみが存在しMyClass、すべての翻訳可能なプロパティは に存在しMyClassTranslationます。

翻訳可能なプロパティが であるとしましょうdescription


MyClass.php

注意: in ....のプロパティdescriptionも getter/setter も、適切に呼び出されません!descriptionMyClass__call()

class MyClass
{

    use \Knp\DoctrineBehaviors\Model\Translatable\Translatable;

    public function __call($method, $arguments)
    {
        return $this->proxyCurrentLocaleTranslation($method, $arguments);
    }

    protected $nonTranslatableProperty;

    // ...

MyClassTranslation.php

use Doctrine\ORM\Mapping as ORM;

class MyClassTranslation
{
    use \Knp\DoctrineBehaviors\Model\Translatable\Translation;


    /**
     * @var string
     */
    protected $description;

    /**
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * @param string $description
     *
     * @return MyClassTranslation
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

を呼び出すと、現在のロケールを使用して翻訳を返すMyClass::getDescription()マジック メソッドが呼び出されます。これは、にメソッド__call()がないためです。getDescription()MyClass

解決:

に存在するすべての翻訳可能なゲッター/セッター/プロパティをクラスSportTranslationから削除しSport、代わりにマジック__call()メソッドを追加する必要があります。

于 2013-07-01T18:08:29.003 に答える