Bonjour,
j'ai suivi le tutoriel cration d'un site avec cakephp, j'ai un probleme au niveau des url des catégorie
ci-dessous mon postController
<?php
App::uses('AppController', 'Controller');
class PostsController extends AppController {
public $helpers = array('Text','Form','Html', 'Session', 'Date');
public $components = array('RequestHandler');
/** public $cacheAction= array(
'index'=>'2 DAY',
'show'=>'2 DAY'
);
**/
public $uses = array('Post');
function menu(){
$posts = $this->Post->find('all',array(
'conditions' => array('type' =>'post', 'online'=>1),
'fields' =>array('id','slug','name')
));
return $pages;
}
/**
* permet d'afficher la home des news
**/
function index(){
$this->Post->contain('Tag');
$d['posts'] = $this->Paginate('Post',array('type'=>'post', 'online'=>1,'created<= NOW()'));
$this->set($d);
}
function tag($name){
$this->loadModel('PostTag');
$this->PostTag->recursive = 0;
$this->PostTag->contain('Tag','Post');
$posts = $this->Paginate('PostTag',array(
'Tag.name' => $name,
'Post.type' => 'post',
'Post.online' => 1,
'Post.created <= NOW()'
));
$post_ids = Set::Combine($posts,'{n}.PostTag.post_id','{n}.PostTag.post_id');
$this->Post->contain('Tag');
$d['posts'] = $this->Post->find('all',array(
'conditions'=>array('id'=>$post_ids)
));
$this->set($d);
$this->render('index');
}
function category($category){
$this->loadModel('Category');
$this->Post->contain('Tag');
$cat = $this->Category->find('first',array(
'conditions' => array('slug' => $category)
));
if(empty($cat))
throw new NotFoundException('Aucun categorie ne correspond a cet ID');
$d['posts'] = $this->Paginate('Post',array('type'=>'post','online'=>1,'category_id'=> $cat['Category']['id']));
$this->set($d);
$this->render('index');
}
function show($id = null, $slug = null){
if(!$id)
throw new NotFoundException('Aucun article ne correspond a cet ID');
$post = $this->Post->find('first',array(
'conditions' => array('Post.id' => $id),
'recursive' => 0
));
if(empty($post))
throw new NotFoundException('Aucun article ne correspond a cet ID');
if($slug != $post['Post']['slug'])
$this->redirect($post['Post']['link'],301);
$d['post'] = $post;
$this->set($d);
}
function feed(){
if( $this->RequestHandler->isRss() ){
$d['posts'] = $this->Post->find('all', array('limit' => 20,
'conditions'=>array('type'=>'post')
));
return $this->set($d);
}
}
/**
* parie avec les prefix
**/
function admin_index(){
$this->paginate = array('Post'=> array(
'limit'=>20
));
$d['posts'] = $this->Paginate('Post',array('type'=>'post','online'>=0));
$this->set($d);
}
function admin_edit($id = null){
if($this->request->is('put') || $this->request->is('post')){
$this->Post->set($this->request->data);
if($this->Post->save()){
$this->Session->setFlash("Le contenu a bien été modifié","notif");
$this->redirect(array('action'=>'index'));
}
}
if($id){
$this->Post->id = $id;
$this->request->data = $this->Post->read();
}else{
$this->request->data = $this->Post->getDraft('post');
}
$d['categories'] = $this->Post->Category->find('list');
$this->Post->PostTag->contain('Tag');
$d['tags'] = $this->Post->PostTag->find('all',array(
'conditions' => array('PostTag.post_id' => $id)
));
$this->set($d);
}
function admin_delete($id){
$this->Session->setFlash("L'article a bien été supprimer",'notif');
$this->Post->delete($id);
$this->redirect($this->referer());
}
function admin_delTag($id){
$this->Post->PostTag->delete($id);
$this->redirect($this->referer());
}
}
Le model category
<?php
class Category extends AppModel {
public function afterfind($data){
foreach ($data as $k => $d){
if(isset($d['Category']['slug']) && isset($d['Category']['id'])){
$d['Category']['link'] = array(
'controller' => 'posts',
'action' =>'category',
'slug' => $d['Category']['slug']
);
}
$data[$k] = $d;
}
return $data;
}
public function beforeSave(){
if(empty($this->data['Category']['slug']) && isset($this->data['Category']['slug']) && !empty($this->data['Category']['name']))
$this->data['Category']['slug'] = strtolower(Inflector::slug($this->data['Category']['name'],'-'));
return true;
}
}
?>
la réécriture de l'url dans le fichier route
/** CATEGORY **/
Router::connect('/categorie/:slug',array('controller'=>'posts','action'=>'category'),array('pass'=>array('slug'),'slug'=>'[a-z0-9\-]+'));
Lorsque je clique sur le lien dans ma sidebar je dois arriver sur une page avec tous les articles de la catégorie or ici j'ai le message d'erreur suivant :
Notice (8): Undefined variable: category [APP\Controller\PostsController.php, line 52]
J'ai tournée le probleme dans tous les sens et j'arrive pas a résoudre le probleme
ci-dessous ma sidebar
<?php echo $this->Html->link('Ajout d\'image',array('controller'=>'galleries','action'=>'show'));?>
<div class="page-header">
<div class="span4">
<b>Les catégories</b>
<?php $categories = $this->requestAction(array('controller'=>'categories', 'action'=>'sidebar','admin'=>false)); ?>
<?php foreach ($categories as $k => $v): $v = current($v);?>
<li><?php echo $this->Html->link($v['name'].' ('.$v['post_count'].')',$v['link']);?></li>
<?php endforeach;?>
<br/><br/>
<b>Page disponible</b>
<?php $pages = $this->requestAction(array('controller'=>'pages', 'action'=>'menu','admin'=>false)); ?>
<?php foreach ($pages as $k=>$v): $v = current($v);?>
<li><?php echo $this->Html->link($v['name'],$v['link']);?></li>
<?php endforeach;?>
</div>
</div>
Ci-dessous les lignes concernées par l'erreur
Notice (8): Undefined variable: category [APP\Controller\PostsController.php, line 52]
Code
$this->Post->contain('Tag');
$cat = $this->Category->find('first',array(
'conditions' => array('slug' => $category)
PostsController::category() - APP\Controller\PostsController.php, line 52
ReflectionMethod::invokeArgs() - [internal], line ??
Controller::invokeAction() - CORE\Cake\Controller\Controller.php, line 473
Dispatcher::_invoke() - CORE\Cake\Routing\Dispatcher.php, line 107
Dispatcher::dispatch() - CORE\Cake\Routing\Dispatcher.php, line 89
[main] - APP\webroot\index.php, line 96
Erreur apparaissant sur ma page
Aucun categorie ne correspond a cet ID
Error: The requested address '/luckdown/posts/category/slug:Programmation?url=%2Fposts%2Fcategory%2Fslug%3AProgrammation' was not found on this server.
Stack Trace
#0 [internal function]: PostsController->category()
#1 C:\wamp\www\luckdown\lib\Cake\Controller\Controller.php(473): ReflectionMethod->invokeArgs(Object(PostsController), Array)
#2 C:\wamp\www\luckdown\lib\Cake\Routing\Dispatcher.php(107): Controller->invokeAction(Object(CakeRequest))
#3 C:\wamp\www\luckdown\lib\Cake\Routing\Dispatcher.php(89): Dispatcher->_invoke(Object(PostsController), Object(CakeRequest), Object(CakeResponse))
#4 C:\wamp\www\luckdown\app\webroot\index.php(96): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse))
#5 {main}
Je vous remerci de votre aide
Cafreunion