Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Désolé pour toutes ces questions mais je suis en train de faire mon 1er site sur Zend et je souhaite prendre de bonnes habitudes dès le départ.
Chacun de mes models étend une class "AccesDonnees()".
Cette class AccesDonnes() me sert à récupérer, modifier et supprimer des infos d'une table.
Elle est assez basique :
<?php class AccesDonnes extends Zend_Db_Table { /** * Tableau associatif contenant les données brutes de l'enregistrement * @var array */ protected $Infos = array(); /** * Tableau associatif contenant les données pour le web de l'enregistrement * @var array */ public $infosWeb = array(); public function recupereInfos () { //--> TEST SI ON DOIT UTILISER LE CACHE $configSite = Zend_Registry::get("configSite"); if ( $configSite -> models -> cache == true ) { return $this -> _infosDepuisCache(); } else { return $this -> _infosDepuisSQL(); } } protected function _infosDepuisCache () { // Si le fichier de cache existe on le charge et on le met dans $this -> Infos // Sinon on ecrit le cache juste avant if ( !file_exists( $this -> _fichierCache() ) ) { if ( !$this -> _ecrireCache() ) { return false; } } include( $this -> _fichierCache() ); $this -> Infos = array_map("stripslashes", $infosCache); return true; } protected function _infosDepuisSQL() { $Select = $this -> select() -> where("`uid` = " . (int) $this -> _uid); if ( ($Row = $this -> fetchRow($Select)) != false ) { $this -> Infos = $Row -> toArray(); return true; } else { return false; } } protected function _fichierCache() { return CACHE_DIR . "/" . $this -> _nomCache . "_" . $this -> _uid . ".cache.php"; } protected function ecrireCache () { /* J'enregistre dans un fichier la valeur de l'enregistrement qui sont dans la table En gros mon fichier de cache contient les lignes suivantes : $infosCache['uid'] = 35; $infosCache['titre'] = "Lorem Ipsum"; $infosCache['lanceur'] = "<p>Mon lanceur</p>"; ... */ } public function recupererInfosPourWeb () { if ( !$this -> recupererInfos() ) { return false; } else { // preparerPourWeb() est propre à chaque model $this -> preparerPourWeb(); return true; } } } ?>
Et voici mon model Article.php
<?php class Article extends AccesDonnees { /** * Le nom de la table * @var string */ protected $_name = 'articles'; /** * L'id de l'élément en cours * @var int */ protected $_uid; /** * Le nom pour le fichier de cache. * Le fichier de cache se nomme $_nomCache_$_uid.cache.php ( par exemple article_155.cache.php) */ protected $_nomCache = "article"; function __construct($uid = null) { if ( is_numeric($uid) ) { $this -> _uid = $uid; } parent::__construct(); } public function preparerPourWeb() { $filtreChaine = new Zend_Filter(); $filtreChaine -> addFilter(new Zend_Filter_StripTags()) -> addFilter(new Zend_Filter_HtmlEntities()); //--> ON COPIE INFOS DANS INFOSWEB $this -> infosWeb = $this -> Infos; //--> VERIFICATION DES CHAMPS "BALISES INTERDITES" $arraySansBalises = array("titre", "surtitre", "titre_head", "meta_description", "meta_keywords"); foreach ( $arraySansBalises AS $unChamp ) { $this -> infosWeb[$unChamp] = $filtreChaine -> filter ($this -> Infos[$unChamp]); } return true; } } ?>
Voilà rapidement mes 2 class.
Donc dans le controller pour afficher un article J'instancie une nouvelle occurance de Article() en lui passant l'uid, je recherche ses infos et je les passes à la vue :
function lireAction () { $idArticle = $this -> _request -> getParam('uid'); $monArticle = new Article ($idArticle); $monArticle -> recupererInfosPourWeb(); $this -> view -> infosArticle = $monArtile -> infosWeb; }
Là pour un article ça va mais si je dois afficher une liste de 20 articles je vais instancier class Article() pour chaque article ( 20 instances de Article() ).
Pensez-vous que ce soit génant. Selon certains message sur le forum c'est pas le top.
Pensez vous qu'il soit plus interessant que mon model fasse des return plutôt que de renseigner des propriétés de la class ?
Par exemple :
function recupererInfos($uid) { //--> TEST SI ON DOIT UTILISER LE CACHE $configSite = Zend_Registry::get("configSite"); if ( $configSite -> models -> cache == true ) { return $this -> _infosDepuisCache($uid); } else { return $this -> _infosDepuisSQL($uid); } } protected function _infosDepuisCache () { // Si le fichier de cache existe on le charge et on le met dans $this -> Infos // Sinon on ecrit le cache juste avant if ( !file_exists( $this -> _fichierCache() ) ) { if ( !$this -> _ecrireCache() ) { return false; } } include( $this -> _fichierCache() ); return array_map("stripslashes", $infosCache); } protected function _infosDepuisSQL() { $Select = $this -> select() -> where("`uid` = " . (int) $this -> _uid); if ( ($Row = $this -> fetchRow($Select)) != false ) { return $Row -> toArray(); } else { return false; } }
Et dans mon controller :
$Article = new Article(); foreach ( $listeArticles AS $idArticle ) { $infosArticle[] = $Article -> renvoyerInfosPourWeb($idArticle); } $this -> view -> infosArticles = $infosArticle;
Comme ça si je dois afficher 20 article je n'ai qu'une instance de ma class Article.
Je vous avoue que la méthode actuelle me convient mais si elle n'est pas la bonne il vaut mieux que ja change maintenant...
Voilà, je suis débutant sur ZF et également en POO donc je m'en remet un peu à votre expérience...
Merci d'avance pour votre aide et désolé pour la taille des posts
Cordialement,
Kaimite
Hors ligne