Как заказать перевод с непереведенными полями, используя переводимые расширения doctrine knp с формой перевода A2lix?
Я ищу простой способ редактировать переведенные поля в форме symfony2. Я использую переводимые доктрины knp расширения для перевода сущности. Форма смешивается с не переведенными свойствами в специальном порядке. Форма должна отображаться (конец редактирования) только на активном языке. Например:
$builder
->add('key')
->add('translate1','text',array(
'property_path' => 'translations[de].translate1',
))
->add('mynumber')
->add('translate2','text',array(
'property_path' => 'translations[de].translate2',
))
Если языковых переводов [de] не существует, я получаю ошибку: "Не удается прочитать свойство"translate1"из массива... "
Форма перевода A2LiX не является решением, поскольку она отображает все переводимые поля в одном списке.
Есть идеи?
3 ответа
Если вам нужно отобразить поля формы в определенном порядке (используя A2lix), вы можете сделать это, как в этом примере:
$builder
->add('key')
->add('mynumber')
->add('translations', 'a2lix_translations', [
'required_locales' => ['de'], <-- your current locale
'fields' => [
'translate1' => [
# your field options
],
'translate2' => [
# your field options
],
))
Тогда в представлении:
{% import "A2lixTranslationFormBundle::macros.html.twig" as a2lixTranslations %}
{{ form_errors(form_edit) }}
{{ form_start(form_edit) }}
{{ form_row(form_edit.key) }}
{{ a2lixTranslations.partialTranslations(form_edit.translations, ['translate1']) }}
{{ form_row(form_edit.mynumber) }}
{{ a2lixTranslations.partialTranslations(form_edit.translations, ['translate2']) }}
{{ form_end(form_edit) }}
На самом деле я решил свою проблему с помощью пользовательского типа с двумя прослушивателями событий для установки и получения значений переводов:
/**
* build fields
* @param \Symfony\Component\Form\FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
/**
* merge new translation
*/
$builder->addEventListener(FormEvents::SUBMIT, function(FormEvent $event) use ($options) {
//test
$form = $event->getForm();//form
$data = $event->getData();//products
$newTranslation = $event->getData();
$key=$options['translation_property'];
$lang=$this->getLocale($options);
$entity=$form->getParent()->getData();
$setter='set'.strtoupper($key);
$getter='get'.strtoupper($key);
$entity->translate($lang)->$setter($newTranslation);
$entity->mergeNewTranslations();
});
/**
* Populate with data
*/
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) use ($options) {
$data = $event->getData();//products
$form = $event->getForm();//form
$key=$options['translation_property'];
$lang=$this->getLocale($options);
$entity=$form->getParent()->getData();
$setter='set'.strtoupper($key);
$getter='get'.strtoupper($key);
$oldValue=$entity->translate($lang,false)->$getter();//no fallback
$event->setData($oldValue);
});
}
Поля не отображаются. Название свойства перевода и язык могут быть предоставлены напрямую.
/**
* Defauls
* @param \Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'translation_path'=>'translations',
'translation_property' => null,
'translation_lang'=>null,//getLocale or set in form type
'mapped'=>false
));
}
И тип наследует от основного текста.
public function getParent()
{
return 'text';
}
Определив его как службу расширения веток (translation_text), вы можете использовать его довольно просто:
$builder
->add('name')
->add('key')
->add('translate1', 'translation_text',
array(
'translation_property'=>'translate1',
'translation_lang'=>null
))
Если это возможно в вашем случае, переместите поле в нужном порядке. Как это:
class Foo {
private $translate1;
private $translate2;
}
Работал на меня