Symfony Forms - 如何更改CollectionTypes Items标签

时间:2016-02-12 12:25:58

标签: symfony collections types label symfony-forms

这是我关于stackoverflow的第一个问题;直到现在我只是寻找我的问题的答案并找到它们。但现在似乎我有一个没人或至少没有人在这里偶然发现。

关于我的问题:

在我的班级FieldType extends AbstractType中,我想更改CollectionType项的标签。

这适用于所有包含的项目,但我想单独设置标签:

$translations = $builder->create("translations", CollectionType::class, array(
            "label" => "Translations",
            "type" => TranslationType::class,
            "entry_options" => array(
                'label' => "THIS IS A TEST"
            )
        ));

在这里,我向CollectionType添加新类型并尝试设置每个项目的标签:

foreach ($this->field->getTranslations() as $translation) {
            /** @var Language $language */
            $iso2 = strtolower($translation->getLanguage()->getIso2());
            $translation = $builder->create("translation_{$iso2}", TranslationType::class, array(
                'label' => $iso2,
                )
            );
            $translations->add($translation);
        }
$builder->add($translations);

但它们不会显示在模板中;我想这里收集的索引显示为(0,1,...)。 (见Rendered Translations FormView

这是我的TranslationType

class TranslationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add("label");
        $builder->add("placeholder");
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Translation::class,
        ));
    }
}

2 个答案:

答案 0 :(得分:1)

我通过搜索完全相同的问题来到这里。

0,1,...可能是您实体的ArrayCollection的键。但这并没有帮助。

以下方法并不漂亮,但它们应该可行。我正在看这个帖子以获得更好的建议......

方法1

在FormType类中,添加:

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

...


/** 
 * this gets called in the final stage before rendering the form
 */   
public function finishView(FormView $view, FormInterface $form, array $options)
{
    foreach ($view['translations']->children as $childView)
    {
        // here you have access to all child form vars, assigned entities, etc
        $childView->vars['label'] = ''; // set label here
    }
}

方法2:

根据http://symfony.com/doc/current/cookbook/form/form_customization.html

自定义模板

而不是{{ form_label() }},请使用其他内容:)

正如我所说,它并不漂亮,但希望它有所帮助。

答案 1 :(得分:-1)

感谢答案@Karolis。以防万一这对其他人可能很有趣。我也在尝试自定义单个收集项的标签时遇到此问题,并且我试图通过树枝这样做一段时间:

{% for key, child in successStoryForm.content.children %}
                <div id="successStory_content">
                    <div class="form-group">
                        <div id="{{ child.vars.id }}">
                            <div class="form-group">
                                <label class="control-label required" for="{{ child.vars.id }}_text">{{ contentHeaders[key] }}</label>
                                <textarea id="{{ child.vars.id }}_text" name="{{ child.vars.full_name }}[text]" required="required" class="form-control" placeholder="<p>Dein Text</p>"><p>Dein Text_2</textarea>

                                <span class="help-block">
                                    <ul class="list-unstyled">
                                        <li>
                                            <span class="glyphicon glyphicon-exclamation-sign"></span>
                                            {{ dump(child.vars.errors) }}
                                        </li>
                                    </ul>
                                </span>

                            </div>
                        </div>
                    </div>
                </div>
            {% endfor %}

这实际上正确显示了标签,但是,我无法正确显示错误。他们总是空着。

在我的主要表单类型中,我使用以下方式添加此集合:

->add('content', CollectionType::class, [
            'entry_type'    => SuccessStoryContentType::class,
            'required'      => true,
            'entry_options' => [
                'label'     => false,
            ],
        ])

SuccessStoryContentType是具有一些验证的简单表单类型(此处省略)

$builder
        ->add('text', TextareaType::class);

要使其正常工作,我必须对儿童的表单视图进行更深入的研究:

 foreach ($view['content']->children as $key => $childView)
    {
        $childView->vars['form']->children['text']->vars['label'] = $label;
    }