Bonjour,
j'ai visionné les tutos sur cakePhp 2 avec enthousiasme. Je ne suis pas encore très à l'aise avec php et le concept MVC, mais je dois avouer que je suis très emballé et désire progresser!

Dans cette démarche, je bute sur une logique que je n'arrive pas à résoudre. Merci de me donner un coup de pouce.

Je désire tout simplement importer dans ma page d'accueil du site ('/') les différents titres des posts que l'on accède via http://monsite.com/posts et pouvoir les linker vers la page de l'article avec la sidebar des catégories.

Je n'ai pas gardé la page posts par défaut comme première page du site comme présenté dans le tuto.
J'ai créé un PagesController.php avec une function index() avec rien dedans pour pouvoir afficher la View/Pages/index.ctp qui est ma page par défaut d'accueil du site ('/') avec ce code pour appeler les liens :

<p><?php echo $this->Html->link("Le titre de mon second article",array('controller'=>'posts','action'=>'index'), array('target'=>"_self", 'title'=>"Accéder à la news")); ?></p>
            <p><?php echo $this->Html->link("Le titre de mon premier article",array('controller'=>'posts','action'=>'index'), array('target'=>"_self", 'title'=>"Accéder à la news")); ?></p>

Tout ceci reste statique pour l'instant, mais j'aimerai pouvoir afficher automatiquement les derniers titres, comme l'on peut trouver sur nombre de sites : Les derniers articles.
Pour info, j'ai gardé les mêmes variables et structures que dans les tutos.

Edit : j'ai transféré les données de PagesController.php vers PostsController.php, car je ne voulais garder que le système d'articles éditables, et ne pas utiliser de pages comme dans le tuto.

4 réponses


Grafikart
Réponse acceptée

Ah tu veux utiliser un model qui n'est pas dispo fait un $this->loadModel('Agenda') avant d'utiliser le model Agenda dans pages

Je suis perdu c'est quoi la question ? Si tu veux récup les dernier articles faut juste faire un find classique

Trashcom
Auteur

C'est bien là que je bute.
Je vais donner un autre exemple plus parlant et qui retombe sur le même problème.
J'ai mis en place une page agenda qui affiche une liste de dates.
Ma BDD comporte une table 'agendas' avec les champs ID,date,lieu,infos.

Mon model : Agenda.php

<?php
class Agenda extends AppModel{

    /**
    * Tri des articles par date
    **/
    public $order = 'Agenda.date ASC';
}

Mon controller : AgendasController.php

<?php
class AgendasController extends AppController{
    function index($id = null){
        $agenda = $this->Agenda->find('all', array(
            'conditions'    => array('date >= NOW()'),
            'fields'    => array('id','date','lieu','infos')
        ));
        $d'agenda'] = $agenda;
        //debug($agenda);
        $this->set($d);
    }
}

Ma vue : View/Agendas/index.ctp

<div class="conteneur">
    <section id="agenda">
        <h1>Agenda</h1>
        <article>
                    <table>
            <tr>
                <th>DATE</th>
                <th>LIEU</th>
                <th>INFOS</th>
            </tr>               
            <?php foreach ($agenda as $k => $v): $v = current($v)?>
                <tr>
                    <td><?php echo $v'date']; ?></td>
                    <td><?php echo $v'lieu']; ?></td>
                    <td><?php echo $v'infos']; ?></td>
                </tr>
            <?php endforeach ?>
            </table>
        </article>
        </section> <!-- fin section -->
</div> <!-- fin conteneur -->

Ici pas de problème, ma page http://monsite.com/agendas s'affiche correctement.

J'essaie à présent d'afficher sur la page d'index du site une liste des 3 dernières dates avec juste la date et le lieu :

Mon model : Page.php

<?php
class Page extends AppModel{

}

Mon controller : PagesController.php

<?php
class PagesController extends AppController{
    function index($id = null){
        $agenda = $this->Agenda->find('all', array(
        'conditions'    => array('date >= NOW()'),
                'limit' => 3,
        'fields'    => array('id','date','lieu')
        ));
        $d'agenda'] = $agenda;
        debug($agenda);
        $this->set($d);
}

Ma vue : View/Pages/index.ctp

<h1>Prochaines dates</h1>
            <div class="dates">
                <ul>
                    <?php foreach ($agenda as $k => $v): $v = current($v) ?>
                        <li>
                            <h2><?php echo $v'date']; ?></h2>
                            <p><?php echo $v'lieu']; ?></p>
                        </li>
                    <?php endforeach ?>
                </ul>
                <p><?php echo $this->Html->link('voir l\'agenda', array('controller' => 'agendas', 'action' => 'index'), array('title' => 'Accéder à l\'agenda')) ?></p>
            </div>

Et là je tombe sur un "Fatal error: Call to a member function find() on a non-object in C:\wamp\www\site\app\Controller\PagesController.php on line 5".

J'ai essayé de changer le nom de la variable $agenda, mais rien n'y fait.
Je me doute que mon erreur réside dans PagesController, mais je n'arrive pas à l'identifier... :/
Donc pour résumer, comment dois-je faire pour afficher ma liste de dates sur ma page d'accueil ?

Trashcom
Auteur

Super, merci Grafikart pour ta rapide réponse !
Effectivement, c'est logique.