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

written by jean 25 août 2009
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 :

You may also like

9 comments

franckbenoit 8 septembre 2009 at 21 h 08 min

Je suis toujours, avec intérêt. Mais que veut dire ‘url propre’ ?

Reply
Jean Szabo 8 septembre 2009 at 22 h 36 min

l’idée est par exemple, que pour afficher les articles de la catégorie zend framework, nous utilison une url de ce genre : notreblog/categorie/zend_framework/ à la place de notreblog/categorie/id/2/ 

Comme cela, on maitrise complètement notre référencement

Reply
Lalo 13 octobre 2009 at 10 h 53 min

Bonjour,
dans l’index.phtml, il vous manque le « echo » , comme ça
<div class= »article »>

<h2><?php echo $row->art_titre; ?></h2>

<span class= »date »><?php echo $row->art_date; ?> </span>

<p class= »chapeau »><?php echo $row->art_chapeau; ?> </p>

</div>

Reply
Lalo 13 octobre 2009 at 11 h 07 min

echo() dispose aussi d’une version courte, où vous pouvez faire suivre la balise PHP ouvrante d’un signe égal (=). Cette syntaxe n’est possible que si la directive de configuration short_open_tag a été activée.

Reply
Wiglaf 13 octobre 2009 at 23 h 17 min

Je pour index.phtml, je suggère la boucle suivante qui correspond mieux à la doc ZF:

<?php foreach($this->entries as $row): ?>
<div class= »article »>
<h2><?php echo $this->escape($row->art_titre); ?></h2>
<span class= »date »><?php echo $this->escape($row->art_date); ?></span>
<p class= »chapeau »><?php echo $this->escape($row->art_chapeau); ?></span></p>
</div>
<?php endforeach ?>

Reply
guice11 7 août 2010 at 15 h 14 min

Est ce que cette série de tuto’ sur Zend s’arrête là à 3 partie ou pas ?

Reply
jean 8 août 2010 at 13 h 01 min

Je vais continuer la série, mais je dois mettre à jour en fonction des évolutions de ZendFramework.

Reply
guice11 8 août 2010 at 10 h 28 min

Moi quand je mets escape, les données avec accents disparaissent =/. Je ne sais pas pourquoi.

Reply
ostik 24 mai 2012 at 13 h 00 min

pareil c’est la merde !

Reply

Leave a Comment