collection d'objets

Eléphant du PHP | 109 Messages

21 juil. 2008, 12:43

cette derrière version est très proche du code que j'utilise en .net c'est quasiment pareil
a part qu'il faut me familiariser avec cette nouvelle syntaxe et ce qu'on peut faire ou pas en php 5

j'utilise les property set get et les iterator de la même manière sinon

mais la je ne comprend pas pourquoi les valeurs ne sont pas retournée

ViPHP
ViPHP | 4674 Messages

21 juil. 2008, 12:51

En lisant rapidement :
while(null !== $current = $mi->current()) {

    echo '<strong>Id Menu</strong>&nbsp;:'  . $current->getId_menu() . "<br />\n";
    $mi->next();
}
Ça me semble plus cohérent.

Je ne sais pas si null est interprété comme false par while, d'où ma condtion null !==, sinon un simple $current = $mi->current() suffirait.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 109 Messages

21 juil. 2008, 13:07

pardon autant pour moi, les deux versions fonctionnent !
une variable manquant dans un include car j'avais copie le code dans un second fichier afin de tout garder

merci a vous deux

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2008, 14:22

Modération :
rufus_, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 juil. 2008, 16:09

Voici une version plus développée qui crée une collection d'objets hiérarchisés. Dans notre exemple, un menu peut avoir plusieurs sous-menus qui à leur tour peuvent en avoir d'autre à l'infini (fini).

C'est au moment du Add() dans la collection que cette méthode détecte s'il s'agit d'un menu parent ou enfant et affecte automatiquement dans la bonne branche.

Nouveauté aussi, pour supprimer un menu ou sous-menu par son key quelque soit son emplacement dans la hiérarchie.
<pre>
<?php
mysql_connect("localhost", "root", ""); mysql_select_db("test");

//
class MenuItems
{
   // Propriétés de la classe
   private $id_menu;
   private $text;
   private $id_parent;
   private $sous_menus; // menus enfants
   
   // Propriétés de la collection
   private $currentIndex;
   private $collection;
   
