sfSimpleBlog et catégories

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

Comments 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