Blog en ZF – étape 2 : La base de données et le premier affichage
Dev

Blog en ZF – étape 2 : La base de données et le premier affichage

Après avoir installé correctement notre Zend Framework, nous allons passer du coté de la base de données.

Pour mettre en place notre blog, nous allons commencé par créer 4 tables :

Table « Articles »
Un article sera composé d’un titre, d’un chapeau, du texte en lui-même, la date, l’auteur et un flag indiquant que l’article est en ligne.

Table « Categories »
Cette table contient le nom de la catégorie, et un nom d’url propre. La catégorie « Zend FrameWork » aura l’url zend_framework.

Table « Auteurs »
le nom, le prénom, l’email de l’auteur, ainsi qu’un champ url pour avoir des url propre.

Table « Commentaires »
Les commentaires à nos articles, avec le nom, l’email, le commentaire en lui même, la date et un champ de validation pour permettre la modération de nos commentaires

Voici le schéma de notre base de données. MCD Blog Celle ci est volontairement simplifiée, mais suffisamment complète pour voir les différents aspects du Framework.

Je vous laisse mettre votre propre contenu pour vos tests. Voici un fichier pour créer cette base, et aussi mettre du contenu pour commencer. Le fichier sql.

Maintenant que notre base est mise en place, avec du contenu pour faire nos premiers tests, il est temps de passer au choses sérieuses : l’affichage de nos articles.

1- Configuration de l’accès MySql

Editer votre fichier application/configs/application.ini

Après la ligne : resources.frontController.controllerDirectory = APPLICATION_PATH « /controllers »

Ajouter le code suivant :

// Connexion a la base de donnees
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = "password"
resources.db.params.dbname = "blog"
resources.db.params.driver_options.1002 = "SET NAMES utf8"
resources.db.isDefaultTableAdapter = true

Cela va indiquer au Zend FrameWork que nous allons nous connecter à la base « blog » avec le user « root », via une connexion « PDO ».

resources.db.params.driver_options.1002 = "SET NAMES utf8"

Cette ligne va nous permettre de gérer correctement le contenu Utf8.

La dernière ligne nous permet d’indiquer qu’il s’agit de notre adaptateur par défaut. Comme nous n’avons qu’une seule base de données, cela nous éviteras de spécifier le connecteur.

2 – Autoloader

Dans le fichier Bootstrap.php, il faut configurer notre autoloader, pour que ZendFrameWork trouve nos classes tout seul.

Ajouter la méthode _initAutoload() comme cela :

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(
            array(
                'namespace' => '',
                'basePath' => dirname(__FILE__),
            )
        );
        return $autoloader;
    }
}

 

3 – Db Oject pour Articles

Afin d’accéder à nos contenus, nous allons créer des classes qui vont étendre le Zend_Db_Table_Abstract. Cet objet nous permet d’accéder facilement à notre table en nous fournissant des méthodes standards pour effectuer des recherches ou update.

La première classe sera la classe Articles.

Dans le répertoires models/DbTable ( créer le répertoire s’il n’existe pas), nous créons la classe Articles.php

Le contenu de cette classe :

<?php

/**
 * This is the DbTable class for the artices table.
 */
class Model_DbTable_Articles extends Zend_Db_Table_Abstract
{
    /**
     * Table name
     */
    protected $_name = 'articles';

    protected $_primary = 'art_id';
}

Comme vous pouvez le constater, cette classe est très simple. On définit simplement le nom de la table et le nom de notre clé primaire.

4 – Afficher la liste des articles

Il est temps d’afficher la liste de nos articles sur notre page d’acceuil.

La première chose à faire est de modifier notre controller « indexController.php »

public function indexAction()
{
    // action body
    $articles = new Model_DbTable_Articles();
    
    $this->view->entries = $articles->fetchAll(
        $articles->select()
                 ->where('art_en_ligne = ?', '1')
                 ->order('art_date DESC')
                 ->limit(10, 0)
    );
}

