Tengo una entidad Course, que tiene muchas CourseSessions. CourseSession puede estar activo o aprobado .

¿Cómo puedo procesar solo activo CourseSessions y guardar relaciones con aprobado CourseSessions en la Course página de edición?

Ahora renderizo todo CourseSessions pero cuando CourseSession cuenta más de 50, la página se renderiza muy lentamente.

¿Alguien puede ayudarme? Gracias.

ACTUALIZACIÓN 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>

ACTUALIZACION 2:

¿Cómo puedo asignar mi 'type' => new CourseSessionType() con getActiveCourseSessions() y setActiveCourseSessions()? Creo que me ayudará.

-1
D.Dimitrioglo 26 ene. 2016 a las 22:04

2 respuestas

La mejor respuesta

¡Me alegra decirte que encontré la solución!

Agregué en mi entidad Course una propiedad $showOnlyActiveSessions y cambié el método 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;
    }
}

Y ahora, cuando necesito obtener solo sesiones activas, hago lo siguiente en mi controlador:

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

Espero que sea de ayuda para alguien.

0
D.Dimitrioglo 30 ene. 2016 a las 10:28

Intente establecer el nombre del campo de acuerdo con el método a mapear usando active_course_sessions o más corto si nombra sus métodos Course::getActiveSessions() y Course::setActiveSessions() se podría hacer así:

class CourseType {
    $builder->add('active_sessions', 'collection', array(
        'label' => false,
        'type' => new CourseSessionType(),
        'allow_add' => true,
        'allow_delete' => true,
        'prototype' => true,
        'prototype_name' => '__name__'
    ));
}
0
Heah 30 ene. 2016 a las 08:09