Bonjour,
Je suis en train de faire un site Test pour une chaines d'hotel.

Le probleme que j'ai est que je n'arrive pas a faire ressortir un formulaire quand je clique sur un hotel, genre je clique sur Hotel de cannes je voudrais avoir un formulaire avec que les chambres qui ont etait crée dans cet hotel.
Il m'indique l'erreur suivante :

Object of class App\Entity\Rooms could not be converted to string[]

J'ai une Entité Hotel (Avec les différents hotel que mon Admin crée), j'en est une Rooms (Qui prend l'id de l'hotel pour pouvoir les afficher dans mon Controller Rooms) et j'en est une Booking ($startDate qui prend une date d'arrivé, $endDate qui prend une date de départ, $hotel qui est reliée a mon Entity Hotel en ManyToOne, $bookers qui est reliée a mon entity User en ManyToOne et $rooms qui est relier a mon entity Rooms en ManyToOne.

Quand je crée un hotel il s'ajoute bien a la liste des autres Hotels, quand je crée une chambre pour un hotel il s'ajoute bien a la page de l'hotel en question. Mais quand je suis dans la page de l'hotel est que je clique sur reserver une chambre y a mon probleme.

Voici mon Controller Available :

` #[Route('/available', name: 'app_available')]
public function index(Request $request): Response
{
$booking = new Booking();
$bookingForm = $this->createForm(BookingType::class, $booking);
$bookingForm->handleRequest($request);

    if ($bookingForm->isSubmitted() && $bookingForm->isValid()) {

        $suiteAvailable = $this->entityManager->getRepository(Booking::class)->findAll();
        $startDate = $booking->getStartDate();
        $endDate = $booking->getEndDate();

        $rooms = $booking->getRooms();

        foreach ($suiteAvailable as $room) {
            if (
                $rooms == $room->getRooms()
                && (
                    ($startDate >= $room->getStartDate() && $startDate < $room->getEndDate())
                    ||
                    ($endDate > $room->getStartDate() && $endDate <= $room->getEndDate())
                    ||
                    ($room->getStartDate() >= $startDate && $room->getStartDate() <= $endDate)
                )
            ) {
                $this->addFlash('warning', 'Les dates que vous avez choisies sont déjà prise, pour cette chambre.');
                return $this->redirectToRoute('app_available');
            } else if (
                $room->getStartDate() < $room->getEndDate()
            ) {
                $this->addFlash('warning', 'La date d\'arrive est inférieur à la date de depart.');
                return $this->redirectToRoute('app_available');
            }
        }
        $this->addFlash('success', 'Les dates que vous avez choisies sont libre. Pour réserver cette chambre merci de vous inscire.');
        return $this->redirectToRoute('app_available');
    }

    $room = $this->entityManager->getRepository(Rooms::class)->findAll();
    $hotel = $this->entityManager->getRepository(Hotel::class)->findAll();

    return $this->render('available/index.html.twig',
        [
            'room' => $room,
            'hotel' => $hotel,
            'bookingForm' => $bookingForm->createView(),
        ]
    );
}

}`

Mon formulaire bookingType :

`class BookingType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('startDate', DateType::class,
[
'label' => 'Arrivée le : ',
'widget' => 'single_text',
'attr' => [
'class' => 'bookingDate'
]
])

        ->add('endDate', DateType::class,
        [
            'label'=>'Départ le :',
            'widget' => 'single_text',
            'attr' => [
                'class' => 'bookingDate'
            ]
        ])

        ->add('rooms', EntityType::class,
        [
            'class' => Rooms::class,
        ])

        ->add('submit', SubmitType::class,
        [
            'label' => "Réserver"
        ])
    ;
}

public function configureOptions(OptionsResolver $resolver): void
{
    $resolver->setDefaults([
        'data_class' => Booking::class,
    ]);
}

}
`
Je sais que dans mon controller je n'est pas le Flush n'y le Persist, car je veux juste dans un premier temp que si mon utilisateur n'est pas connecter il peux comme meme verifier si une chambre est libre.

Merci pour vos solution.

8 réponses


Bonjour
as tu une fonction __to string dans ton entity Rooms?

public function __toString()
    {
        return $this->getName(); // tu choisis l'attribut que tu veux retourner en string
    }
Ced06440
Auteur

Non je vais essayé

Ced06440
Auteur

Merci cela a marché, s'aurait tu comment je peux garder mon ID hotel pour plusieurs page ???
Exemple je suis sur l'hotel de Cannes et je vois les chambres qu'il propose, et je veux quand il clique sur voir les dispo je reste sur l'hotel de Cannes. Car la il me met toutes les chambres de tous les hotels.

Ced06440
Auteur

Merci a toi

Je pense que pour ton soucis il faut chercher du côté du query builder. Soit tu fais une fonction dans ton repository que tu appelles ensuite dans ton formulaire soit tu l'as fait directement dans ton formulaire.
Dans ton formulaire, dans le champs rooms ça pourrait ressembler à ça :

->add('rooms', EntityType::class,
        [
            'class' => Rooms::class,
            'query_builder' => function($roomRepo) {
                return $roomRepos->createQueryBuilder('r')->where('r.id = 1');
            }        
        ])

La meilleur pratique il me semble c'est de les faire dans le Repository directement.

Ced06440
Auteur

Je comprend pas trop ce systeme. Désolé.
La quand je clique sur mon voir les dipo de mes chambres dans l'URL je reste bien dans mon id.hotel http://127.0.0.1:8000/available/6 et avant j'etais dans http://127.0.0.1:8000/rooms/6. donc ca conserve bien mon ID hotel. mais la ca me met Key "id" for array with keys "0, 1, 2, 3, 4, 5, 6" does not exist.

Ce que tu veux faire c'est un formulaire dynamique. Je m'y connais pas assez pour plus t'aiguiller. Mais ça ça peut peut-être t'aider : https://youtube.com/playlist?list=PLlxQJeQRaKDTRPbnUb8WtcLsmujZcAznu.

Vector files are created by mathematical formulas to place points on a grid. The blocks with colors that are commonly called pixels comprise the raster file. Vector format file can be infinitely adjusted in size and resolution without losing resolution. This makes them more flexible for certain types of work as opposed to raster files.