Php 如何在symfony窗体上隐藏单个标签?

Php 如何在symfony窗体上隐藏单个标签?,php,forms,symfony1,label,Php,Forms,Symfony1,Label,我正在一个symfony项目上创建一个非常定制的表单,目前我有如下内容: foreach ($foo as $c) { $fields['crit_v_'.$c->getId()]=new sfWidgetFormInput(array('label'=>'')); $fields['crit_m_'.$c->getId()]=new sfWidgetFormTextarea(array('label'=>__($c->getName

我正在一个symfony项目上创建一个非常定制的表单,目前我有如下内容:

foreach ($foo as $c) {
        $fields['crit_v_'.$c->getId()]=new sfWidgetFormInput(array('label'=>''));
        $fields['crit_m_'.$c->getId()]=new sfWidgetFormTextarea(array('label'=>__($c->getName(),array(),'messages')));
    }
<form action="<?php echo url_for('evaluation_submit')?>" method="post">
<?php echo $form['id']?>
<div> <!-- with label -->
    <?php echo $form['foo']->renderLabel() ?>
    <?php echo $form['foo']->renderError() ?>
    <?php echo $form['foo'] ?>
</div>
<div> <!-- without label -->
    <?php echo $form['bar']->renderError() ?>
    <?php echo $form['bar'] ?>
</div>
<?php include_partial('form', array('form' => $form)) ?>
正如您所看到的,每个元素有2个输入,但我只希望第二个元素有一个标签。将第一个标签设置为
null
'
不会使symfony不呈现此标签并显示此标签的默认文本。(这意味着for输入标记为
crit\u v\u xx


有没有隐藏特定表单标签的简单方法?

要将symfony表单中单个字段的标签设置为空白:

$your_form->widgetSchema->setLabel('the_field_id', ' ');

它将呈现
标记,但其中有一个空格,因此它们不会在浏览器上输出任何内容您可以创建自定义行格式,定义字段的呈现方式(如果您没有使用自定义模板)。我在这里面找到的

一个好的解决方案可能是重写
formatRow
方法:

public function formatRow($label, $field, $errors = array(), $help = '', $hiddenFields = null)
{
    if(strip_tags($label) == '__UNSET__')
    {
        return strtr($this->getRowFormat(), array(
            '%label%'         => null,
            '%field%'         => $field,
            '%error%'         => $this->formatErrorsForRow($errors),
            '%help%'          => $this->formatHelp($help),
            '%hidden_fields%' => is_null($hiddenFields) ? '%hidden_fields%' : $hiddenFields,
        ));
    }
    else
    {
        return strtr($this->getRowFormat(), array(
            '%label%'         => $label,
            '%field%'         => $field,
            '%error%'         => $this->formatErrorsForRow($errors),
            '%help%'          => $this->formatHelp($help),
            '%hidden_fields%' => is_null($hiddenFields) ? '%hidden_fields%' : $hiddenFields,
        ));
    }
}
然后将
\uuuu UNSET\uuuu
设置为那些不应呈现其标签的字段的标签

或者,您甚至可以根据标签名称使用自定义行格式,以防止输出标签的封闭标签。

行格式看起来像这样
%field%%help%%error%%hidden_fields%
,并将传递该行格式,而不是
$this->getRowFormat()

我最终得到以下结果:

我创建了一个单独的模板文件,名为
\u form.php
,如下所示:

foreach ($foo as $c) {
        $fields['crit_v_'.$c->getId()]=new sfWidgetFormInput(array('label'=>''));
        $fields['crit_m_'.$c->getId()]=new sfWidgetFormTextarea(array('label'=>__($c->getName(),array(),'messages')));
    }
<form action="<?php echo url_for('evaluation_submit')?>" method="post">
<?php echo $form['id']?>
<div> <!-- with label -->
    <?php echo $form['foo']->renderLabel() ?>
    <?php echo $form['foo']->renderError() ?>
    <?php echo $form['foo'] ?>
</div>
<div> <!-- without label -->
    <?php echo $form['bar']->renderError() ?>
    <?php echo $form['bar'] ?>
</div>
<?php include_partial('form', array('form' => $form)) ?>

在该操作的主模板中,我包括如下表单:

foreach ($foo as $c) {
        $fields['crit_v_'.$c->getId()]=new sfWidgetFormInput(array('label'=>''));
        $fields['crit_m_'.$c->getId()]=new sfWidgetFormTextarea(array('label'=>__($c->getName(),array(),'messages')));
    }
<form action="<?php echo url_for('evaluation_submit')?>" method="post">
<?php echo $form['id']?>
<div> <!-- with label -->
    <?php echo $form['foo']->renderLabel() ?>
    <?php echo $form['foo']->renderError() ?>
    <?php echo $form['foo'] ?>
</div>
<div> <!-- without label -->
    <?php echo $form['bar']->renderError() ?>
    <?php echo $form['bar'] ?>
</div>
<?php include_partial('form', array('form' => $form)) ?>

如果将标签设置为false,则symfony将根本不会呈现
标记。False的行为与null或“”不同


您可以在generator.yml中禁用它

filter:
  fields:
    name: { label: false }

很抱歉,我想键入一个空格,如果您输入一个空字符串,它将不起作用(正如您已经知道的)。这样,它将呈现标记,但其中有一个空格,因此它们不会在浏览器上输出任何内容。这有点可疑,但它对我有用。。。