5

也许我忽略了一些东西,希望这很容易完成。

我有一个表格,我最终想要的是以下结果:

字段:

  • 是强制性的/必需的
  • 当前有错误
  • 有帮助

应该在标签和一个额外的 div 之后获得一个额外的a-Tag,如果适用,则填充帮助和/或错误。

我要做的是,必填字段a通过使用以下方式获取 -Tag:

{% use 'form_div_layout.html.twig' with field_label as base_field_label %}

{% block field_label %}
    {{ block('base_field_label') }}

    {% if required %}
        <a href=""><span>&nbsp;</span></a>
    {% endif %}
{% endblock %}

所以,我已经尝试过的是这个的不同版本:

{% use 'form_div_layout.html.twig' with field_label as base_field_label %}

{% block field_label %}
    {{ block('base_field_label') }}

    {% if required or help is defined %}
        <a href=""><span>&nbsp;</span></a>
    {% endif %}
{% endblock %}

{% block field_row %}
    {% spaceless %}
        <div class="row">
            {% if required or help is defined %}
                <div>
                    {{ form_errors(form) }}
                    {{ help }}
                </div>
            {% endif %}

            {{ form_label(form) }}
            {{ form_widget(form, { 'attr': {'class': 'grid_4'} }) }}
        </div>          
    {% endspaceless %}
{% endblock field_row %}

我无法让它工作。

所以我的问题是:

  • 我从哪里获得帮助文本,它也可以包含 HTML?我在form builder没有成功的情况下尝试了这个 - 但至少有一个例外:

    $builder    ->add('subject', 'text', array(
        'label' => 'Subject',
        'help' => 'Can be formatted content with <strong>HTML-Elements</strong>',
        ));
    
  • 如何判断当前字段有错误(将类添加到行),如果有,也显示它?{{ form_errors(form) }}没有输出任何东西,无论我把它放在 `field_row˚.

4

2 回答 2

6

没有帮助文本,您必须为字段创建表单扩展并将其添加到默认选项。

SF 2.1 Beta 1 中的示例:

namespace Webility\Bundle\WebilityBundle\Form\Extension;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormViewInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class HelpFormTypeExtension extends AbstractTypeExtension
{

    public function buildView(FormViewInterface $view, FormInterface $form, array $options){
        $view->setVar('help', $options['help']);
    }

    public function getExtendedType(){
        return 'field';
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'help' => null
        ));
    }
}

并将其注册为服务:

<service id="webility.form.extension.help" class="Webility\Bundle\WebilityBundle\Form\Extension\HelpFormTypeExtension">
        <tag name="form.type_extension" alias="field" />
</service> 

对于错误问题:您是否有任何错误要打印?如果验证失败,请在控制器中检查:

echo '<pre>'; print_r( $form->getErrorsAsString() ); echo '</pre>'; exit;
于 2012-07-13T07:43:08.600 回答
0

如我的问题Maciej Pyszyński's anwser中所述解决它非常有帮助。

在这种情况下,我以另一种方式解决了它,我也想在这里发布。根据手册“添加“帮助”消息”,我构建了这个:

注意此解决方案不能与 twig 一起使用formbuilder,需要在 twig 中进行一些调整。

获取帮助 ''-tags(实际上它们现在是 div)......</h3>
{% block field_label %}
    {{ block('base_field_label') }}

    {% if attr.class is defined and '_hint' == attr.class %}
        <div>
            <a><span class="help">Help Icon</span></a>
            <div class="tooltip">
                {% if help is defined %}
                    {{ help|raw }}
                {% else %}
                    Somebody forgot to insert the help message
                {% endif %}
            </div>
        </div>
    {% endif %}
{% endblock %}

在错误中获得正确的类

{% block field_row %}
    {% spaceless %}
        <div class="row{% if form_errors(form) %} error{% endif %}">
            {{ form_label(form) }}
            {{ form_widget(form, { 'attr': {'class': 'grid_4'} }) }}
        </div>
    {% endspaceless %}
{% endblock field_row %}

以及来自模板的调用

<div class="row{% if form_errors(form.url) %} _error{% endif %}">
    {{ form_label(form.field, null, { 'attr': {'class': '_hint'}, 'help': 'Help text or variable containing it' }) }}
    {{ form_widget(form.field, { 'attr': {'class': 'grid_4'} }) }}
</div>
于 2012-07-19T08:41:42.947 回答