2014-11-04 8 views
5

Używam "knp Doctrine Translatable" do tłumaczenia jednostek. Jak na razie działa świetnie. Teraz dochodzę do punktu, w którym chciałbym mieć ogólne rozwiązanie, które działa dla dowolnej ilości języków. Tak więc myślę o użyciu osadzonego formularza (Kolekcje), który będzie obsługiwać Translatables dla Entity. Teraz wszystko działa tak, jak powinno, z tym wyjątkiem, że w celu dodania nowego tłumaczenia nie można ustawić ID tłumaczenia. Czy ktoś próbował to osiągnąć? Zastanawiałem się, czy jest łatwiejszy sposób, aby uniknąć komplikacji.Tłumaczenia i18n z tłumaczeniem knp Rozszerzenie Doctrine

Jak dotąd, tak dobrze, tutaj idź do moich typów, abyś mógł lepiej zrozumieć architekturę.

// Main type that has a linkTranslationType with the translations 
class linkType extends AbstractType { 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 

    $builder 
     ->add('name', 'text', array(
      'label' => 'Name' 
     )) 

     ->add('translations', 'collection', array(
       'type' => new linkTranslationType(), 
       'label' => false, 
       'allow_add' => true, 
       'allow_delete' => true 
      )); 

} 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'MyBundle\Entity\Link' 
    )); 
} 
} 

To LinkTranslationType, który jest wyświetlany jako "rzędzie" za język: en_EN Anchor http // URL/pl

class linkTranslationType extends AbstractType { 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 

    $builder 
     ->add('locale', 'text',array(
      'label' => 'Anchor' 
     )) 

     ->add('linkText', 'text',array(
      'label' => 'Anchor' 
     )) 

     ->add('linkUrl', 'text', array(
      'label' => 'Url' 
     )) 


    ; 

} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'MyBundle\Entity\LinkTranslation' 
    )); 
} 
} 

tak, na przykład, starając się dodać nowy wpis: en_EN Kotwica http // url/pl

dostaję:

id translatable_id  linkText linkUrl  locale 
7 NULL    Anchor  http//url/en en_EN 

Próbowałem odkryć, jak działa usługa tłumaczenia, ale wciąż nie miałem czasu na sprawdzenie całego źródła. Wreszcie, próbowałem ustawić również TranslatableId, bez większego szczęścia.(Aktualizacja: w komentarzach)

Dotychczas mogłem:

  • # 1 Włóż nowy związek, ale nie tłumaczenia (są one zapisywane null jako traslatable_id)
  • # 2 Zapisz istniejące tłumaczenia łącza prace doskonałymi

Niektóre inne notatki, aby dodać trochę kontekstu:

1 próbowałem:

$link = new Link(); 
if ($form->isValid()) { 
$link->mergeNewTranslations(); // but this also does assigm the Id to the translations 
} 

2 Aby zapisać istniejące tłumaczenie Właśnie przeszedł istniejący podmiot Link do konstruktora formularza

3 Wiem, że mogłem pętlę i przypisać tłumaczyć elementy jednostki nadrzędnej

Ale to jest hack, którego nie chcę zrobić, jeśli mam lepszą opcję:

// persist($link); and flush() 
foreach ($link->getTranslations() as $linkTranslation) { 
    $linkTranslation->setTranslatable($link); 
    $em->persist($linkTranslation); 
} 
$em->flush(); 

Tak oczywiście nie jest to rodzaj odpowiedzi szukam :)

+0

Po przyjrzeniu się bliżej źródłu: doktryna-bahaviors/src/Model/Translatable/TranslationMethods Teraz wiem, że dodanie "tłumaczalnego" (Type: entity) do typu linkTranslationType mogę ustawić id_dokumentu. Ale jest trochę uciążliwe przy zbieraniu formularzy i tak dalej. Muszę znaleźć łatwiejszą konfigurację. Jeśli więc ktoś osiągnął to w inny sposób, daj mi znać. –

+0

Cześć! Mam podobny problem i nie wiem, jak do niego podejść. Próbowałem Twojego rozwiązania, ale pojawia się ten błąd: ani właściwość "tłumaczenia", ani jedna z metod "getTranslations()", "translations()", "isTranslations()", "hasTranslations()", "__get()" istnieje i ma publiczny dostęp w klasie "SocialCar \ CoreBundle \ Entity \ Accessory". – petekaner

+1

Witam, próbowałem tego rozwiązania dla Symfony 3. i postępowałem zgodnie z instrukcjami z tego ref. adres URL http://a2lix.fr/bundles/translation-form/3.x.html. Błąd jest następujący: ani właściwość "tłumaczenia" ani jedna z metod "getTranslations()", "translations()", "isTranslations()", "hasTranslations()", "__get()" istnieją i mają publiczny dostęp w klasie "CLASS_PATH" .. Proszę dać mi znać, jeśli masz rozwiązanie. Stworzyłem dwie strony treści: Strony treści i Przetwarzanie stron treści. –

Odpowiedz

0

Należy dodać opcję 'by_reference'=>false pola translations a następnie w swojej jednostce Link dodać te metody (patrz https://symfony.com/doc/current/form/form_collections.html)

public function addTranslation(LinkTranslation $t) 
{ 
    $t->setTranslatable($this); 
    $this->getTranslations()->add($t); 
} 

public function removeTranslation(LinkTranslation $t) 
{ 
    $this->getTranslations()->remove($t); 
} 
+0

Nie zdążyłem jeszcze tego wypróbować, jeśli ktoś może to wypróbować i działa, upvote –