   // Constructeur de la classe
   public function MenuItems($id_menu=null, $text=null, $id_parent=null, $sous_menus=null){ // Params facultatifs
	$this->id_menu 		= $id_menu;
	$this->text 		= $text;
   	$this->id_parent 	= $id_parent;
	$this->sous_menus 	= array();
   }
   // Méthodes SET pour les propriétés privées
   public function setId_menu($id_menu){
   	$this->id_menu 	= $id_menu;
   }  
   public function setMenu($text){
   	$this->text = $text;
   }  
   public function setid_parent($id_parent){
   	$this->id_parent = $id_parent;
   } 
   public function setSous_menus($key, $sous_menus){
   	$this->sous_menus[$key] = $sous_menus;
   } 
   public function setCollection($collection){
   	$this->collection = $collection;
   } 
   // Méthodes GET pour les propriétés privées
   public function getId_menu(){
   	return $this->id_menu;
   }  
   public function getMenu(){
   	return $this->text;
   }  
   public function getid_parent(){
   	return $this->id_parent;
   } 
   public function getSous_menus(){
   	return $this->sous_menus;
   } 
   public function getCollection(){
   	return $this->collection;
   } 
   // Méthodes : Ajout, Recherche,  Suppression dans la collection
   public function exists($id_menu){
   	if (count($this->collection)>0 && $this->collection[$id_menu]) return true; else return false;
   }  
   public function getObject($id_menu){
   	if ($id_menu && $this->exists($id_menu)) return $this->collection[$id_menu];
   }
   public function addToParent(&$collection, $object) {
   	if (count($collection)>0){
	 foreach($collection as $key=>$text){
		if ($object->id_parent == $text->id_menu) { // Parent trouvé
			$collection[$key]->setSous_menus($object->id_menu, $object);
			return;
		}
		else $this->addToParent($collection[$key]->sous_menus, $object); // Recherche de parent dans les branches
	 }
	}
	return;
   }
   public function add($textObject){
   	if ($textObject->id_menu && ! $this->exists($textObject->id_menu)){
		$o = new MenuItems($textObject->id_menu, $textObject->text, $textObject->id_parent);
		//
		if ($o->id_parent != 0){ // sous-menu
			$this->addToParent($this->collection, $o); // place le sous-menu hiérachiquement
		}
		else $this->collection[$o->id_menu] = $o; // menu parent
	}
   }
   public function remove($id_menu, &$collection=null){
   	if (!is_array($collection) && $collection == null) $collection = &$this->collection;
	if ($id_menu && count($collection)>0){
		if ($collection[$id_menu]) { // Suppression d'un parent
			unset($collection[$id_menu]);
			return true;
		}
		else { // Suppression dans les sous-menus enfants
			foreach ($collection as $key=>$text){
				if ($this->remove($id_menu, $text->sous_menus)) return true;
			}
		}
	}
	return false;
   }
   // iterator : Naviguer dans la collection
   public function getCollectionKeys(){
   	return is_array($this->collection) ? array_keys($this->collection) : 0;
   }
   public function getCollectionSize(){
   	return count($this->collection);
   }
   public function current(){
	$keys = $this->getCollectionKeys();
	$currentKey = $this->currentIndex >= 0 ? $keys[$this->currentIndex] : null;
   	if ($currentKey && $this->collection[$currentKey]){
		$this->id_menu 		= $this->collection[$currentKey]->id_menu;
		$this->text 		= $this->collection[$currentKey]->text;
		$this->id_parent 			= $this->collection[$currentKey]->id_parent;
		$this->sous_menus 	= $this->collection[$currentKey]->sous_menus;
		//		
		return $this->collection[$currentKey];
	}  
	else return null;
   }  
    public function first(){
	$this->currentIndex = 0;
   }  
   public function next(){
	$this->currentIndex ++;
   }  
   public function previous(){
	$this->currentIndex --;
   }  
   public function last(){
	$this->currentIndex = $this->getCollectionSize()-1;
   }
}
//
$mi = new MenuItems();
//
$result = mysql_query("select id_menu, text, id_parent from menu");
while($result && $row = mysql_fetch_object($result))
{
  if ($row) {
       // Alimentation de la collection d'objets MenuItem
       $mi->add($row);
  }
}
//
$mi->first();
while ($mi->current()) {
	
   echo "<b>Id Menu: </b>", $mi->getId_menu(),"<br />", "<b>Text Menu: </b>",$mi->getMenu(),"<br />", "<b>Id Parent: </b>",$mi->getid_parent(),"<br />";
   echo "<b>Sous Menus : </b>"; print_r($mi->getSous_menus());
   $mi->next();
}
?>
</pre>
La base de données d'exemple:

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.11.6 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Lun 21 Juillet 2008 à 16:22 -- Version du serveur: 5.0.51 -- Version de PHP: 5.2.6 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de données: `test` -- -- -------------------------------------------------------- -- -- Structure de la table `menu` -- CREATE TABLE `menu` ( `id_menu` int(11) NOT NULL, `text` varchar(50) NOT NULL, `id_parent` int(11) default '0', PRIMARY KEY (`id_menu`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Contenu de la table `menu` -- INSERT INTO `menu` (`id_menu`, `text`, `id_parent`) VALUES (1, 'Menu 1', 0), (2, 'Menu 2', 0), (11, 'Sous-Menu 1.1', 1), (12, 'Sous-Menu 1.2', 1), (21, 'Sous-Menu 2.1', 2), (22, 'Sous-Menu 2.2', 2), (111, 'Sous-Menu 1.1.1', 11), (121, 'Sous-Menu 1.2.1', 12);
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 109 Messages

21 juil. 2008, 17:05

merci sadeq pour cette version très complète

j'utilise en effet une table hiérarchisée similaire id_menu, id_menuSup, menu plus quelques colonnes pour des cas particuliers comme lecture d'un sous menu ailleurs dans une liste