Добавление префикса к метке формы для перевода - PullRequest
4 голосов
/ 02 января 2012

У меня есть несколько *Type классов форм и forms.html.twig для настройки внешнего вида формы.По умолчанию в этом файле метки отображаются с помощью этого блока:

<label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>{{ label|trans }}</label>

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

<label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>
  {{ 'Customer.' ~ label|trans }}
</label>

Я хочу, чтобы была возможность передать эту строку 'Customer' в FormBuilder таким образомчто я могу использовать это как:

<label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>
  {{ prefix ~ '.' ~ label|trans }}
</label>

или, может быть:

<label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>
  {{ form.prefix ~ '.' ~ label|trans }
}</label>

Кто-нибудь знает, как этого добиться?

Ответы [ 4 ]

2 голосов
/ 16 февраля 2012

Существует простое решение: «Расширение типа»

Создайте такой класс:

<?php

namespace MyProject\MyBundle\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;

class FieldTypeExtendedExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->setAttribute('label_prefix', $options['label_prefix']);
    }

    public function buildView(FormView $view, FormInterface $form)
    {
        $labelPrefix = $form->getRoot()->hasAttribute('label_prefix') ? $form->getRoot()->getAttribute('label_prefix') : '';
        $view->set('label', $labelPrefix.$form->getAttribute('label'));
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'label_prefix' => '',
        );
    }

    public function getExtendedType()
    {
        return 'field';
    }
}

Объявить это расширение как услугу

<service id="form.type_extension.fieldextended" class="MyProject\MyBundle\Form\Extension\FieldTypeExtendedExtension">
    <tag name="form.type_extension" alias="field" />
</service>

И используйте эту опцию в вашей форме:

$form = $this->createFormBuilder($entity, array('label_prefix' => 'mylabelprefix.'))
    ->add('link', 'url')
    ->getForm();

У вас будет ярлык "mylabelprefix.link".

Наслаждайтесь!

2 голосов
/ 24 июня 2012

с Symfony 2.1

<?php
namespace MyProject\MyBundle\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;

class FieldTypeExtendedExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->setAttribute('label_prefix', $options['label_prefix']);
    }

    public function buildView(FormViewInterface $view, FormInterface $form, array $options)
    {
        $labelPrefix = $form->getRoot()->hasAttribute('label_prefix') ? $form->getRoot()->getAttribute('label_prefix') : '';
        $view->setVar('label', $labelPrefix.$view->getVar('label'));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'label_prefix' => ''
        ));
    }

    public function getExtendedType()
    {
        return 'form';
    }
}

Объявить это расширение как услугу

<service id="form.type_extension.fieldextended" class="MyProject\MyBundle\Form\Extension\FieldTypeExtendedExtension">
    <tag name="form.type_extension" alias="form" />
</service>

Для получения дополнительной информации см. Документацию .

2 голосов
/ 02 января 2012

Для этого просто установите метку явно:

$builder->add('firstName', 'text', array(
    'label' => 'customer.first_name'
));
0 голосов
/ 28 мая 2014

Я обнаружил, что данный ответ не работает, но я не могу комментировать. Причина, по которой это не сработало, заключается в том, что методы $view->getVar() и $view->setVar() на самом деле не существуют. Чтобы получить эту работу, мне пришлось сделать так, чтобы мой buildView() метод выглядел так:

public function buildView(Form\FormView $view, Form\FormInterface $form, array $options)
{
    if ($options['label_prefix']) {
        $view->vars['label'] = $options['label_prefix'] . ': ' . $view->vars['label'];
    }
}

затем установите для него значение по умолчанию, равное нулю, например:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults([
        'label_prefix' => null,
    ]);
}

Надеюсь, это поможет!

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