Pertanyaan Terjemahan i18n Form dengan ekstensi Doctrine knp


Saya menggunakan "knp Doktrin diterjemahkan"untuk menerjemahkan Entitas. Sejauh ini bekerja dengan baik. Sekarang saya sampai pada titik di mana saya ingin mendapatkan solusi umum, yang berfungsi untuk sejumlah bahasa. Jadi saya berpikir tentang menggunakan formulir yang diembed (Koleksi) yang akan menangani Translatables untuk Entitas. Sekarang semua berfungsi sebagaimana mestinya, kecuali bahwa untuk menambahkan terjemahan baru, translatable_id tidak disetel. Ada yang sudah mencoba mencapainya juga? Saya hanya ingin tahu apakah ada cara yang lebih mudah untuk melakukannya, untuk menghindari hal-hal yang rumit.

Sejauh ini, sangat bagus, inilah Tipe saya sehingga Anda dapat memahami arsitektur dengan lebih baik.

// 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'
    ));
}
}

Ini adalah LinkTranslationType yang dirender sebagai "satu baris" per bahasa: en_EN Jangkar http // url / en

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'
    ));
}
}

Jadi sebagai contoh, mencoba menambahkan entri baru ini: en_EN Jangkar http // url / en

Saya mendapatkan:

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

Saya sudah mencoba menemukan cara kerja translatable_id, tetapi masih belum sempat memeriksa seluruh sumber. Terakhir, saya mencoba untuk menetapkan diterjemahkan juga, tanpa keberuntungan yang lebih baik. (Pembaruan: di komentar)

Sejauh ini saya bisa:

  • # 1 Masukkan tautan baru, tetapi bukan terjemahan (Mereka disimpan dengan NULL sebagai traslatable_id)
  • # 2 Simpan tautan terjemahan yang ada berfungsi dengan sempurna

Beberapa catatan lain untuk menambahkan beberapa konteks:

1 Saya mencoba:

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

2 Untuk menyimpan terjemahan yang ada Saya baru saja melewati entitas Link yang ada ke form builder

3 Saya tahu bahwa saya dapat mengulang dan menugaskan unsur-unsur yang dapat diterjemahkan menjadi entitas induk

Tetapi itu adalah peretasan yang tidak ingin saya lakukan jika saya memiliki opsi yang lebih baik:

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

Jadi tentu saja ini bukan tipe jawaban yang saya cari :)


5
2017-11-04 17:15


asal


Jawaban:


Anda harus menambahkan a 'by_reference'=>false opsi untuk translations bidang dan kemudian di Anda Link entitas menambahkan metode ini (lihat 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
2017-08-11 21:23