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