Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/08/2011, 17h46   #1
Membre du Club
 
Inscription : février 2007
Messages : 226
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 226
Points : 55
Points : 55
Par défaut Création d'une liste élément et sous éléments en objet

Bonjour,

je fais appel à vous car j'ai un petit soucis. Je souhaite créer une liste d'éléments et sous-éléments (ul li) sur potentiellement plusieurs niveaux le tout en objet.

test
-- test1
-- test2

et "potentiellement" :

test
-- test1
-- test 22
-- test2
-- test18
-- test14


J'ai une classe Navigation et une classe SubNavigation. Navigation héritant de SubNavigation et la relation étant la suivante :

Navigation 1 ----------------- * SubNavigation


Du coup, je suis parti sur le design pattern Objet Composite qui semble correspondre à ce que je souhaite faire. Est ce le bon choix ?

Auriez-vous un exemple dans le genre que je recherche ?

Merci
Nemesis007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 18h24   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Selon moi, le composite est un poil trop fort pour ce que tu cherches à faire à moins que tu ne veuille par exemple dimensionner les noeuds fils en utilisant un parent quelconque. Un héritage (et éventuellement une interface) devrait largement suffire.

De plus tu n'as pas vraiment besoin de créer ces classes de toute pièce, tu peux tout simplement étendre la classe DOMElement en l'équipant de nouvelle méthode pour générer automatiquement la liste à partir d'un tableau par exemple.

Si tu souhaite faire quelque chose de plus simple, tu peux étendre une de mes classes: BaseHelper qui sert à fabriquer un noeud XML et donne des méthodes pour ajouter des noeuds fils et manipuler ses attributs.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php
/**
 * PHP AXIOM
 *
 * @license LGPL
 * @author Benjamin DELESPIERRE <benjamin.delespierre@gmail.com>
 * @category libAxiom
 * @package helper
 * $Date: 2011-05-18 17:00:36 +0200 (mer., 18 mai 2011) $
 * $Id: BaseHelper.class.php 22988 2011-05-18 15:00:36Z delespierre $
 */
 
/**
 * Base Helper Abstract Class
 *
 * @abstract
 * @author Delespierre
 * @version $Rev: 22988 $
 * @subpackage BaseHelper
 */
abstract class BaseHelper implements Helper {
 
    /**
     * Node's name
     * @var string
     */
    protected $_node_name;
 
    /**
     * Node's value
     * @var mixed
     */
    protected $_node_value;
 
    /**
     * Node's attributes
     * @var array
     */
    protected $_attributes;
 
    /**
     * Ndeo's children
     * @var array
     */
    protected $_children;
 
    /**
     * Default constructor
     * @param string $node_name
     * @param array $attributes = array()
     * @param mixed $node_value = null
     */
    public function __construct ($node_name, $attributes = array(), $node_value = null) {
        $this->_node_name = $node_name;
        $this->_node_value = $node_value;
        $this->_attributes = $attributes;
    }
 
    /**
     * (non-PHPdoc)
     * @see Helper::setAttributes()
     */
    public function setAttributes ($attributes) {
        foreach ($attributes as $key => $value) {
            $this->_attributes[$key] = $value;
        }
        return $this;
    }
 
    /**
     * (non-PHPdoc)
     * @see Helper::setValue()
     */
    public function setValue ($value) {
        $this->_node_value = $value;
    }
 
    /**
     * (non-PHPdoc)
     * @see Helper::getValue()
     */
    public function getValue () {
        return $this->_node_value;
    }
 
    /**
     * __call overloading
     * Enable the use of BaseHelper::setX() and BaseHelper::getX()
     * where X is an attribute of the current node
     * @param string $method
     * @param array $args
     * @return BaseHelper
     */
    public function __call ($method, $args) {
        if (strpos($method, 'set') === 0) {
            $this->_attributes[lcfirst(substr($method, 3))] = $args[0];
        }
        elseif (strpos($method, 'get') === 0) {
            return isset($this->_attributes[lcfirst(substr($method, 3))]) ? $this->_attributes[lcfirst(substr($method, 3))] : null;
        }
        return $this;
    }
 
    /**
     * (non-PHPdoc)
     * @see Helper::appendChild()
     */
    public function appendChild ($node) {
        return $this->_children[] = $node;
    }
 
