Posté par Cedric, le 23/03/2008 - Technologie
Le plugin sfSimpleBlog est une très bonne base de travail pour publier un blog rapidement avec Symfony. Les fonctionnalités de base sont présentes, et il est assez facile d'étendre le système. Pour les besoins de ce blog, je souhaitais pouvoir classer mes articles dans des catégories, ce qui n'était pas possible nativement. Voila comment je m'y suis pris.
Tout d'abord, il faut modifier la structure de la base de données, c'est à dire essentiellement modifier le schema.yml.
1/ Rajouter la table sf_blog_category
sf_blog_category:
_attributes: { phpName: sfSimpleBlogCategory }
id: ~
category_name: { type: varchar(255) }
2/ Modifier la table sf_blog_post
sf_blog_category_id: { type: integer, foreignTable: sf_blog_category, foreignReference: id, onDelete: cascade }
On va ensuite créer la page qui affiche l'ensemble des articles d'une catégorie. La dessus, inutile de réinventer la roue, on se base sur ce qui a été fait pour afficher les pages taggées.
1/ On créé une action executeShowByCategory()
public function executeShowByCategory()
{
$cat = $this->getRequestParameter('cat');
$this->forward404Unless($cat);
//-- on récupere le nom de la cat
$c = new Criteria();
$c->add(sfSimpleBlogCategoryPeer::ID, $cat);
$this->category = sfSimpleBlogCategoryPeer::doSelectOne($c);
//$this->forward404Unless($this->category);
$this->post_pager = sfSimpleBlogPostPeer::getCategoryPager(
$cat,
sfConfig::get('app_sfSimpleBlog_post_max_per_page', 5),
$this->getRequestParameter('page', 1)
);
}
2/ On créé getCategoryPager en dupliquant getTaggedPager
public static function getCategoryPager($cat, $max, $page)
{
$pager = new sfPropelPager('sfSimpleBlogPost', $max);
$c = new Criteria();
$c->add(self::IS_PUBLISHED, true);
$c->add(self::SF_BLOG_CATEGORY_ID, $cat);
$c->addDescendingOrderByColumn(self::CREATED_AT);
$pager->setCriteria($c);
$pager->setPage($page);
$pager->setPeerMethod('doSelectJoinAll');
$pager->init();
return $pager;
}
Voila, c'est aussi simple que cela, on a un listing des articles en marche. Côté back-office, on modifie modules/sfSimpleBlogPostAdmin/config/generator.yml pour ajouter "sf_blog_category_id" à cette ligne dans la partie edit:
display: [author_id, sf_blog_category_id, title, extract, content, tags_as_string, allow_comments, is_published]
Vous avez désormais un menu déroulant qui vous permet de choisir la catégorie de votre article.
Evidemment, beaucoup de réglages sont encore possibles. Par exemple, vous souhaitez sûrement afficher la catégorie de l'article en même temps que l'auteur ou encore la date. Pour cela, nous allons créer une méthode getCategory() dans PluginsfSimpleBlogPost.php
public function getCategory()
{
if (!@is_object($this->category))
{
$this->category = sfSimpleBlogCategoryPeer::retrieveByPk($this->sf_blog_category_id);
}
return $this->category;
}
Ensuite, on modifie simplement les templates d'affichage des articles. Ainsi, dans _post.php
getCategory(), 'sfSimpleBlog/showByCategory?cat='.$post->getCategory()->getId().'&catName='.utf8_encode($post->getCategory()->getCategoryName())) ?>
Voilà , on a fait le tour de cette fonctionnalité. La prochaine fois, j'expliquerai comment étendre cette fonctionnalité de catégories pour créer des pages de contenu tout en utilisant notre interface de blog native.
tags: sfSimpleBlog, symfony
2 comments so far
C'est d'une simplicité déconcertante. Les commandes sont apparement peu nombreuses, par contre j'imagine que la difficulté réside dans la compréhension et l'appropriation du framework, de ses règles et de sa structure. La syntaxe à l'air assez simple.
Intéressant!
Posted by Dickens on 27/03/2008
Merci pour ce tutoriel ;)
Posted by Hugo on 27/03/2008