0

私は symfony2 プロジェクトを作成しており、翻訳可能な 2 つのフィールドを持つクラスを取得しました。フォームには、symfony2 バージョン 2.2 のバンドルa2lixを使用します

その部分は正常に機能しており、エンティティと対応する entityTranslator がデータベースに入力されています。しかし問題は、エンティティのコンテンツを表示しようとすると、実際のロケールではなく、これらのフィールドが常にデフォルトのロケールで表示されることです。

私のエンティティ:

 /**
 * Product
 *
 * @ORM\Table(name="ecm_product")
 * @ORM\Entity(repositoryClass="Entity\Repository\ProductRepository")
 * @Gedmo\TranslationEntity(class="Entity\Translation\ProductTranslation")
 */
 class Product{

    /**
    * @var string
    *
    * @ORM\Column(name="name", type="string", length=255)
    * @Gedmo\Translatable
    */
    protected $name;

    /**
    * @var string
    *
    * @ORM\Column(name="slug", type="string", length=255, nullable=true)
    */
    protected $slug;

   /**
    * @var string
    *
    * @ORM\Column(name="description", type="text", nullable=true)
    * @Gedmo\Translatable
    */
    protected $description;


    /**
     * @ORM\OneToMany(
     *     targetEntity="Entity\Translation\ProductTranslation",
     *  mappedBy="object",
     *  cascade={"persist", "remove"}
     * )
     * @Assert\Valid(deep = true)
     */
     private $translations;


    public function getTranslations() {
       return $this->translations;
    }

    public function setTranslations($translations) {
       foreach ($translations as $translation) {
          $translation->setObject($this);
       }

      $this->translations = $translations;
      return $this;
    }

    /**
   * Remove translation
   *
   * @param Entity\Translation\ProductTranslation $translation
   */
   public function removeTranslation(Entity\Translation\ProductTranslation $translation)
   {
      if ($this->translations->contains($translation)) {
          $this->translations->removeElement($translation);
      }
   }


   /**
    * Add translation
    *
    * @param Entity\Translation\ProductTranslation $translation
    * @return PrivacyPolicy
    */
    public function addTranslation(Entity\Translation\ProductTranslation $translation)
    {
       if (!$this->translations->contains($translation)) {
          $this->translations[] = $translation;
          $translation->setObject($this);
       }

       return $this;
   }


}

私のエンティティ翻訳:

/**
 * Entity\Translation\ProductTranslation.php

 * @ORM\Entity
 * @ORM\Table(name="ecm_product_translations",
 *   uniqueConstraints={@ORM\UniqueConstraint(name="lookup_unique_idx", columns={
 *     "locale", "object_id", "field"
 *   })}
 * )
 */
class ProductTranslation extends AbstractPersonalTranslation
{
    /**
     * @ORM\ManyToOne(targetEntity="Entity\Product", inversedBy="translations")
     * @ORM\JoinColumn(name="object_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $object;

    public function getObject() {
        return $this->object;
    }

    public function setObject($object) {
        $this->object = $object;
    }
}

そして、私のリポジトリでは、常に次の行を追加します。

$qb->getQuery()->setHint(
                    \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
                    'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
            );

しかし、私のエンティティは翻訳されていません:s

4

2 に答える 2

0

ページをリクエストしたときに $request->getLocale() が正しいロケールを返すことを再確認してください。あなたのコードは正しいように見えますが、製品エンティティ内のすべてのコードなしでは言いにくいです (プロパティ $translations の欠落など)。

次のコードを Product エンティティに追加して、役立つかどうかを確認できます。

use Gedmo\Translatable\Translatable;


class Product implements Translatable {

    protected $locale;

   /** 
     * @ORM\OneToMany(
     *     targetEntity="Entity\Translation\ProductTranslation", 
     *     mappedBy="object", 
     * )
     */
    protected $translations;

    public function __construct()
    {
        $this->translations = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ....


    public function setTranslatableLocale($locale)
    {
        $this->locale = $locale;
    }


}
于 2013-11-14T15:54:04.897 に答える