symfony2:删除小部件属性

时间:2013-10-28 21:35:17

标签: symfony attributes

当我创建表单时:

    $builder = $this->createFormBuilder();
    $form = $builder->add( 'add', 'button')->getForm();

并渲染它:

    <div><button type="button" id="form_add" name="form[add]">Add</button></div>

创建属性类型,ID和名称。

我想删除这些属性,但我不知道该怎么做。我试过这样做:

    $builder = $this->createFormBuilder();
    $form = $builder->add( 'add', 'button', array( 'attr' => array() ) )->getForm();

没有任何成功。

我怎么能这样做?

问候和感谢

2 个答案:

答案 0 :(得分:0)

我搞砸了一段时间,而我最接近的就是用空属性渲染它们。但是,这是因为我测试的项目是 Symfony 2.0 ,在该版本中,由于Symfony\Component\Form\FormView::$varsprivate,因此无法完全删除属性。

但是,在 Symfony 2.1 及更高版本中,同一属性为public,因此您应该能够直接修改(或删除)属性/变量,而不受{{{{1}的约束。 1}} api。

首先,创建自己的类型来表示这个“裸体按钮”

<强>的src /你/捆绑/窗体/ NakedButtonType.php

FormView

现在,告诉服务容器如何构建类型

应用/配置/ config.yml

<?php

namespace Your\Bundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;

class NakedButtonType extends AbstractType
{
  /**
   * (non-PHPdoc)
   * @see Symfony\Component\Form.FormTypeInterface::getName()
   */
  public function getName()
  {
    return "naked_button";
  }

  /**
   * (non-PHPdoc)
   * @see Symfony\Component\Form.AbstractType::getParent()
   */
  public function getParent(array $options)
  {
    return 'button';
  }

  /**
   * (non-PHPdoc)
   * @see Symfony\Component\Form.AbstractType::buildViewBottomUp()
   */
  public function buildViewBottomUp(FormView $view, FormInterface $form)
  {
    // Symfony 2.0
    // This will still render the attributes, but they will have no value
    $view->set('id', null);
    $view->setAttribute('type', null);

    // Symfomy >= 2.1
    // This *should* remove them completely
    unset( $view->vars['id'] );
    unset( $view->vars['attr']['type'] );
  }
}

然后更新您的父表单以使用您的新类型而不是ootb“按钮”类型。

services:
  form.type.naked_button:
    class: Your\Bundle\Form\NakedButtonType
    tags:
      - {name: form.type, alias: naked_button}

所有这一切......

如果您希望这些按钮没有任何属性,为什么不直接将它们直接放入您的视图中?

$builder = $this->createFormBuilder();
$form = $builder->add( 'add', 'naked_button')->getForm();

所有这些自定义类型的废话似乎都有很多开销来呈现你显然不需要Symfony为你管理的东西。

答案 1 :(得分:0)

虽然不是一个好主意,但我会帮助你加载枪并射击自己的脚: - )

创建一个新的Resources / views / Form / fields.html.twig文件,并在其中加入以下内容:

{% block widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ full_name }}"{% if read_only %} readonly="readonly"{% endif %}{% if disabled %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %}
    {% for attrname, attrvalue in attr %}{% if attrname in ['placeholder', 'title'] %}{{ attrname }}="{{ attrvalue|trans({}, translation_domain) }}" {% else %}{{ attrname }}="{{ attrvalue }}" {% endif %}{% endfor %}
{% endspaceless %}
{% endblock widget_attributes %}

如果你真的想要删除那里的所有属性,你可以删除{%for attrname ...%}行。这将从所有表单字段中删除属性。如果添加一些逻辑,则可以将其应用于特定字段。

下一步,您需要注册字段助手。在app / config / config.yml文件中,添加以下行:

twig:
    form:
        resources:
            - 'SomeBundle:Form:fields.html.twig'