Symfony2: 1 форма для редактирования переводимого объекта - PullRequest
12 голосов
/ 16 ноября 2011

У меня есть переводимая сущность, использующая переводимое поведение доктрины2.

Я пытаюсь построить форму, которая выглядит следующим образом:

   | French |English| Spanish |
+--+--------|       |---------+------------+
|                                          |
| name:  [___my_english_name___]           |
|                                          |
| title: [___my_english_title__]           |
|                                          |
+------------------------------------------+

Order:  [___1___]
Online: (x) Yes
        ( ) No

Итак, в принципе, есть порядок& онлайн-атрибуты объекта, которые нельзя перевести, и атрибут name и title, которые имеют переводимое поведение.

В случае, если мой рисунок не ясен: форма содержит по 1 вкладке на локаль, которая содержит поле, котороеявляются переводимыми.

Проблема, с которой я столкнулся, заключается в том, что по умолчанию Symfony2 связывает форму с сущностью, но доктрина переводимого поведения вынуждает меня иметь одну сущность на локаль.Лично поведение доктрины в порядке (и мне это нравится), но я не могу создать форму, позволяющую мне редактировать сущность во всех локалях - в одной форме.

Пока что яосновная форма:

namespace myApp\ProductBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

/**
 * Form for the productGroup.
 */
class ProductType extends AbstractType
{
    /**
     * Decide what field will be present in the form.
     *
     * @param FormBuilder $builder FormBuilder instance.
     * @param array       $options Custom options.
     *
     * @return null;
     */
    public function buildForm(FormBuilder $builder, array $options)
    {
        //Todo: get the available locale from the service.
        $arrAvailableLocale = array('en_US', 'en_CA', 'fr_CA', 'es_ES');

        //Render a tab for each locale
        foreach ($arrAvailableLocale as $locale) {
            $builder->add(
                'localeTab_' . $locale,
                new ProductLocaleType(),
                array('property_path' => false, //Do not map the type to an attribute.
                     ));
        }


        //Uni-locale attributes of the entity.
        $builder
            ->add('isOnline')
            ->add('sortOrder');


    }

    /**
     * Define the defaults options for the form building process.
     *
     * @param array $options Custom options.
     *
     * @return array Options with the defaults values applied.
     */
    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'myApp\ProductBundle\Entity\Product',
        );
    }

    /**
     * Define the unique name of the form.
     *
     * @return string
     */
    public function getName()
    {
        return 'myapp_productbundle_producttype';
    }
}

и табуляция:

<?php

namespace MyApp\ProductBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

use invalidArgumentException;

/**
 * Form for the productGroupLocale tabs.
 */
class ProductLocaleType extends AbstractType
{
    /**
     * Decide what field will be present in the form.
     *
     * @param FormBuilder $builder FormBuilder instance.
     * @param array       $options Custom options.
     *
     * @return null;
     */
    public function buildForm(FormBuilder $builder, array $options)
    {


        $builder->add('name', 'text', array('data' => ???));
        $builder->add('title', 'text', array('data' => ???));

    }

    /**
     * Define the defaults options for the form building process.
     *
     * @param array $options Custom options.
     *
     * @return array Options with the defaults values applied.
     */
    public function getDefaultOptions(array $options)
    {
        return array(
            //'data_class' => 'MyApp\ProductBundle\Entity\Product',
            'name' =>  '',
            'title' => '',
        );
    }

    /**
     * Define the unique name of the form.
     *
     * @return string
     */
    public function getName()
    {
        return 'myapp_productbundle_productlocaletype';
    }
}

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

Ответы [ 3 ]

6 голосов
/ 19 ноября 2011

Привет, если вы используете gedmo extensions Перевод не предназначен для обработки нескольких переводов за запрос.Попробуйте использовать альтернативу knplabs может быть лучшим вариантом для более общих действий.

4 голосов
/ 29 ноября 2012

Возможно, вас заинтересует TranslationFormBundle , который добавляет тип формы для работы с расширением DoctrineTranshable.

0 голосов
/ 14 декабря 2011

Я проверял расширение Translator, и даже если оно интересно, оно не соответствовало нашим потребностям. (По сути, все найденные нами примеры требуют, чтобы мы изменили локаль сайта, чтобы отредактировать сущность в другой локали. Я не знаю китайский, и я не хочу, чтобы мой интерфейс был на китайском, но яу меня есть перевод, который я должен скопировать / вставить. Кажется странным объяснить, что это действительно просто в каждой твердой CMS, которую вы там найдете, но я искал немного сложнее, чтобы выполнить такую ​​функциональность CMS с помощью Symfony.)

Итак, мы разработали решение и создали пакет BreadGeneratorBundle, которым решили поделиться: https://github.com/idealtech/BreadGeneratorBundle

На момент публикации он еще находился в стадии разработки, ноего можно использовать в качестве альтернативы CrudGenerator для создания формы для переводимого объекта.

Нам также удается использовать расширение Gedmo - даже если Гедиминас сказал, что оно не предназначено для многократного перевода;)

Надеюсь, это кому-нибудь поможет!:)

...