我有一个Course
实体,有很多CourseSessions
。 CourseSession
可以有效或已通过。
如何仅渲染有效 CourseSessions
并与CourseSessions
编辑页面上的传递 Course
保存关系?< / p>
现在我渲染所有CourseSessions
,但当CourseSession
计数超过50时,页面渲染速度非常慢。
任何人都可以帮助我吗? 感谢。
更新1:
class CourseType {
$builder->add('sessions', 'collection', array(
'label' => false,
'type' => new CourseSessionType(), // <- here I want to pass only active Sessions
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'prototype_name' => '__name__'
))
}
class CourseSessionType {
// multiple CourseSession fields
}
// Course edit page
<div id="courseSessions" data-prototype="{{macros.course_session_prototype(form.sessions, 'Remove Session', true)|escape }}">
{% do form.sessions.setRendered %}
{% for widget in form.sessions.children %}
{{ macros.course_session_prototype(widget, 'Remove Session', false) }}
{% endfor %}
</div>
更新2:
如何将'type' => new CourseSessionType()
映射到getActiveCourseSessions()
和setActiveCourseSessions()
?我认为这会对我有所帮助。
答案 0 :(得分:0)
尝试将字段名称设置为使用active_course_sessions
进行映射的方法,或者如果您为方法命名Course::getActiveSessions()
并Course::setActiveSessions()
,则可以更短地设置字段名称:
class CourseType {
$builder->add('active_sessions', 'collection', array(
'label' => false,
'type' => new CourseSessionType(),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'prototype_name' => '__name__'
));
}
答案 1 :(得分:0)
我很想告诉你我找到了解决办法!
我在Course
实体中添加了$showOnlyActiveSessions
属性并更改了getSessions()
方法
class Course
{
/**
* Show only active sessions flag
* @var bool
*/
private $showOnlyActiveSessions = false;
// other properties
/**
* Get course sessions
* @return CourseSession []
*/
public function getSessions()
{
$sessions = $this->sessions;
if ($this->getShowOnlyActiveSessions()) {
return array_filter($sessions->toArray(), function($session) {
return !$session->isPast();
});
}
return $this->sessions;
}
/**
* @return bool
*/
public function getShowOnlyActiveSessions()
{
return $this->showOnlyActiveSessions;
}
/**
* @param bool $boolValue
*/
public function setShowOnlyActiveSessions($boolValue)
{
$this->showOnlyActiveSessions = $boolValue;
}
}
现在,当我只需要获得活动会话时,我会在我的控制器中执行以下操作:
public function editAction(Request $request, Course $course)
{
$course->setShowOnlyActiveSessions(true);
$editForm = $this->createEditForm($course);
$editForm->handleRequest($request);
if ($editForm->isValid()) {
// handle and persist form
}
return $this->redirectToRoute('course_list');
}
我希望它对某些人有用。