我正在尝试开发一种表格,让学生从几个小组中选择课程。定义如下:
- 课程有名称/描述/小时。
- 课程属于组,有名称/描述/时间限制(例如,您必须从该组中选择 5 个学分,或者您最多只能从该组中选择 10 小时)
- 课程组被组织成一个程序提供,它可能有其他字段
所以我希望表格允许学生选择课程,但课程是按这些组组织的,并附有关于选择多少个的说明。学分部分将使用自定义验证规则进行验证。
这是我正在考虑的代码的一个想法(省略了很多名称空间/学说映射/等)。
实体有点像这样:
class Offering
{
// has multiple CourseGroups
private $groups;
}
class CourseGroup
{
// which Offering it belongs to
private $offering;
private $name;
private $maxHours;
}
class Course
{
// which CourseGroup it belongs to
private $group;
private $name;
private $hours;
}
// User submits an application with chosen courses from multiple groups
class Application
{
// ...
private $courses;
}
// Joins the Applications to Courses (N to N)
class ApplicationCourse
{
// which Application
private $application;
// which Course
private $course;
}
但我试图弄清楚如何把它放在一个表格中。我不介意将表单绑定到一个数组并稍后将其排序以将其放入Application
.
class ApplicationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// ...other fields
;
// Add the groups of courses to choose
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function(FormEvent $event) use ($offering) {
$form = $event->getForm();
// Here I would like to add 1 EntityType per Offering
// The EntityType allows the user to select multiple Courses within that group
$i = 0;
foreach ($offering->groups as $group) {
// Maybe add the $group as a static block in the twig template here
// Ideally the form should show the group name/description
// I'll probably borrow from this class https://github.com/genemu/GenemuFormBundle/blob/master/Form/Core/Type/PlainType.php
// This adds a group of checkboxes to select a course from this group
$form->add('course_'.$i, 'entity', array(
'class' => 'Acme\DemoBundle\Entity\Course',
'property' => 'name',
'multiple' => true,
'expanded' => true,
'query_builder' => function(EntityRepository $er) use ($group) {
// imagine this ia a query that selects all courses in the $group
return $er->createGroupCoursesQueryBuilder($group);
},
);
$i++;
}
}
);
}
public function getName()
{
return 'task';
}
}
最后,我想要一个看起来像这样的表单:
科学:选择至少 4 个学分
- [x] SCI100(2 小时)
- [ ] SCI101(2小时)
- [ ] SCI102(2小时)
数学:选择至少 4 个学分
- [ ] MTH100(4 小时)
- [x] MTH101(4 小时)
{组名}:{组描述}
- [{selected?}] {COURSE NAME} {COURSE HOURS}
等等。
这种方法会奏效吗?有没有更好的方法,这样我就不必将该表单绑定到一个数组,然后在验证后重新组装它?