Nous indiquons ici que nous recherchons les articles en ligne, par date de publication. J’ai pris ici la méthode préconisé dans la documentation, en utilisant l’objet « select ».

Il nous reste plus qu’à mettre en forme cette affichage dans le fichier application/views/scripts/index/index.phtml. Ce fichier est notre Vue, le V du MVC. Remplacer le contenu de ce fichier par :

<style>
h2 {
	color: #91BE3F;
	margin: 20px 0 10px 0;
}

h2 a {
	color: #91BE3F;
}

div.article {
	color: #000;
	width: 600px;
	border-bottom: 1px solid #444444;
}

span.date {
	color: #000;
	font-size: 12px;
}
</style>

<div id="welcome">
	<h1>Bienvenue sur notre Blog</h1>
</div>

<?php
foreach ($this->entries as $row) {
?>

<div class="article">

	<h2><?= $row->art_titre; ?></h2>

	<span class="date"><?= $row->art_date; ?> </span>

	<p class="chapeau"><?= $row->art_chapeau ?> </p>

</div>

<?php
}
?>

Nous pouvons maintenant voir notre résultat en rafraichissant notre navigateur :

Index du blog

Simple non ?

5 – Faire un lien sur le détail d’un article.

Nous n’allons pas nous arrêter en aussi bon chemin, nous allons faire un lien sur le titre de nos articles pour afficher le détail de celui ci.

Dans notre boucle d’affichage, ajoutons un lien sur le controller articles et sur l’action detail, en passant le parametre id, contenant l’id de l’article à afficher.

<?php
foreach($this->entries AS $row) { 
    $lien = $this->url(array('controller'=>'articles', 'action' => 'detail', 'id'=>$row->art_id )); 
?>
<div class="article">

	<h2>
		<a href="<?= $lien; ?>"><?= $row->art_titre; ?></a>
	</h2>
	<span class="date"><?= $row->art_date; ?> </span>
	<p class="chapeau"><?= $row->art_chapeau ?> </p>
</div>
<?php
}
?>

 

 

6 – Afficher le detail de l’article

Dans le controlleur : /application/controllers/ArticlesControllers, nous ajoutons ceci à la méthode « detailAction », afin de rechercher le detail d’un article en ligne :

public function detailAction()

{
    // Id of the Article
    $articleId = $this->getRequest()->getParam('id');
    
    if ($articleId != '') {
        
        $articles = new Model_DbTable_Articles();
        
        $this->view->data = $articles->fetchRow(
            $articles->select()
                     ->where('art_en_ligne = ?', '1')
                     ->where('art_id = ?', $articleId)
        );
    } else {
        $articleId->view->data = null;
    }
}

et dans le fichier application/views/scripts/articles/detail.phtml :

<style>
h1 {
	color: #91BE3F;
	margin: 20px 0 10px 0;
}

div.article_detail {
	color: #000;
	width: 600px;
	border-bottom: 1px solid #444444;
}

p.chapeau {
	font-style: italic;
}

span.date {
	color: #000;
	font-size: 12px;
}
</style>

<div class="article_detail">
	<h1><?= $this->data->art_titre; ?></h1>
	<span class="date"><?= $this->data->art_date; ?> </span>
	<p class="chapeau"><?= $this->data->art_chapeau ?> </p>
	<p class="corps"><?= $this->data->art_contenu ?> </p>
</div>

 

Si nous cliquons sur le titre de notre article, nous nous retrouvons maintenant sur le détail de l’article.

La suite…

Dans le prochain article, nous allons voir les points suivants :

  • La mise en forme avec le Zend Layout
  • Les liaisons entre nos tables, via le ZendDb
  • Les formulaires
  • La gestion des droits avec les ACLs pour la partie administration.
  • Personnaliser et mettre en place le routing des urls.

N’hésitez pas à me dire si vous voulez aborder certains points en particulier.

A voir ou revoir :

Visited 17 times, 1 visit(s) today