Bonjour,
Je viens de réaliser le tuto pour mettre un système de tags sur cakePHP.
Tout se passe bien et mon système de tag fonctionne bien. Seulement en surfant sur le site, je me suis rendu compte que j'avais une erreur en appelant une catégorie d'article dans la sidebar, les tags n'apparaissent pas.
Les erreurs suivantes s'affichent : Undefined index: Tag [APP/View/Posts/index.ctp, line 9] et Invalid argument supplied for foreach() [APP/View/Posts/index.ctp, line 13]
Quand j'appelle mes articles par tag et dans l'index, tout se passe bien, mais dès que j'appelle mes articles par catégorie, les tags ne fonctionnent pas.
Voici mon code:
<?php $this->set('title_for_layout',isset($title)?$title:'News'); ?>
<div class="row">
<div class="span12 posts">
<div class="page-header">
<h1><?php echo isset($title)?$title:'News'; ?></h1>
</div>
<?php foreach ($posts as $k => $v): $tags = $v'Tag']; $v = current($v); ?>
<div class="post">
<h2><?php echo $v'name']; ?> <small><em>Publié le <?php echo $this->Date->french($v'created']); ?></em></small></h2>
<?php echo $this->Text->truncate($v'content'],400,array('exact'=>false,'html'=>true)); ?>
<?php foreach($tags as $t): ?>
<span class="label warning"><?php echo $this->Html->link($t'name'],array('action'=>'tag',$t'name'])); ?></span>
<?php endforeach; ?>
<div class="cb"></div>
</div>
<div class="actions">
<p><a href="<?php echo $this->Html->url($v'link']); ?>" class="btn info alignRight">Lire la suite</a></p>
<div class="cb"></div>
</div>
<p> </p>
<?php endforeach; ?>
</div>
<?php echo $this->element('sidebar'); ?>
</div>
<div class="pagination">
<ul>
<?php echo $this->Paginator->numbers(array('separator'=>false,'tag'=>'li')); ?>
</ul>
</div>
Je cherche depuis un moment sans malheureusement trouver de solution.
Merci de votre aide.
Yes ! Merci à tous les deux d'avoir pris du temps pour moi !
En effet la solution de Extrarox fonctionne.
En rajoutant
$this->Post->contain('Tag');
dans ma category, cela fonctionne.
Merci encore :)
Bonjour, je relance ma demande car je suis toujours bloqué sur ce problème.
J'ai mis mon site en ligne pour tester et toujours le même soucis.
Si vous voulez plus d'info, dites le moi et je posterai ce qu'il faut.
Merci de m'aider.
Bonjour Extrarox, merci de prendre du temps pour mon problème.
Voici mon code :
<div class="span3">
<h2>Sidebar</h2>
<?php $categories = $this->requestAction(array('controller'=>'categories','action'=>'sidebar','admin'=>false)); ?>
<ul>
<?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; ?>
</ul>
</div>
Salut,
Tu as quoi dans $v'link'] dans :
<li><?php echo $this->Html->link($v'name'].' ('.$v'post_count'].')',$v'link']); ?></li>
au niveau de la siderbar, ça retourne quoi?
Salut,
En effet, mon Url est routé dans mon routes.ctp :
Router::connect('/categorie/:slug',array('controller'=>'posts','action'=>'category'),array('pass'=> array('slug'),'slug' =>'[a-z0-9\-]+'));
Ce qui me donne comme url : http://www.monsite.fr/categorie/macategorie alors que
mon url de tag est : http://www.monsite.fr/posts/tag/montag
Oui en effet j'ai pas mis de "s" à catégorie, j'ai changé mais cela ne change rien.
Voici mon PostsController :
<?php
class PostsController extends AppController{
public $helpers = array('Date');
// Flux RSS
public $components = array('RequestHandler');
//Met en cahe pendant deux jours
public $cacheAction = array(
'index' => '2 DAY',
'show' => '2 DAY'
);
//Pagination des news, 5 par pages
public $paginate =array(
'limit' => 5
);
function index(){
$this->Post->contain('Tag');
$d'posts'] = $this->Paginate('Post',array('type'=>'post','online'=>1,'created <= NOW()'));
$this->set($d);
}
/**
* Permet de selectionner toutes les pages d'un même tag
**/
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');
}
/**
* Permert d'afficher les articles par catégories
**/
function category($category){
$cat = $this->Post->Category->find('first',array(
'conditions' => array('slug' => $category)
));
if(empty($cat))
throw new NotFoundException('Aucune catégorie ne correspond à ce nom');
$d'posts'] = $this->Paginate('Post',array('type'=>'post','online'=>1,'category_id'=>$cat'Category']'id']));
$d'title'] = 'Tous les articles "'.$cat'Category']'name'].'"';
$this->set($d);
$this->render('index');
}
/**
* Permet d'afficher un article
**/
function show($id = null,$slug = null){
if(!$id)
throw new NotFoundException('Aucun article ne correspond à 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 à cet ID');
if($slug != $post'Post']'slug'])
$this->redirect($post'Post']'link'],301);
$d'post'] = $post;
$this->set($d);
}
/**
* Flux rss
**/
function feed(){
if ($this->RequestHandler->isRss() ){
$d'posts'] = $this->Post->find('all', array(
'limit' => 20,
'conditions' => array('type'=>'post')
));
return $this->set($d);
}
}
/**
* Index de l'administration post & pagination
**/
function admin_index(){
$this->paginate = array('Post' => array(
'limit' => 5
));
$d'posts'] = $this->Paginate('Post',array('type'=>'post','online >= 0'));
$this->set($d);
}
/**
* Editer un article
**/
function admin_edit($id = null){
if($this->request->is('put') || $this->request->is('post')){
if($this->Post->save($this->request->data)){
$this->Session->setFlash("Le contenu a bien été modifié","notif");
$this->redirect(array('action'=>'index'));
}
}elseif($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);
}
/**
* Supprimer un article
**/
function admin_delete($id){
$this->Session->setFlash('L\'article a bien été supprimé','notif');
$this->Post->delete($id);
$this->redirect($this->referer());
}
function admin_delTag($id){
$this->Post->PostTag->delete($id);
}
}
Merci
Ou avec le comportement containable, histoire de ne pas surcharger avec les commentaires, s'il y en a ;)
avec un paginate, le comportement containable est chiant à mettre en place.
C'était pour tester après si cela fonctionne c'est que ca vient de la :)
Salut, J'ai modifié mon PostController au dessus avec cette fois-ci ma fonction tag que j'avais oublié de mettre.
Cela ne fonctionne toujours pas, je ne sais plus où chercher.
Je rajoute mes models Post.php et PostTag.php :
<?php
class PostTag extends AppModel{
public $recursive = -1;
public $useTable = 'posts_tags';
public $actsAs = array('Containable');
public $belongsTo = array(
'Post',
'Tag' => array(
'counterCache' => 'count'
)
);
public function afterDelete(){
$this->Tag->deleteAll(array(
'count' => 0
));
}
}
<?php
class Post extends AppModel{
public $actsAs = array('Containable');
public $hasMany = array(
'Media' => array(
'dependent' => true
),
'PostTag'
);
public $belongsTo = array(
'Category' => array(
'counterCache' => array('post_count' => array('Post.online'=>1))
)
);
public $hasAndBelongsToMany = array('Tag');
public $recursive = -1;
public $validate = array(
'slug' => array(
'rule' => '/^[a-z0-9\-]+$/',
'allowEmpty' => true,
'message' => "L'url n'est pas valide"
),
'name' => array(
'rule' => 'notEmpty',
'message' => "Vous devez préciser un titre"
)
);
public $order = 'Post.created DESC';
/**
* Permet de générer / récupérer un brouillon
**/
public function getDraft($type){
$post = $this->find('first',array(
'conditions' => array('online' => -1,'type' => $type)
));
if(empty($post)){
$this->save(array(
'type' => $type,
'online' => -1
),false);
$post = $this->read();
}
$post'Post']'online'] = 0;
return $post;
}
public function afterFind($data){
foreach($data as $k => $d){
if(isset($d'Post']'slug']) && isset($d'Post']'id']) && isset($d'Post']'type'])){
$d'Post']'link'] = array(
'controller' => Inflector::pluralize($d'Post']'type']),
'action' => 'show',
'id' => $d'Post']'id'],
'slug' => $d'Post']'slug']
);
}
$data$k] = $d;
}
return $data;
}
public function beforeSave(){
if(empty($this->data'Post']'slug']) && isset($this->data'Post']'slug']) && !empty($this->data'Post']'name']))
$this->data'Post']'slug'] = strtolower(Inflector::slug($this->data'Post']'name'],'-'));
return true;
}
public function afterSave(){
if(!empty($this->data'Post']'tags'])){
$tags = explode(',',$this->data'Post']'tags']);
foreach($tags as $tag){
$tag = trim($tag);
if(!empty($tag)){
$d = $this->Tag->findByName($tag);
if(!empty($d)){
$this->Tag->id = $d'Tag']'id'];
}else{
$this->Tag->create();
$this->Tag->save(array(
'name' => $tag
));
}
$this->PostTag->create();
$this->PostTag->save(array(
'post_id' => $this->id,
'tag_id' => $this->Tag->id
));
}
}
return true;
}
}
}
Merci
$this->Compte->recursive = 2; tu l'as rajouter à l'action catégories ?
debug($d) ça renvoie quoi ?