实体字段的其他属性在Symfony2中的表单中键入

Str*_*rnm 5 php forms entity properties symfony

在Symfony2中,有没有办法将实体中的更多字段映射到从基于实体的表单生成的选择下拉列表的选项标签?

我目前有类似的东西:

    $builder->add('creditcard', 'entity',
        array( 'label' => 'Credit Card',
            'required' => true,
            'expanded' => false,
            'class' => 'Acme\Bundle\Entity\CreditCard',
            'property' => 'display_text',
            'multiple' => false,
            'query_builder' => function(\Acme\Bundle\Repository\CreditCardRepository $er)  {
                return $er->createQueryBuilder('b');
            },
            'mapped' => false,
        ));
Run Code Online (Sandbox Code Playgroud)

这很好用,但我想生成类似的东西:

<option value="id" string_mapped_from_field1="value_of_field1">display_text</option>
Run Code Online (Sandbox Code Playgroud)

谢谢!

Str*_*rnm 14

好的,如果有人带着同样的问题来到这里,这就是我最终所做的:

我创建了一个自定义字段类型(请参阅http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html)

由于我们最终将成为一个实体字段,您要添加:

    public function getParent() {
        return 'entity';
    }
Run Code Online (Sandbox Code Playgroud)

在表格上使用时:

    $builder->add('creditcard', new CreditCardFieldType(),
        array( 'label' => 'Credit Card',
            'required' => true,
            'expanded' => false,
            'class' => 'Acme\Bundle\Entity\CreditCardCharge',
            'property' => 'object',
            'multiple' => false,
            'query_builder' => function(\Acme\Bundle\Repository\CreditCardChargeRepository $er)  {
                return $er->createQueryBuilder('b');
            },
            'mapped' => false,
        ));
Run Code Online (Sandbox Code Playgroud)

object是添加到包含整个对象的实体的新属性,因此我添加到实体:

public function getObject()
{
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

这样我们就可以从模板访问对象了,我们只需要为自己的自定义字段类型创建一个新模板:

{% block creditcard_widget %}
    {% spaceless %}
        {% if required and empty_value is none and not empty_value_in_choices %}
            {% set required = false %}
        {% endif %}
        <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
            {% if empty_value is not none %}
                <option value=""{% if required and value is empty %} selected="selected"{% endif %}>{{ empty_value|trans({}, translation_domain) }}</option>
            {% endif %}
            {% if preferred_choices|length > 0 %}
                {% set options = preferred_choices %}
                {{ block('choice_creditcard_widget_options') }}
                {% if choices|length > 0 and separator is not none %}
                    <option disabled="disabled">{{ separator }}</option>
                {% endif %}
            {% endif %}
            {% set options = choices %}
            {{ block('choice_creditcard_widget_options') }}
        </select>
    {% endspaceless %}
{% endblock creditcard_widget %}

{% block choice_creditcard_widget_options %}
    {% spaceless %}
        {% for group_label, choice in options %}
            {% if choice is iterable %}
                <optgroup label="{{ group_label|trans({}, translation_domain) }}">
                    {% set options = choice %}
                    {{ block('choice_creditcard_widget_options') }}
                </optgroup>
            {% else %}
                <option value="{{ choice.data.creditcard }}" charge="{{  choice.data.charge }}" {% if choice is selectedchoice(data.creditcard_charges_id) %} selected="selected"{% endif %}>{{ choice.data.text|trans({}, translation_domain) }}</option>
            {% endif %}
        {% endfor %}
    {% endspaceless %}
{% endblock choice_creditcard_widget_options %}
Run Code Online (Sandbox Code Playgroud)

并在config.yml中为twig注册它:

twig:
    form:
        resources:
            - 'AcmeBundle:Form:creditcardfield.html.twig'
Run Code Online (Sandbox Code Playgroud)

不确定它是最好的解决方案,但它可以解决问题.希望能帮助到你.