IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Création d'une liste élément et sous éléments en objet


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    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

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ();
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    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.

Discussions similaires

  1. parcourir une liste et supprimer des éléments selon une condition
    Par jean-pat dans le forum Général Python
    Réponses: 17
    Dernier message: 17/03/2017, 22h07
  2. Création d'une liste avec un élément flèche
    Par Geo-x dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 29/06/2015, 17h19
  3. Réponses: 1
    Dernier message: 18/08/2010, 14h32
  4. Réponses: 3
    Dernier message: 05/10/2008, 02h53
  5. [JDOM] Recpérer une liste de tous les éléments d'un fichier XML
    Par adilo dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 30/08/2006, 10h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo