Validation des données (Mise en pratique POO)

Ce sujet est résolu
Default
,

Bonjour,
Je suis les formations de grafikart depuis un moment et je suis arrivé à la mise en pratique de la POO, la validation des données.
Je rencontre un problème avec les vues d'éditions d'articles et de création.
Je vais prendre pour exemple l'édition d'un article, car l'erreur est quasi la même

Ce que je fais

Code AdminBlogAction

/**
     * Edite un article
     * @param Request $request
     * @return ResponseInterface|string
     */
    public function edit(Request $request)
    {
        $item = $this->postTable->find($request->getAttribute('id'));

        if ($request->getMethod() === 'POST') {
            $params = $this->getParams($request);
            $params['updated_at'] = date('Y-m-d H:i:s');
            $validator = $this->getValidator($request);
            if ($validator->isValid()) {
                $this->postTable->update($item->id, $params);
                $this->flash->success('L\'article a bien été modifié');
                return $this->redirect('blog.admin.index');
            }
            $errors = $validator->getErrors();
            $params['id'] = $item->id;
            $item = $params;
        }

        return $this->renderer->render('@blog/admin/edit', compact('item', 'errors'));
    }

Code TwigRenderer

/**
     * Permet de rendre une vue
     * Le chemin peut être précisé avec des namespace rajoutés via addPath()
     * $this->render('@blog/view');
     * $this->render('view');
     * @param string $view
     * @param array $params
     * @return string
     */
    public function render(string $view, array $params = []): string
    {
        return $this->twig->render($view . '.twig', $params);
    }

Ce que j'obtiens

J'obtiens l'erreur sur l'édition d'un article :
compact(): Undefined variable: errors

J'obtiens l'erreur sur la création d'un article
compact(): Undefined variable: item

5 Réponse

40917
,

Bonjour
$error n'est défini que si tu valides le formulaire
or lors de son affichage, tu ne passes pas dans le if
essaye de mettre $error = ""; avant le

Default
,

tu peux essayer de regarder la pile d'appel pour remonter sur le fichier qui pose problème : https://www.php.net/manual/fr/function.debug-print-backtrace.php, et voir quelles variables ne sont pas définies
Là comme ça, c'est compliqué de t'aider.

Default
,

J'ai essayé de définir la variable $errors avant mon return, toujours la même erreur.
J'ai les fichiers sources de la formation, j'ai beau comparer les fichiers, copier/coller, rien à faire

40917
,

quel est le code de ton essai ?

Default
,

J'ai mal lu ton message...
Effectivement ça fonctionne

/**
     * Edite un article
     * @param Request $request
     * @return ResponseInterface|string
     */
    public function edit(Request $request)
    {
        $item = $this->postTable->find($request->getAttribute('id'));
        $errors = '';
        if ($request->getMethod() === 'POST') {
            $params = $this->getParams($request);
            $params['updated_at'] = date('Y-m-d H:i:s');
            $validator = $this->getValidator($request);
            if ($validator->isValid()) {
                $this->postTable->update($item->id, $params);
                $this->flash->success('L\'article a bien été modifié');
                return $this->redirect('blog.admin.index');
            }
            $errors = $validator->getErrors();
            $params['id'] = $item->id;
            $item = $params;
        }

        return $this->renderer->render('@blog/admin/edit', compact('item', 'errors'));
    }

    /**
     * Crée un nouvel article
     * @param Request $request
     * @return ResponseInterface|string
     */
    public function create(Request $request)
    {
        $item = '';
        $errors ='';
        if ($request->getMethod() === 'POST') {
            $params = $this->getParams($request);
            $params = array_merge($params, [
                'updated_at' => date('Y-m-d H:i:s'),
                'created_at' => date('Y-m-d H:i:s')
            ]);
            $validator = $this->getValidator($request);
            if ($validator->isValid()) {
                $this->postTable->insert($params);
                $this->flash->success('L\'article a bien été modifié');
                return $this->redirect('blog.admin.index');
            }
            $item = $params;
            $errors = $validator->getErrors();
        }

        return $this->renderer->render('@blog/admin/create', compact('item', 'errors'));
    }