Symfony2表单集合限制

时间:2016-01-26 19:04:58

标签: forms symfony

我有一个Course实体,有很多CourseSessionsCourseSession可以有效已通过

如何仅渲染有效 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()?我认为这会对我有所帮助。

2 个答案:

答案 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');
}

我希望它对某些人有用。