0

Doctrine翻訳可能エンティティ(私はhttps://github.com/Atlantic18/DoctrineExtensions翻訳可能エクステンションを使用します)のZF2フォームを作成する必要があります。これは、各利用可能な言語でエンティティの翻訳可能なすべてのプロパティ(列)のフィールドを提供する必要があります。ZF2とDoctrine 2:翻訳エンティティフォーム

1)条エンティティ

namespace TestModule\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @Doctrine\ORM\Mapping\Entity(repositoryClass="TestModule\Entity\ArticleRepository") 
* @Doctrine\ORM\Mapping\Table(name="test_module_articles") 
* @Gedmo\Mapping\Annotation\TranslationEntity(class="TestModule\Entity\ArticleTranslation") 
*/ 
class Article 
{ 
    /** 
    * @var int Auto-Incremented Primary Key 
    * 
    * @Doctrine\ORM\Mapping\Id 
    * @Doctrine\ORM\Mapping\Column(type="integer") 
    * @Doctrine\ORM\Mapping\GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @Doctrine\ORM\Mapping\Column(type="string") 
    * @Gedmo\Mapping\Annotation\Translatable 
    */ 
    protected $name; 

    /** 
    * @Doctrine\ORM\Mapping\Column(type="text", length=65535) 
    * @Gedmo\Mapping\Annotation\Translatable 
    */ 
    protected $description; 

    /** 
    * @Gedmo\Mapping\Annotation\Locale 
    * Used locale to override Translation listener`s locale 
    * this is not a mapped field of entity metadata, just a simple property 
    * and it is not necessary because globally locale can be set in listener 
    */ 
    private $locale; 

    /** 
    * @Doctrine\ORM\Mapping\OneToMany(
    * targetEntity="TestModule\Entity\ArticleTranslation", 
    * mappedBy="object", 
    * cascade={"persist", "remove"} 
    *) 
    */ 
    private $translations; 


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

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

    public function addTranslation(\TestModule\Entity\ArticleTranslation $t) 
    { 
     if (!$this->translations->contains($t)) { 
      $this->translations[] = $t; 
      $t->setObject($this); 
     } 
    } 


    public function addTranslations($translations) 
    { 
     foreach ($translations as $translation) { 
      $this->addTranslation($translation); 
     } 
    } 

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


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

} 

2)ArticleTranslationエンティティ

namespace TestModule\Entity; 

use Gedmo\Translatable\Entity\MappedSuperclass\AbstractPersonalTranslation; 
/** 
* @Doctrine\ORM\Mapping\Entity 
* @Doctrine\ORM\Mapping\Table(name="test_module_articles_translations", 
*  uniqueConstraints={@Doctrine\ORM\Mapping\UniqueConstraint(name="lookup_unique_idx", columns={ 
*   "locale", "object_id", "field" 
*  })} 
*) 
*/ 
class ArticleTranslation extends AbstractPersonalTranslation 
{ 
    /** 
    * Convinient constructor 
    * 
    * @param string $locale 
    * @param string $field 
    * @param string $value 
    */ 
    public function __construct($locale, $field, $value) 
    { 
     $this->setLocale($locale); 
     $this->setField($field); 
     $this->setContent($value); 
    } 
    /** 
    * @Doctrine\ORM\Mapping\ManyToOne(targetEntity="TestModule\Entity\Article", inversedBy="translations") 
    * @Doctrine\ORM\Mapping\JoinColumn(name="object_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    protected $object; 
} 

3)フォーム

namespace TestModule\Form; 

use Zend\Form\Form; 
use Doctrine\ORM\EntityManager; 
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; 
use TestModule\Form\ArticleTranslationsFieldset; 
use TestModule\Entity\ArticleTranslation; 

class ArticleForm extends Form 
{ 
    protected $entityManager; 

    public function __construct(EntityManager $entityManager,$name = null) 
    { 
     parent::__construct($name); 

     $this->entityManager = $entityManager; 

     $hydrator = new DoctrineHydrator($this->entityManager, 'TestModule\Entity\Article'); 


     $this->setAttribute('method', 'post') 
      ->setHydrator($hydrator) 
      //->setInputFilter($inputFilter) 
     ; 

     $this->add(array(
      'name' => 'id', 
      'type' => 'Hidden', 
     )); 

     $articleFieldset = new ArticleTranslationsFieldset($entityManager); 
     $fieldsetHydrator = new DoctrineHydrator($entityManager, 'TestModule\Entity\ArticleTranslation'); 
     $articleFieldset->setHydrator($fieldsetHydrator)->setObject(new ArticleTranslation('en','name','')); 

     $this->add(array(
      'type' => 'Zend\Form\Element\Collection', 
      'name' => 'translations', 
      'allow_empty' => true, 
      'options' => array(
       'label' => '', 
       'count' => 0, 
       'allow_add' => true, 
       'allow_remove' => true, 
       'target_element' => $articleFieldset, 

      ), 
     )); 


     $this->add(array(
      'name' => 'submit', 
      'attributes' => array(
       'type' => 'submit', 
       'value' => 'Submit' 
      ), 
     )); 


    } 
} 

4)そして翻訳: は、これまでのところ私には、以下の持っていますフィールドセット:

namespace TestModule\Form; 

use Zend\Form\Fieldset; 

class ArticleTranslationsFieldset extends Fieldset 
{ 
    public function __construct() 
    { 

     parent::__construct('translations'); 

     $this->add(array(
      'name' => 'locale', 
      'type' => 'Hidden', 
     )); 

     $this->add(array(
      'name' => 'field', 
      'type' => 'Hidden', 
     )); 

     $this->add(array(
      'name' => 'content', 
      'type' => 'Zend\Form\Element\Text', 
      'options' => array(
       'label' => _(''), 
      ), 
      'attributes' => array(
       'type' => 'text', 
      ), 
     )); 

    } 

} 

この設定では、各言語の名前と説明の両方のプロパティを保存できますが、コンテンツフィールドの種類は管理できません。名前と説明のテキスト要素であり、適切なフィールドを設定できませんラベル。また、ユーザーに提示されたフォームがうまく構成されるように、要素を言語でグループ化することもできません。

他にもこの問題を解決する方法はありますか?私は質問で使用翻訳可能な教義拡張子の解決策を見つけることができませんでした

enter image description here

答えて

0

:私が達成したい何
はこのようなものです。だから別のものを探して、最後に私はPrezent Extension(https://github.com/Prezent/doctrine-translatable)を使って終わります。

この拡張では、翻訳エンティティに翻訳可能フィールドが含まれているため、翻訳エンティティを翻訳フィールドセットと簡単に対応付けることができます。各翻訳エンティティにはロケールプロパティがあり、これをフィールドセット内の非表示フィールドにマップし、それを使用してフォームを目的の方法で表示します。

関連する問題