Bonjour,

Dans le cadre de l'encodage d'une annonce, je passe l'entité "Advert" à une fonction de mon controller. Cette fonction va permettre d'appeler le formulaire permettant d'ajouter des périodes à l'annonce :

    /**
     *  @Route("/road_trip/{id}/periodsManagement", name="road_trip_periodsManagement")
     */
    public function periodsForm(Advert $advert, Request $request, ObjectManager $manager) {

        $numberPeriods = count($advert->getPeriods());

        $form = $this->createForm(PeriodsAdvertType::class, $advert);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
...
            $manager->persist($advert);
            $manager->flush();
...
       }

        return $this->render('road_trip/createPeriods.html.twig', ['form' => $form->createView(), 'editMode' => $numberPeriods > 0]);
   }

Dans mon template, j'ai un bouton qui me permet de créer de nouvelles périodes dynamiquement en cliquant siur un bouton "Ajouter une période". Les inputs nécessaires sont alors créés via du Jquery.

Mon souci est que si je désire créer une seule période, pas de souci, celle-ci est bien créée en base de données. Par contre, dès que je désire en enregistrer plusieurs, j'obtiens l'erreur suivante :

"Warning: Illegal offset type"

Dans mon entité "Period", ma période est liée de cette manière à mon annonce :

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Advert", inversedBy="periods")
     * @ORM\JoinColumn(nullable=false)
     */
    private $advert;

Et dans mon annonce, on retrouve les différentes périodes :

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Period", mappedBy="advert", cascade={"persist"}, orphanRemoval=true)
     */
    private $periods;

Je ne parviens pas à comprendre l'origine du problème. Quelqu'un aurait une idée?

Merci d'avance pour votre aide.

2 réponses


dubitoph
Auteur

J'ai découvert la source du problème, sans en connaître la solution

L'erreur vient de cette partie de code, dans la fonction du controller :

                foreach ($periods as $period) {

                    $period->setAdvert($advert);
                    $startPeriod = $period->getStart();
                    $endPeriod = $period->getEnd();

                    if (($startPeriod >= $dayDate && $startPeriod <= $endCkeckedPeriod)  || ($endPeriod >= $dayDate && $endPeriod <= $endCkeckedPeriod)) {

                        for ($i = $startPeriod; $i <= $endPeriod; $i = $i->modify("+ 1 day")) { 

                            $daysCovered[] = $i;

                        }        

                    }

Apparemment, je ne peux pas boucler sur un datetime en incrémentant celui-ci...

dubitoph
Auteur

Voilà, j'ai résolu mon problème en utilisant un objet de type DatePeriod que je viens de découvrir :

                $endCkeckedPeriod = new DateTime("+ " . $this->getParameter('minimum_creation_periods'));
                $daysCovered = array();

                $interval = new \DateInterval('P1D');
                $daysCovered = array();

                foreach ($periods as $period) {

                    $startDate = $period->getStart();
                    $endDate = $period->getEnd();

                    $daterange = new \DatePeriod($startDate, $interval, $endDate);

                    if (($startDate >= $dayDate && $startDate <= $endCkeckedPeriod) || ($endDate >= $dayDate && $endDate <= $endCkeckedPeriod)) {

                        foreach ($daterange as $periodDate){

                            $daysCovered[] = $periodDate;
                            $daysCovered[] = $daterange->getEndDate();
                        }

                    }

                }

Par contre, ce qui m'étonne un peu, c'est que la date de fin de chaque range se retrouve bien dans mon tableau $daterange, mais que lorsque je parcours mon tableau via la boucle foreach, elle n'est pas reprise dans mon tableau $daysCovered, ce pourquoi j'ai du faire :

$daysCovered[] = $daterange->getEndDate();

pour l'ajouter.