    /**
     * (non-PHPdoc)
     * @see Helper::__toString()
     */
    public function __toString () {
        $attr = array();
        foreach ($this->_attributes as $name => $value) {
            $attr[] = "$name=\"$value\"";
        }
        $node = "<{$this->_node_name} " . implode(' ', $attr);
 
        if (!count($this->_children) && !$this->_node_value)
            return $node . " />";
        else
            $node .= ">";
 
        if ($this->_node_value)
            $node .= $this->_node_value;
 
        if (count($this->_children))
            $node .= implode($this->_children);
 
        return $node . "</{$this->_node_name}>";
    }
}
L'interface Helper:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
/**
 * PHP AXIOM
 *
 * @license LGPL
 * @author Benjamin DELESPIERRE <benjamin.delespierre@gmail.com>
 * @category libAxiom
 * @package helper
 * $Date: 2011-05-18 17:00:36 +0200 (mer., 18 mai 2011) $
 * $Id: Helper.class.php 22988 2011-05-18 15:00:36Z delespierre $
 */
 
/**
 * Helper Interface
 *
 * @author Delespierre
 * @version $Rev: 22988 $
 * @subpackage Helper
 */
interface Helper {
 
    /**
     * Set any number of attributes at once
     * @param array $attributes
     * @return Helper
     */
    public function setAttributes ($attributes);
 
    /**
     * Set the node's value
     * @param mixed $value
     * @return Helper
     */
    public function setValue ($value);
 
    /**
     * Get the node's value
     * @return mixed
     */
    public function getValue ();
 
    /**
     * Appends a node to current node and return it
     * @param mixed $node
     * @return mixed
     */
    public function appendChild ($node);
 
    /**
     * __toString overloading
     * Get a string represenation of
     * current node and its children
     * @return string
     */
    public function __toString ();
}
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 18h43   #3
Membre du Club
 
Inscription : février 2007
Messages : 226
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 226
Points : 55
Points : 55
Merci pour ta réponse Benjamin mais je suis parti sur la solution du Composite en moins évoluer.


Voici ce que j'ai fait

1. Classe Navigation (hérite de NavigationElement)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
<?php
 
require_once 'navigation_element.php';
 
class Navigation extends NavigationElement
{
  // titre de mon ul
  protected $m_sTitle;
  // contenu des ul pouvant etre des ul, li
  protected $m_aoNavigationElements;
 
  // titre de l'ul
  public function __construct($psTitle)
  {
    $this->m_sTitle = $psTitle;
  }
 
  // ajout d'un element 
  public function AddElement($psTitle)
  {
	$oNavigationElement = new NavigationElement();
    $oNavigationElement->AddElement($psTitle);
	$this->m_aoNavigationElements[] = $oNavigationElement;
  }
 
  public function GetResult()
  {
    $sResult = '';
 
	$sResult .= '<div>';
	$sResult .= $this->m_sTitle;
	$sResult .= '</div>';
	$sResult .= '<ul>';
 
 
	// pour chaque sous élement, on récupère l'html
	foreach ($this->m_aoNavigationElements as $oNavigationElement)
	{
		$sResult .= '<li>' . $oNavigationElement->m_sTitle . '</li>';
	}
 
	$sResult .= '</ul>';
 
    return $sResult;
  }
}
 
?>
2. Classe NavigationElement
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
require_once 'navigation.php';
 
class NavigationElement
{
	protected $m_sTitle;
 
	protected function AddElement($psTitle)
	{
		$this->m_sTitle = $psTitle;
 
	}
}
3. Programme de test
Code :
1
2
3
4
5
6
7
8
 
include 'navigation.php';
 
 
$myNavigation = new CNavigation('Mon super titre');
$myNavigation->AddElement('mon super sous titre 1');
$myNavigation->AddElement('mon super sous titre 2');
echo $myNavigation->GetResult();
Cependant, je reste sceptique sur la méthode AddElement, d'après moi, l'héritage ne me sert à rien là. J'ai surement loupé quelque chose et plus je me casse la tête plus je m'en brouille ^^ vive l'objet !
Nemesis007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 18h57   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
J'aimerai bien que tu m'explique où est le composite dans le code que tu fournis... Là je vois de l’agrégation tout au plus.

Deuxième chose: tu pourrais tirer avantage des méthodes magiques comme __toString qui permettent la conversion objet > chaine de caractères.

Enfin, je ne vois pas d'utilité particulière à ton héritage, je ne vois pas non plus de justification.

Bref, relis les sources que je t'ai passé et repense à tout ça.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h13.


 
 
 
 
Partenaires

Hébergement Web