Bonjour,

Voila je rencontre un petit problème avec mon code, je travaille sur un site de réservation de salles de classe.

Ce que je fais et ce que je souhaite

Je souhaite sur ma page "Réserver" (book), que les utilisateurs lancent une recherche pour voir toutes les salles disponibles à la réservation en fonction de la date d'arrivée (dateFrom), de la date de fin (dateTo), ainsi qu'en fonction de deux filtres (la capacité minimale et les options de la salle).
Lorsque je veux rendre ma page, j'obtiens une erreur qui m'indique que ma variable $rooms est vide. Ce qui est normal car la variable $rooms est censé contenir l'ensemble des salles disponibles à la réservation et que le formulaire n'a pas été traité. Mais comment faire pour que le formulaire avant de vouloir utiliser mes variables $rooms et $search (vide aussi au passage).
Voici mon controller, la classe de ma recherche, ma vue ainsi que le RoomRepository.

    /**
     * @Route("/book/{id_user}", name="booking.new")
     * @param Request $request
     * @param RoomRepository $roomRepository
     * @return Response
     */
    public function book(Request $request, RoomRepository $roomRepository)
    {
        $search = new RoomSearch();
        $form = $this->createForm(RoomSearchType::class, $search);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()
        {
            $rooms = $roomRepository->getAvailableRooms($search);
        }
        return $this->render("profile/booking/book.html.twig", array(
            'form' => $form->createView(),
            'rooms' => $rooms,
            'search' => $search
        ));
    }
{% block body %}
<body>
    <div class="jumbotron transparence">
        <div class="container">
            <h1>Réserver</h1>
            <h4>Au nom de :  <b>{{ app.user.name }} {{ app.user.lastName }} </b></h4>
            {{ form_start(form) }}
            <div class="row">
                <div class="col">
                    {{ form_row(form.title)}}
                </div>
            </div>
            <div class="row">
                <div class="col">
                    {{ form_row(form.dateFrom) }}
                </div>
                <div class="col">
                    {{ form_row(form.dateTo) }}
                </div>
            </div>
            <div class="row">
                <div class="col">
                    {{ form_row(form.minCapacity)}}
                </div>
            </div>
            <div class="row">
                <div class="col">
                    {{ form_row(form.options)}}
                </div>
            </div>
            <button class="btn btn-primary">Rechercher</button>
            {{ form_end(form) }}

        </div>
    </div>

    <div class="jumbotron transparence">
        <div class="container">
            <table class="table">
                <thead>
                    <tr>
                        <th>Salle</th>
                        <th>Disponibilité</th>
                        <th>Capacité</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody>
                    {% for room in rooms %}
                        <tr>
                            <td>{{room.title}}</td>
                            <td>Disponible</td>
                            <td>{{ room.capacity }}</td>
                            {% if room.authorization == 1 %}
                                <td>
                                    <a class="btn btn-success" href="{{ path('book.new.room', {'id_user': app.user.id, 'id_room': room.id, 'date_in': search.dateFrom, 'date_out': search.dateTo, 'title': search.title, 'state': 1}) }}">Réserver maintenant</a>
                                </td>
                            {% elseif room.authorization == 0 %}
                                <td>
                                    <a class="btn btn-info" href="{{ path('book.new.room', {'id_user': app.user.id, 'id_room': room.id, 'date_in': search.dateFrom, 'date_out': search.dateTo, 'title': search.title, 'state': 0}) }}">Demander la réservation</a>
                                    <a tabindex="0" class="btn btn-link" role="button" data-toggle="popover" data-trigger="focus" title="Pourquoi une demande de réservation ?" data-content="Cette salle nécessite l'accord d'un responsable pour que la réservation ait bien lieu">
                                        <span class="fas fa-question-circle"></span>
                                    </a>
                                </td>
                            {% endif %}
                        </tr>
                    {% endfor %}
                </tbody>
            </table>
        </div>
    </div>
</body>
class RoomRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Room::class);
    }

    public function getAvailableRooms(RoomSearch $search)
    {
        $em = $this->getEntityManager();

        $qb = $em->createQueryBuilder();

        $date_start = $search->getDateFrom()->format('Y-m-d H:i:s');
        $date_final = $search->getDateTo()->format('Y-m-d H:i:s');

        $nots = $em->createQuery("
        SELECT IDENTITY (b.room) FROM App:Booking b
            WHERE NOT (b.endAt   < '$date_start'
            OR
            b.beginAt > '$date_final')
        ");

        $dql_query = $nots->getDQL();
        $qb->resetDQLParts();

        $query = $qb->select('r')
            ->from('App:Room', 'r')
            ->andWhere($qb->expr()->notIn('r.id', $dql_query ));

        if ($search->getMinCapacity())
        {
            $query =  $query
                ->andWhere('r.capacity >= :mincapacity')
                ->setParameter('mincapacity', $search->getMinCapacity());
        }

        if ($search->getOptions()->count() > 0)
        {
            $k = 0;
            foreach ($search->getOptions() as $option)
            {
                $k++;
                $query = $query
                    ->andWhere(":option$k MEMBER OF r.options")
                    ->setParameter("option$k", $option);
            }
        }

        try
        {
            return $query->getQuery()->getResult();
        }
        catch (\Doctrine\ORM\NoResultException $e)
        {
            return null;
        }
    }
}
class RoomSearch
{
    /**
     * @var string
     */
    private $title;

    /**
     * @var DateTime
     */
    private $dateFrom;

    /**
     * @var DateTime
     */
    private $dateTo;

    /**
     * @var int|null
     */
    private $minCapacity;

    /**
     * @var ArrayCollection
     */
    private $options;

    public function __construct()
    {
        $this->options = new ArrayCollection();
    }

    /**
     * @return string
     */
    public function getTitle(): ?string
    {
        return $this->title;
    }

    /**
     * @param string $title
     * @return RoomSearch
     */
    public function setTitle(string $title): RoomSearch
    {
        $this->title = $title;
        return $this;
    }

    /**
     * @return DateTime
     */
    public function getDateFrom(): ?DateTime
    {
        return $this->dateFrom;
    }

    /**
     * @param DateTime $dateFrom
     * @return RoomSearch
     */
    public function setDateFrom(DateTime $dateFrom): RoomSearch
    {
        $this->dateFrom = $dateFrom;
        return $this;
    }

    /**
     * @return DateTime
     */
    public function getDateTo(): ?DateTime
    {
        return $this->dateTo;
    }

    /**
     * @param DateTime $dateTo
     * @return RoomSearch
     */
    public function setDateTo(DateTime $dateTo): RoomSearch
    {
        $this->dateTo = $dateTo;
        return $this;
    }

    /**
     * @return int|null
     */
    public function getMinCapacity(): ?int
    {
        return $this->minCapacity;
    }

    /**
     * @param int|null $minCapacity
     * @return RoomSearch
     */
    public function setMinCapacity(int $minCapacity): RoomSearch
    {
        $this->minCapacity = $minCapacity;
        return $this;
    }

    /**
     * @return ArrayCollection
     */
    public function getOptions(): ArrayCollection
    {
        return $this->options;
    }

    /**
     * @param ArrayCollection $options
     * @return RoomSearch
     */
    public function setOptions(ArrayCollection $options): RoomSearch
    {
        $this->options = $options;
        return $this;
    }
}

Merci beaucoup !

Aucune réponse