【问题标题】:Render custom entity type field in form (Symfony)在表单中呈现自定义实体类型字段(Symfony)
【发布时间】:2014-08-15 11:07:29
【问题描述】:

我在尝试自定义表单中特定字段的呈现时卡住了。 它看起来像这样:

$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 如下所示:

玩家: - [复选框输入] 1

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

谢谢

【问题讨论】:

  • 你能显示你的AcmeBundle:Form:fields_child.html.twig吗? :)
  • 那里没什么可看的,它是一个空模板,应该放置缺失的块来渲染玩家。我尝试了几个块名称,但找不到任何有效的方法。

标签: forms symfony entity twig


【解决方案1】:

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

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

【讨论】:

  • 您是否建议制作一个表格 PlayerType 并在以下事项中使用它? $builder->add('players', new PlayerType()); playertype 将在哪里将实体作为父类型?该模板仍然需要渲染复选框,因此我将不得不覆盖整个小部件并删除默认的“选择”渲染块。对吗?
  • 我会在几天内尝试实现这一点,现在时间紧迫。我之前创建了自定义表单类型,但我认为这不是解决我的问题的方法。我们会看到
  • 不是表单类型,而是字段类型(技术上是一样的但是..),你应该这样使用它:$builder->add('players', 'your_custom_type', array(...))
【解决方案2】:

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

控制器动作:

...
$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 %}
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    相关资源
    最近更新 更多