Bonjour,

Suite au tutoriel créé son site de A à Z, j'ai mis en place a partir de cette base très solide un nouveau module concernant la culture, j'ai créé les pages concernées (CulturesController, Culture, et les différente vue : admin_index, admin_edit, view, index et un formulaire d'ajout des nouveaux messages) en respectant l'architecture MVC.
Voila le problème lorsque je récupère un élément via l'index code ci-dessous,

index.php

<div class="row">
    <div class="span13">
        <div class="page-header">
            <h1><?php echo isset($title)?$title:'Culture'; ?></h1>
        </div>
        <?php foreach ($cultures as $k => $v): ?>
        <div class="clearfix">
            <h3><?php echo $v->name; ?></h3>
            <?php echo substr(strip_tags($v->contenu),0,300); ?>...
        </div>
        <p style="text-align:right"><a href="<?php echo Router::url("cultures/view/id:{$v->id}/slug:$v->slug"); ?>">Lire la suite →</a></p>
        <p> </p>
        <?php endforeach ?>
        <div class="pagination">
          <ul>
          <?php for($i=1; $i <= $page; $i++): ?>
            <li <?php if($i==$this->request->page) echo 'class="active"'; ?>><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
          <?php endfor; ?>
          </ul>
</div>

J'arrive pas à lire la suite via le lien Lire la suite : <p style="text-align:right"><a href="<?php echo Router::url("cultures/view/id:{$v->id}/slug:$v->slug"); ?>">Lire la suite →</a></p>

Ce lien me retour une page non trouvé
Pour information ci-dessous mon controller

CulturesController.php

<?php 
class CulturesController extends Controller{

    function view($id){
        $this->loadModel('Culture');
        $d'page'] = $this->Culture->findFirst(array(
            'conditions' => array('online' => 1,'id'=>$id)
        )); 
        if(empty($d'page'])){
            $this->e404('Page introuvable'); 
        }
        $this->set($d);
        }

    function index(){
        $perPage = 3; 
        $this->loadModel('Culture');
        $condition = array('online' => 1); 
        $d'cultures'] = $this->Culture->find(array(
            'conditions' => $condition,
            'fields' => 'id,name,genre,auteur,illustration,contenu,slug',
            'order' => 'created DESC',
            'limit' => ($perPage*($this->request->page-1)).','.$perPage
        ));
        $d'total'] = $this->Culture->findCount($condition); 
        $d'page'] = ceil($d'total'] / $perPage);
        $this->set($d);
        }
    function admin_index(){
        $perPage = 3; 
        $this->loadModel('Culture');
        $condition = array('id'!= null); 
        $d'posts'] = $this->Culture->find(array(
            'fields' => 'name,genre,auteur,slug,illustration,contenu',
            'order' => 'created DESC',
            'conditions' => $condition,
            'limit' => ($perPage*($this->request->page-1)).','.$perPage
            ));
        $d'total'] = $this->Culture->findCount($condition); 
        $d'page'] = ceil($d'total'] / $perPage);
        $this->set($d);
        }

    function admin_edit(){
        $this->loadModel('Culture'); 
        if($id === null){
            $culture = $this->Culture->findFirst(array(
                'conditions' => array('online' => -1),
            ));
            if(!empty($culture)){
                $id = $culture->id;
            }else{
                $this->Culture->save(array(
                    'online' => -1,
                    'created' => date('Y-m-d')
                ));
                $id = $this->Culture->id;
            } 
        }
        $d'id'] = $id; 
        if($this->request->data){
            if($this->Culture->validates($this->request->data)){
                $this->request->data->type = 'culture';
                $this->Culture->save($this->request->data);
                $this->Session->setFlash('Le contenu a bien été modifié'); 
                $this->redirect('admin/cultures/index'); 
            }else{
                $this->Session->setFlash('Merci de corriger vos informations','error'); 
                }

        }else{
            $this->request->data = $this->Culture->findFirst(array(
                'conditions' => array('id'=>$id)
            ));
        }   
    }
    function ajout(){
            $this->loadModel('Culture');
        if($this->request->data){
            if($this->Culture->validates($this->request->data)){

                $this->Culture->save($this->request->data);

                $this->Session->setFlash('Publication réussie'); 

            }else{
                $this->Session->setFlash('Merci de corriger vos informations','error'); 
            }   
        }
    }

    function delete(){
        $this->loadModel('Culture');
        $this->Culture->delete($id);
        $this->Session->setFlash('Le contenu a bien été supprimé'); 
        $this->redirect('admin/cultures/index'); 
            }
}

Pour information voici l'url que j'ai lorsque je clique sur le lien : http://localhost/rougebleuciel/cultures/view/id:1/slug:fon-ker

Structure de ma base de donnée

--
-- Structure de la table `cultures`
--
CREATE TABLE IF NOT EXISTS `cultures` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `genre` text NOT NULL,
  `auteur` text NOT NULL,
  `slug` text NOT NULL,
  `illustration` text NOT NULL,
  `contenu` mediumtext NOT NULL,
  `users_id` int(5) NOT NULL,
  `online` int(11) NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

J'allais oublié toutes mes vues sont dans le dossiers : cultures

Je vous remercie de votre aide

cafreunion

1 réponse


Shadow
Réponse acceptée

Bonjour,

Pour ton problème je ne serais trop te conseiller de passer par une table de routage...

Dans le fichier "app > routes.php" place cette ligne sous les autres :

Router::connect('/:controller/:action/:id-:slug', array(), array('pass'=> array('id', 'slug'), 'id' => '[0-9]+', 'slug' => '[a-z0-9\-]+'));

Ensuite, dans ton fichier "CulturesController.php", fait ressembler ton action view à cela :

function view($id = null, $slug = null){
    $this->loadModel('Culture');
    $d'page'] = $this->Culture->findFirst(array(
        'conditions' => array('online' => 1, 'id' => $id)
    )); 
    if(empty($d'page'])){
        $this->e404('Page introuvable'); 
    }
    $this->set($d);
}

Pour créer les liens ... il existe un helper pour cela (à placer en haut du controlleur).

class CulturesController extends AppController {

    var $helpers = array('Html');
    /**
     * La suite du code avec tes actions
     */

}

Et pour finir dans tes vues fait ressembler tes liens à cela :

<p style="text-align:right">
    <?php echo $this->Html->link('Lire la suite', array('controller' => 'cultures', 'action' => 'view', $v->id.'-'.$v->slug)); ?> →
</p>

Au lieu de :

<p style="text-align:right"><a href="<?php echo Router::url("cultures/view/id:{$v->id}/slug:$v->slug"); ?>">Lire la suite →</a></p>

NB : il faut bien voir ici que slug DOIT respecter le regex spécifié dans le fichier routes.php

Cela te donnera des liens du genre "/cultures/view/5-mon-lien" .. et si tu fait un debug() de $id et $slug dans l'action view tu devrais avoir le bon contenu.

En espérant avoir pu répondre à ton problème en ayant essayé d'être le plus clair possible.

Tiens moi au courant si cela marche ou pas.. :)