0

当我创建了一个表单时:

    $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();

没有任何成功。

我怎么能做到?

问候和感谢

4

2 回答 2

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'
于 2013-10-28T22:43:33.193 回答
0

我搞砸了一段时间,我能得到的最接近的方法是让它们渲染为空属性。但是,那是因为我测试的项目是Symfony 2.0,并且在那个版本中,不可能完全删除属性,因为Symfony\Component\Form\FormView::$varsis private

但是,在Symfony 2.1和更高版本中,相同的属性是这样的public,因此您应该能够直接修改(或删除)属性/变量,而不受FormViewapi 的限制。

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

src/Your/Bundle/Form/NakedButtonType.php

<?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'] );
  }
}

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

应用程序/配置/config.yml

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

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

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

说了这么多...

如果你想要这些按钮没有任何属性,为什么不直接把它们放在你的视图中呢?

<form>
  {{ form_errors(form) }}
  {{ form_rest(form) }}
  <div>
    <button>Add</button>
  </div>
</form>

所有这些自定义类型的废话似乎都需要大量开销来渲染您显然不需要 Symfony 为您管理的东西。

于 2013-10-28T22:37:45.580 回答