这是我关于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,
));
}
}
答案 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;
}