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
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.. :)