以表单形式呈现自定义实体类型字段(Symfony)

时间:2014-08-15 11:07:30

标签: forms symfony entity twig

我在尝试自定义表单中特定字段的呈现时遇到困难。 它看起来像这样:

$builder->add('players', 'entity', array(
        'class' => 'Acme\Bundle\Entity\Player',
        'expanded' => true,
        'multiple' => true,
        'required' => false,
    ));

表单本身的呈现方式很简单:

{% block form_content %}
    {% form_theme form 'AcmeBundle:Form:fields_child.html.twig' %}
    {{ form_widget(form) }}
{% endblock %}

现在在fields_child.html.twig里面,我从另一个表单模板扩展,但没有什么特别之处。 我的HTML看起来像这样:

玩家:   - [checkbox-input] 1

其中1等于数据库中唯一玩家的id。然而,不是渲染ID我试图在复选框后渲染他的图片和全名。 我已经尝试了多种形式主题的组合来覆盖它但每次都失败了。 有人可以发布树枝块来渲染我想要的东西吗?

由于

2 个答案:

答案 0 :(得分:2)

您必须为其创建自定义表单字段类型以及自定义窗口小部件模板。

http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html

答案 1 :(得分:0)

我最近遇到了这个问题(情况有点不同。我需要将产品显示为带复选框的表格。),Form的子数据总是返回null值,这就是为什么我最终用这个(脏:))解决方案:

控制器操作:

...
$productRepository = $entityManager->getRepository('VendorMyBundle:Product');

$products = [];
$formChildren = $productListForm->createView()->children;
foreach ($formChildren['products'] as $formProduct) {
    $formProductId = $formProduct->vars['value'];
    $productEntity = $productRepository->find($formProductId);
    $products[$formProductId] = $productEntity;
}
...
return $this->render('TEMPLATE', [
    'productListForm' => $productListForm->createView(),
    'products' => $products,
]);

模板:

...
     {% for productForm in productListForm.products %}
        {% set id = productForm.vars.value %}
        <tr>
            <td class="check">
                {{ form_widget(productForm) }}
            </td>

            <td class="photo">
                {% if products[id].getImages().isEmpty() == false %}
                    {% set productImage = products[id].getImages().first() %}
                    <img src="{{ productImage.getWebPath() | imagine_filter('st_product_cabinet_thumbnail') }}" />
                {% else %}
                    <span class="no-image">No image</span>
                {% endif %}
            </td>

            <td class="title">
                <a href="{{ path('ROUT', {'productSlug':products[id].getSlug()}) }}" target="_blank">{{ products[id].getName() }}</a>
            </td>

            <td class="status">
                {{ products[id].getStatusName(products[id].getStatus()) }}
            </td>

            <td class="price">
                <ul>
                    {% for productPrice in products[id].getPrices() %}
                        <li>{{ productPrice.getValue() ~ ' ' ~ productPrice.getCurrencyCode() }}</li>
                    {% endfor %}
                </ul>
            </td>
        </tr>
    {% endfor %}
    ...