POO - News - Collector
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 :
BaseCollection.class.php<?phpclass BaseCollection implements Countable {public function add(Object $obj) {$this->collection[] = $obj;}public function getAll() {return $this->collection;}}}?>
NewsCollection.class.php<?phpclass NewsCollection extends BaseCollection {public function add(News $news) {$this->collection[] = $news;}}?>
J'ai une classe identique pour CatCollection
News.class.php<?phpclass News {private $_id = null;private $_catId = null;private $_titre = null;private $_body = null;}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)
NewsTable.class.php<?phpclass 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;// Une requête préparée avec une transactiontry {$pdo = SPDO::getInstance();$pdo->beginTransaction();$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;}}// Une requête préparée avec une transactiontry {$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);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
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) { '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); { return null; } $news = new News(); $news->hydrateFromArray($rs); return $news; } } class News { { { $this->setId($rs['id']); } { $this->setTitle($rs['title']); } // ... // Ici tu hyrates ton objet 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é ;)
++
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é.
