如何控制树枝中标记的复选框顺序
How to control marked checkbox order in twig
所以我在用 twig 列出一系列复选框时遇到了这种奇怪的行为
看到新页面,它显示一切正常,并说我正在拯救这个实验室
ok,我保存了实验室,现在进入编辑页面
标记的复选框首先显示,破坏了新页面上的字母顺序。
我需要编辑页面与新页面完全一样,但我不知道如何在 twig 上组织这些复选框。
呈现复选框的块:
{% block _appbundle_laboratory_laboratoryExams_row %}
<div class="form-group">
{{ form_label(form) }}
<div class="col-md-10 col-md-offset-2">
<div class="app-checkbox-collection">
<p>{{ 'laboratory.field_laboratory' | trans }}</p>
{% dump(form) %}
{% for child in form %}
{% if child.exam.vars.data.type == constant('AppBundle\Entity\ExamLaboratory::TYPE')%}
{{ form_widget(child.permission, {
'attr' : {
'class' : 'exam-checkbox'
},
'label' : child.exam.vars.data.name
}) }}
{% endif %}
{% endfor %}
<p>{{ 'laboratory.field_image' | trans }}</p>
{% for child in form %}
{% if child.exam.vars.data.type == constant('AppBundle\Entity\ExamImage::TYPE')%}
{{ form_widget(child.permission, {
'attr' : {
'class' : 'exam-checkbox'
},
'label' : child.exam.vars.data.name
}) }}
{% endif %}
{% endfor %}
</div>
</div>
</div>
{% endblock %}
我不在葡萄牙语 Whosebug 上提问,因为那里没有人回答 symfony 问题,可能很少有用户
编辑:
这是构建表单:
实验室
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', null, array(
'label' => 'laboratory.name',
'attr' => array('class' => 'focus')
))
->add('leader', null, array(
'label' => 'laboratory.leader'
))
->add('city', null, array(
'label' => 'laboratory.city',
'placeholder' => 'action.select_one'
))
->add('laboratoryExams', 'collection', array(
'label' => 'laboratory.laboratoryExams',
'type' => new LaboratoryExamType(),
'allow_delete' => true,
'by_reference' => false,
))
;
}
实验室考试
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('permission', null, array(
'label' => 'laboratoryexam.permission',
))
->add('exam', null, array(
'label' => 'laboratoryexam.exam',
))
;
}
我会说它与树枝无关。
这将在构造带复选框的表单的表单类型对象上设置。
数据似乎是在表单创建时以编程方式填充的,已经选择的选项是第一个。
如果不是这种情况或者您遇到了一些问题,请使用表单类型代码和获取复选框数据的代码来编辑您的问题。
您可以在构建表单时设置复选框的顺序:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('permission', 'entity', [
'class' => 'Acme\AppBundle\Entity\Parameter',
'multiple' => true,
'expanded' => true,
'query_builder'=> function(EntityRepository $repository) {
return $repository->createQueryBuilder('exam')->orderBy('exam.title', 'ASC');
},
]);
}
感谢您的回答,我通过在表单中使用 ArrayCollection 找到了解决方案。
$iterator = $form->get('laboratoryExams')->getData()->getIterator();
$iterator->uasort(function ($a, $b) {
return ($a->getExam()->getName() < $b->getExam()->getName()) ? -1 : 1;
});
$form->get('laboratoryExams')->setData(new ArrayCollection(iterator_to_array($iterator)));
IMO 这应该是默认设置的,我相信没有人愿意让复选框乱成这样
所以我在用 twig 列出一系列复选框时遇到了这种奇怪的行为
看到新页面,它显示一切正常,并说我正在拯救这个实验室
ok,我保存了实验室,现在进入编辑页面
标记的复选框首先显示,破坏了新页面上的字母顺序。
我需要编辑页面与新页面完全一样,但我不知道如何在 twig 上组织这些复选框。
呈现复选框的块:
{% block _appbundle_laboratory_laboratoryExams_row %}
<div class="form-group">
{{ form_label(form) }}
<div class="col-md-10 col-md-offset-2">
<div class="app-checkbox-collection">
<p>{{ 'laboratory.field_laboratory' | trans }}</p>
{% dump(form) %}
{% for child in form %}
{% if child.exam.vars.data.type == constant('AppBundle\Entity\ExamLaboratory::TYPE')%}
{{ form_widget(child.permission, {
'attr' : {
'class' : 'exam-checkbox'
},
'label' : child.exam.vars.data.name
}) }}
{% endif %}
{% endfor %}
<p>{{ 'laboratory.field_image' | trans }}</p>
{% for child in form %}
{% if child.exam.vars.data.type == constant('AppBundle\Entity\ExamImage::TYPE')%}
{{ form_widget(child.permission, {
'attr' : {
'class' : 'exam-checkbox'
},
'label' : child.exam.vars.data.name
}) }}
{% endif %}
{% endfor %}
</div>
</div>
</div>
{% endblock %}
我不在葡萄牙语 Whosebug 上提问,因为那里没有人回答 symfony 问题,可能很少有用户
编辑:
这是构建表单:
实验室
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', null, array(
'label' => 'laboratory.name',
'attr' => array('class' => 'focus')
))
->add('leader', null, array(
'label' => 'laboratory.leader'
))
->add('city', null, array(
'label' => 'laboratory.city',
'placeholder' => 'action.select_one'
))
->add('laboratoryExams', 'collection', array(
'label' => 'laboratory.laboratoryExams',
'type' => new LaboratoryExamType(),
'allow_delete' => true,
'by_reference' => false,
))
;
}
实验室考试
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('permission', null, array(
'label' => 'laboratoryexam.permission',
))
->add('exam', null, array(
'label' => 'laboratoryexam.exam',
))
;
}
我会说它与树枝无关。
这将在构造带复选框的表单的表单类型对象上设置。
数据似乎是在表单创建时以编程方式填充的,已经选择的选项是第一个。
如果不是这种情况或者您遇到了一些问题,请使用表单类型代码和获取复选框数据的代码来编辑您的问题。
您可以在构建表单时设置复选框的顺序:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('permission', 'entity', [
'class' => 'Acme\AppBundle\Entity\Parameter',
'multiple' => true,
'expanded' => true,
'query_builder'=> function(EntityRepository $repository) {
return $repository->createQueryBuilder('exam')->orderBy('exam.title', 'ASC');
},
]);
}
感谢您的回答,我通过在表单中使用 ArrayCollection 找到了解决方案。
$iterator = $form->get('laboratoryExams')->getData()->getIterator();
$iterator->uasort(function ($a, $b) {
return ($a->getExam()->getName() < $b->getExam()->getName()) ? -1 : 1;
});
$form->get('laboratoryExams')->setData(new ArrayCollection(iterator_to_array($iterator)));
IMO 这应该是默认设置的,我相信没有人愿意让复选框乱成这样