IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ORM PHP Discussion :

ErrorException Warning: Illegal offset type [4.x]


Sujet :

ORM PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut ErrorException Warning: Illegal offset type
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
        /**
         *  @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]);
       }
    Ce qui donne ceci :

    Nom : Capture.JPG
Affichages : 899
Taille : 19,8 Ko

    Si on clique sur le bouton ajouter une prériode, on peut ajouter une (ou plusieurs) périodes de manière dynamique.

    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        /**
         * @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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        /**
         * @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. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
                    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...

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Voilà, j'ai résolu mon problème en utilisant un objet de type DatePeriod que je viens de découvrir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
                    $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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $daysCovered[] = $daterange->getEndDate();
    pour l'ajouter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 7] Illegal offset type / strpo() / fatal error
    Par Schawy dans le forum Langage
    Réponses: 10
    Dernier message: 25/05/2018, 10h04
  2. Warning: Illegal string offset 'type'
    Par oitsuki dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/03/2018, 00h37
  3. [MySQL] Warning: Illegal string offset
    Par neomega0304 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 24/09/2016, 11h11
  4. [Tableaux] Illegal offset type
    Par Anduriel dans le forum Langage
    Réponses: 9
    Dernier message: 27/02/2006, 16h10
  5. Aide sur Warning: Illegal offset type in ...
    Par pounie dans le forum Langage
    Réponses: 5
    Dernier message: 03/01/2006, 13h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo