Bonjour,

J'ai le message d'erreur suivant :

Notice: Undefined variable: posts in /mod/www/vineyard/view/posts/view.php on line 1

lorsque je clique sur le lien lire la suite (11:49) ... et je ne vois pas d'où cela peut venir.

Merci d'avance.
Sophonie.

19 réponses


sophonie
Auteur
Réponse acceptée

[Résolu]
Il s'agit de comprendre le principe dont voici l'explication :
Le problème vient du fichier view.php, il faut y mettre ceci

<?php $title_for_layout = $page->name;?>
<h1><?php echo $page->name; ?></h1>
<p><?php echo $page->content; ?></p>

et non ceci

<?php $title_for_layout = $posts->name;?>
<h1><?php echo $posts->name; ?></h1>
<p><?php echo $posts->content; ?></p>

car dans la conceptualisation du tutoriel de Grafikart une page est soit "une page" soit un post ... mais elle reste une page
d'ou le $d'page'] dans la méthode view($id) de la classe PostsController de même que dans la classe PagesController.

Pour faire simple et pour que tu le retiennes si jamais tu as la même erreur avec autre chose que posts.
Le message est très clair la variable posts n'est pas définie elle n'existe donc pas et ce n'est pas avec ce petit bout de code que l'on pourra t'en dire plus ;) .

sophonie
Auteur

Merci pour ta réponse, j'avais bien compris que la variable posts n'était pas définie.
Ce que je ne comprends pas dans la vidéo de Grafikart, c'est que pour page cela fonctionne correctement alors que pour posts j'ai ce message d'erreur.
J'ai suivi l'ensemble des tutoriels précédents.

C'est bien pour cela que je te fais remarquer que le code est insuffisant. Si on doit regarder chaque tutoriel pour tout les problèmes rencontrés on en a pas fini ;) .

sophonie
Auteur

Ok, entendu Xtr3me, dès que je suis chez moi je vous fais parvenir le code.

Par contre ne nous donne pas de code inutile, donne nous juste l'essentiel à savoir le fichier view.php, celui ou ceux qui y font appel etc

Bonjour,
Vérifie que dans ton PostController tu as bien $d'posts'] et $this->set($d)
et vérifie aussi si tu as mis un s à post, $d'posts'] devient $posts ou $d'post'] devient $post

sophonie
Auteur

Pour cela :
Vérifie que dans ton PostController tu as bien $d'posts'] et $this->set($d)
et vérifie aussi si tu as mis un s à post, $d'posts'] devient $posts ou $d'post'] devient $post

j'en suis sûr à 200% car j'ai fait de même avec $d'page] pour PagesController.

sophonie
Auteur

fichier controller/PostsController.php

class PostsController extends Controller {
public function index() {
        $this->loadModel('Post');
        $d'posts'] = $this->Post->find(
            'conditions' => 'online' => 1, 'type' => 'post']
        ]);
        $this->set($d);
    }
}

fichier view/posts/view.php

<?php $title_for_layout = $posts->name; ?>
<h1><?php echo $posts->name; ?></h1>
<p><?php echo $posts->content; ?></p>

fichier view/posts/index.php

<div class="page-header">
     <h1>Le Blog</h1>
</div>
<?php foreach ($posts as $k => $v) : ?>
    <h2><?php echo $v->name; ?></h2>    
    <?php echo $v->content; ?>
    <p><a href="<?php echo BASE_URL.'/posts/view/'.$v->post_id; ?>">Lire la suite →</a></p>
<?php endforeach; ?>

Trouvé l'erreur ;) .

class PostsController extends Controller {
public function index() {
        $this->loadModel('Post');
        $d'posts'] = $this->Post->find((
            'conditions' => array('online' => 1, 'type' => 'post')
        ));
        $this->set($d);
    }
}

Comme tu avais une erreur de syntaxe et tu avais oublié de mettre que les conditions étaient un tableau puisqu'il y en a plusieurs, ton résultat était vide ce qui fait que $posts->name n'était pas définis puisque $posts est vide.
Quand tu as ce genre d'erreur vérifie toujours avec debug le contenu de la variable incriminée.
Un petit

debug($posts);

dans la vue ou un petit

debug($d);

dans le controller te renseignerons des données à l'intérieur de la variable.

sophonie
Auteur

Le message d'erreur persiste, par ailleurs plusieurs points sont à remonter :
1°) En parlant de debug, je suppose que tu voulais me dire de faire un

print_r($d);

dans la méthode index() de la classe PostsController. le print_r m'affiche que le tableau $d n'est pas vide, il contient l'ensemble des données de la condition.

2°) Ce qui entraine que le tableau des conditions est correctement interprété. Il n'y a donc pas d'erreur de syntaxe. En effet, le manuel PHP souligne ceci :

