POO - News - Collector

Rechercher

POO - News - Collector

Par Mimosa  -  2 reponses  -  Le 18/03/2009 03:05  -  Editer  - 

Bonsoir,

J'ai lu la plupart des discussions traitant de l'OO sur votre forum. A partir des differentes remarques, codes donnés,..., j'ai tenté de faire un assemblage d'un peu tout afin de voir se que cela donné.

(Je n'y suis bien sur pas arrivé)

Alors voila je vais expliquer un peu avant de vous noyez dans du code. D'après se que j'ai pu comprendre en lisant les diverses discussions, lorsqu'on obtient plusieurs objet, nous les rangeons dans un collecteur qui peux implementé count et/ou iterator.

Cependant, se que je n'ai pas forcement compris dans un exemple concret que son les news : - Une news peut avoir une categorie => Doit-on créer un classe categorie en plus de News et donc créer un nouveau collecteur,... - Si oui, etant donné que l'on ne peux pas retrouné deux valeur (je crois), sommes nous obligé de passer par des getters afin d'obtenir la collection de news et celle de categorie ?

Je vais mettre quelque code bien qu'ils sont pour la plupart tiré du forum :

<?php
class BaseCollection implements Countable {
  protected $collection = array();
  public function add(Object $obj) {
    $this->collection[] = $obj;
  }
  public function getAll() {
    return $this->collection;
  }
  public function count() {
    return count($this->collection);
  }
}
?>
<?php
class NewsCollection extends BaseCollection {
  public function add(News $news) {
    $this->collection[] = $news;
  }
}
?>

J'ai une classe identique pour CatCollection

<?php
class News {
  private $_id = null;
  private $_catId = null;
  private $_titre = null;
  private $_body = null;
  public function hydrateFromArray(Array $news) {
    if (isset($news['nws_id'])) $this->setId($news['nws_id']);
    if (isset($news['nws_cat'])) $this->setCatId($news['nws_cat']);
    if (isset($news['nws_titre'])) $this->setTitle($news['nws_titre']);
    if (isset($news['nws_corps'])) $this->setBody($news['nws_corps']);
  }
  public function setId($id) {
    $this->_id = (int) $id;
  }
  public function setCatId($catId) {
    $this->_catId = (int) $catId;
  }
  public function setTitle($titre) {
    $this->_titre = (string) $titre;
  }
  public function setBody($body) {
    $this->_body = (string) $body;
  }
  public function getId() {
    return $this->_id;
  }
  public function getCatId() {
    return $this->_catId;
  }
  public function getTitle() {
    return $this->_titre;
  }
  public function getBody() {
    return $this->_body;
  }
  public function save() {
    return NewsTable::save($this);
  }
  public function delete() {
    return NewsTable::delete($this);
  }
}
?>

J'ai aussi une classe Categorie qui contient l'id et le libelle. Et voici la partie ou j'ai du mal a comprendre :(au niveau de getOne et getAll)

<?php
class NewsTable {
  const TABLE_ACTUALITE = 'news';
  const TABLE_CATEGORIE ='categorie';
  const F_ID = 'nws_id';
  const F_TITRE = 'nws_titre';
  const F_CORPS = 'nws_corps';
  const F_D_AD = 'nws_date_ad';
  const F_D_UP = 'nws_date_upd';
  const F_PUB = 'nws_publication';
  const F_AUT = 'nws_auteur';
  const F_CAT = 'nws_cat';
  private $_returnNews;
  private $_returnCat;
  public static function save(News $news) {
    // Une requête préparée avec une transaction
    try {
      $pdo = SPDO::getInstance();
      $pdo->beginTransaction();
      if (is_null($news->getId())) {
        $pdo->preparedQuery('INSERT INTO ? ('.self::F_TITRE.', '.self::F_CORPS.', '.self::F_D_AD.', '.self::F_D_UP.', '.self::F_PUB.', '.self::F_AUT.', '.self::F_CAT.') VALUES(?, ?, NOW(), NOW(), ?, ?, ?)', array(self::TABLE_ACTUALITE, $news->getTitle(), $news->getBody(), $news->getPublication(), $news->getAuteur(), $news->getCatId()));
        $pdo->commit();
      }
      else {
        $pdo->preparedQuery('UPDATE ? SET '.self::F_CAT.' = ?, '.self::F_TITRE.' = ?, '.self::F_CORPS.' = ?, '.self::F_AUT.' = ?, '.self::F_D_AD.' = ?,'.self::F_D_UP.' = NOW(), '.self::F_PUB.' = ? WHERE '.self::F_ID.' = ?', array(self::TABLE_ACTUALITE, $news->getCatId(), $news->getTitle(), $news->getBody(), $news->getAuteur(), $news->getDateAD(),$news->getPublication(), $news->getId()));
        $pdo->commit();
      }
    }
    catch(Exception $e) {
      // La requête a échoué donc on annule la transaction
      $pdo->rollBack();
      echo $e;
    }
  }
  public static function delete(News $news) {
    // Une requête préparée avec une transaction
    try {
      $pdo = SPDO::getInstance();
      $pdo->beginTransaction();
      $pdo->preparedQuery('DELETE * FROM ? WHERE '.self::F_ID.'= ?', array(self::TABLE_ACTUALITE, $news->getId()));
      $pdo->commit();
    }
    catch(Exception $e) {
      // La requête a échoué donc on annule la transaction
      $pdo->rollBack();
    }
  }
  public function getAll($start,$row) {
    $collectNews = New NewsCollection();
    $collectCat = New CatCollection();
    $request = 'SELECT * FROM '.self::TABLE_ACTUALITE.', '.self::TABLE_CATEGORIE.' LIMIT '. $start .', '.$row;
    $infos = SPDO::getInstance()->queryFetchAllAssoc($request);
    $aNews = array();
    $aCat = array();
    $size = sizeof($infos);
    for($i = 0; $i < $size; $i++) {
      $aNews[$i] = new News();
      $aNews[$i]->hydrateFromArray($infos[$i]);
      $collectNews->add($aNews[$i]);
      $aCat[$i] = new Categorie();
      $aCat[$i]->hydrateFromArray($infos[$i]);
      $collectCat->add($aCat[$i]);
    }
    $this->_returnNews = $collectNews;
    $this->_returnCat = $collectCat;
  }
  public function getNews() {
    return $this->_returnNews;
  }
  public function getCat() {
    return $this->_returnCat;
  }
  public function getOne($id_news) {
    $request = 'SELECT * FROM '.self::TABLE_ACTUALITE.', '.self::TABLE_CATEGORIE.' WHERE '.self::F_ID.'='. $id_news;
    $info = SPDO::getInstance()->queryFetchAssoc($request);
    $this->_returnNews = new News();
    $this->_returnNews->hydrateFromArray($info);
    $this->_returnCat = new Categorie();
    $this->_returnCat->hydrateFromArray($info);
  }
}
?>

 

Donc voil. je n'ai peut-être pas bien assemblé les bouts de codes trouvés ou mal compris mais je bloque à cette endroit. je n'arrive pas a modeliser les objets.

Merci d'avance

Cordialement Mimos@

 

Réponses apportées à cette discussion

Par Emacs  -  Le 18/03/2009 13:08  -  Haut de page  - 

Salut,

Non tu n'as pas bien compris. En fait, une news est liée à une catégorie et une catégorie peut avoir 0 ou plusieurs news (donc une collection de news). De ce postulat, tu peux créer dans ta classe News, un attribut privé (ou protégé) $category qui contient un objet Category. Tu penses bien sûr à faire les accesseurs associés getCategory() et setCategory(Category $c). De la même manière tu ajoutes dans ta table Category un attribut $news qui est un objet NewsCollection qui contient lui même les news associées à la catégories.

Maintenant, quand tu récupères une news et sa catégorie, tu dois alors hydrater ton objet News mais également ton objet Category que tu passes ensuite à ton objet News. Ce qui donne grosso modo :

<?php class NewsTable{  public function findById($pk)  {    $sql = sprintf(      'SELECT n.*, c.* FROM %s AS n LEFT JOIN %c AS c ON c.id = n.cat_id WHERE id = ? LIMIT 1',      self::TABLE_ACTUALITE,      self::TABLE_CATEGORIE    );     $stmt = SPDO::getInstance()->prepare($sql);    $stmt->bindParam(1, $pk, PDO::PARAM_INT);    $stmt->execute();     $rs = $stmt->fetch(PDO::FETCH_ASSOC);     if (empty($rs))    {      return null;    }     $news = new News();    $news->hydrateFromArray($rs);     return $news;  }} class News{  public function hydrateFromArray(Array $rs)  {    if (isset($rs['id']))    {      $this->setId($rs['id']);    }     if (isset($rs['title']))    {      $this->setTitle($rs['title']);    }     // ...    // Ici tu hyrates ton objet categorie    if (isset($rs['un_champ_particulier_de_la_categorie']))    {      $cat = new Category();      $cat->hydrateFromArray($rs);       $this->setCategory($cat);     // on associe la categorie à la news actuelle    }  }}

Voilà en gros comment tu peux mettre ça en place. L'idéal serait que tu utilises un ORM comme Doctrine qui te fait tout ça à ta place et en bien plus optimisé ;)

++

 
Par Mimosa  -  Le 18/03/2009 18:46  -  Haut de page  - 

Bonjour,

Merci de ta réponse rapide. Je vais tester ceci. Pour se qui est des ORM, j'avais déjà regardé du côté de Doctrine ou Propel mais helas je n'ai pas trouvé de tutoriel en Français. Mon anglais étant catastrophique j'ai vite abandonné.

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |