Как вводить переводы сущностей, используя одну форму (Symfony используя Gedmo \ Transurable) - PullRequest
0 голосов
/ 05 июля 2019

Я работаю на многоязычном веб-сайте и хочу, чтобы пользователи могли создавать Категории (и другие объекты) на многих языках.

Вот выдержка из моей сущности Категория:

PHP

<?php
/**
 * @ORM\Entity(repositoryClass="App\Repository\CategoryRepository")
 */
class Category implements Translatable
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

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

    // ... getters and setters ...

}
?>

Gedmo хранит все переводы для всех моих сущностей в таблице с такой структурой:

--------------------------------------------------------------
| id | locale | object_class | field | foreign_key | content |
--------------------------------------------------------------

Где object_class относится к классу сущностей (например, App \ Entity \ Category), а foreign_key относится к текущей переведенной сущности.

На самом деле переводы хорошо отображаются в соответствии с текущей локалью вurl, и контент адаптируется, когда пользователь меняет язык.

Пользователь также может добавлять некоторые категории, вот мой CategoryType:

<?php
class CategoryType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, [
                'attr' => [
                    'placeholder' => 'Category name'
                ],
                'label' => 'Category name',
            ])
            ->add('description', TextareaType::class, [
                    'required' => false,
                    'attr' => [
                        'placeholder' => 'Category description',
                    ],
                    'label' => 'Category description',
                ]
            )

            ->add('send', SubmitType::class, [
                'label' => 'Send'
            ])
            ->add('image', FileType::class, [
                'label' => 'Illustration',
                "mapped" => false,
                "required" =>false,
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Category::class,
        ]);
    }
}?>

Дело в том, что когда новыйкатегория добавлена, имя и описание устанавливаются только для текущей локали.Когда мы хотим обновить категорию для данной локали, пользователь должен перейти к форме, но с использованием локали, для которой он хочет изменить категорию.

Это функционально, но не совсем просто.

Я попробовал комплект a2lix , но последняя версия больше не совместима с Gedmo, и я хотел бы избежать создания EntityTranslation со всеми переводимыми полями для Entity.

Итак, вот мой вопрос: можно ли разрешить пользователю вводить имена и описания для разных языков, используя только одну форму?

1 Ответ

0 голосов
/ 05 июля 2019

Некоторое время назад я был в той же ситуации, что и вы, но я использовал DoctrineBehaviors bundle .Я решил эту проблему, используя встроенные формы Symfony (версия 2.5).Основная идея решения заключается в управлении двумя объектами в одной форме, где один объект будет иметь поля, которые не нужно переводить, а другой будет содержать поля, которые необходимо перевести.Затем должны быть созданы две формы, и одна будет содержать другую, как показано в следующем коде:

  • VideoType.php :

    use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\CallbackValidator; use Symfony\Component\Form\FormBuilder; use Doctrine\ORM\EntityRepository; use Sistema\FilmsBundle\Form\VideoTranslationType; class VideoType extends AbstractType{ public function buildForm(FormBuilderInterface $builder, array $options){ $builder ->add('showreelTranslation', 'collection', array('type' => new VideoTranslationType())) ->add('contenido','textarea', array('required' => true,'max_length' => 1500)) ->add('publico','choice', array( 'choices' => array( '1' => 'Si', '0' => 'No', ), 'required' => true, 'multiple' => false, 'expanded'=>true ) ) ; } public function getName(){ return 'sistema_adminbundle_videotype'; } } ?>
  • VideoTranslationType.php :

    пространство имен Sistema \ FilmsBundle \ Form;

    use Symfony \ Component \ Form \ AbstractType;использовать Symfony \ Component \ Form \ FormBuilderInterface;используйте Symfony \ Component \ OptionsResolver \ OptionsResolverInterface;

    класс VideoTranslationType расширяет AbstractType {/ ** * @param FormBuilderInterface $ builder * @param array $ options * / открытая функция buildForm (FormBuilderInterface $ builder, array $ options {)$ builder -> add ('titulo', 'text', array ('max_length' => 149, 'required' => true)) -> add ('descripcion', 'text', array ('max_length' =>199, 'required' => true))
    -> add ('publicar', 'submit');}

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Sistema\FilmsBundle\Entity\ShowreelTranslation'
        ));
    }
    
    /**
     * @return string
     */
    public function getName()
    {
        return 'sistema_filmsbundle_videotranslation';
    }
    

    }

Кроме того, я оставляю исходный код контроллера и шаблон ветки.

VideoController.php video.html.twig

PS: в этой ссылке есть руководство по использованию DoctrineBehaviors, если оно вам необходимо

Iнадеюсь, я помог:)

...