// depuis PHP 5.4
$array = 
    "foo" => "bar",
    "bar" => "foo",
];

j'ai donc utiliser la syntaxe courte dans le corps de la méthode find. Le problème ne vient pas de cette syntaxe.
Par ailleurs le code que tu fournis est surligné en rouge dans mon IDE Netbeans car il manque un array juste après la parenthèse ouvrante de find.
Ceci est juste :

$d'posts'] = $this->Post->find(array(
            'conditions' => array('online' => 1, 'type' => 'post')
        ));

Je te remercie toutefois pour ton aide, je continue à chercher et je vous tiens au courant.

Sophonie.

En effet il y a plusieurs façon de déclarer des tableaux en php, l'erreur ne vient pas de là. Je jetterais un oeil à ton code quand j'aurais un peu plus de temps, probablement en fin d'après-midi

Au temps pour moi je ne connaissais pas cette syntaxe.
Tu as une erreur qu'à la première ligne ?
Tu peux toujours essayer d'avoir un objet plutôt qu'un tableau.
Au lieu de

$d'posts']

tu mets

$this->posts

et dans la vue tu mettras

$this->posts->name

etc.

Sinon le debug() est une fonction crée dans le MVC je ne sais plus quel jour qui est construire à partir de la fonction debug_bactktrace().
Un print_r ou var_dump dans certains cas fera la même chose mais pas forcément aussi bien ordonné l'un que l'autre.

Tente juste avant le $title_for_layout de mettre ça:

print_r($posts);

Et pareil devant les echos qui suivent voir si vraiment le $posts n'est pas définis ce qui peut être le cas ^^ . J'ai eu le même coup avec une variable bien définis, en faisant un findFirst au lieu du find je n'avais pas l'erreur, comme il trouvait plusieurs résultats les variables "s'empilait" avec leur contenu ce qui causait une erreur.

Je suis désolé je vois pas trop d'où pourrait venir l'erreur. Essaye ce que t'as dit Xtr3me et dis nous ce que ça donne.

Par contre, n'ayant pas fait les tutos, est ce que tu pourrait éditer ton message et dire dans quel fichier se situe quel bout de code stp ? Peut être que ça pourrait un peu plus m'éclaircir.

sophonie
Auteur

Entendu, je ferai cela demain dans la matinée ... car je dois sortir.
Bonne soirée.

Sophonie.

sophonie
Auteur

J'ai essayé ce que me propose Xtr3me ... mais cela ne fonctionne pas.
Ok. J'édite le message d'origine.

Ah ok donc un print_r au niveau de la page view comme je l'avais indiqué t'aurais montré que la variable n'était pas définis.

sophonie
Auteur

Ce que je ne comprends pas c'est que Grafikart dans son tutoriel à ceci

public function view($id) {
        // Pour l'affichage du post voulu
        $this->loadModel('Post');
        // pour un seul enregistrement
        $d'page'] = $this->Post->findFirst(array(
            // ce tableau nous permettra de traiter les clauses de la requête dans Model.php
            "conditions" => // syntaxe courte du tableau
                // On place ici nos conditions : clauses de la requête
                "online" => 1,
                "post_id" => $id,
                "type" => "post"
            ]
        ));      
        if (empty($d'page'])) {
            $this->e404("Page introuvable !");
        }
        $this->set($d);
    }

donc $d'page'] et non $d'posts'] et cela fonctionne pour lui et pas pour moi !
D'ailleurs cela est logique puisque dans la condition on veut un affichage de la page de type post et non de type page.

En fait il faut comprendre comment fonctionne le MVC. Il crée un tableau qui est automatiquement convertis en objet parce que le tableau est égal à un objet(une sorte de conversion) car la fonction findFirst renvoie un objet.
Le fait de faire $this->set($d); est un appel à la fonction set() disponible dans le Controller principal et cette fonction permet de faire passer des objets/variables à la vu. De ce fait en faisant passer $d tu fais passer $d'page'] etc.. ce qui crée un objet $page puisque c'est le fonctionnement de la fonction set().
Voilà pourquoi en faisant

$d'page'] = $this->Post->findFirst(array(
            // ce tableau nous permettra de traiter les clauses de la requête dans Model.php
            "conditions" => // syntaxe courte du tableau
                // On place ici nos conditions : clauses de la requête
                "online" => 1,
                "post_id" => $id,
                "type" => "post"
            ]
        ));

Et en envoyant le résultat à la vue tu peux utiliser l'objet $page. C'est pareil avec tout les autres.

Une fois que la fonction debug() sera faites fait un debug($this); dans une vue et tu verras tout ce qui se passe sur la page ^^ .