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 :

Générer l'arbre html à partir d'un array


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut Générer l'arbre html à partir d'un array
    Bonjour,
    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
    //Générer l'arbre html du menu
    function displayNav($array) {
    	//html du menu
    	$html = "";
    	if ( count($array )> 0 ) {
    		//Menu principal
    		$html .= '<ul>';
    		foreach ($array as $item) {
    			$html .= '<li>';
    			$html .= '<a href="#"';
    			if ( $item['css'] ) $html .= ' class="'.$item['css'].'"';
    			$html .= '>'.$item['name'].'</a>';
    			//Sous menu
    			( is_array($item['subs']) && count($item['subs']) > 0 ) ? $html .= displayNav($item['subs']) : '';
    			$html .= '</li>';
    		}
    		$html .= '</ul>';
    	}
    	return $html;
    }
     
    $temp = array(
    	array('name' => 'Accueil', 'css' => NULL, 'subs' => NULL),
    	array('name' => 'Pays', 'css' => NULL, 'subs' => array(
    		array('name' => 'Rca', 'css' => NULL, 'subs' => NULL), 
    		array('name' => 'Rdc', 'css' => 'current', 'subs' => NULL), 
    		array('name' => 'Tchad', 'css' => NULL, 'subs' => NULL))
    	),
    	array('name' => 'Contact', 'css' => NULL, 'subs' => NULL)
    );
     
    echo displayNav($temp);
    Résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <ul>
    	<li><a href="#">Accueil</a></li>
    	<li><a href="#">Pays</a>
    		<ul>
    			<li><a href="#">Rca</a></li>
    			<li><a href="#" class="current">Rdc</a></li>
    			<li><a href="#">Tchad</a></li>
    		</ul>
    	</li>
    	<li><a href="#">Contact</a></li>
    </ul>
    Je souhaite donc modifier displayNav() pour ajouter une classe .chemin sur les parents li de .current.

    Voici le résultat attendu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <ul>
    	<li><a href="#">Accueil</a></li>
    	<li class="chemin"><a href="#">Pays</a>
    		<ul>
    			<li><a href="#">Rca</a></li>
    			<li class="chemin"><a href="#" class="current">Rdc</a></li>
    			<li><a href="#">Tchad</a></li>
    		</ul>
    	</li>
    	<li><a href="#">Contact</a></li>
    </ul>
    En JavaScript, je le fais ainsi avec jQuery
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $('.current').parents("li").addClass('chemin');
    Comment le faire en Php ?

    Merci d'avance...

  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 : 38
    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
    avec DOMDocument et DOMXPath

    Ne te fais pas d'illusions, ce ne sera pas aussi simple qu'avec jQuery.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    J'ai essayé ceci ça ne marche pas
    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
     
    $html =  '<ul>
    	<li><a href="#">Accueil</a></li>
    	<li><a href="#">Pays</a>
    		<ul>
    			<li><a href="#">Rca</a></li>
    			<li><a href="#" id="current">Rdc</a></li>
    			<li><a href="#">Tchad</a></li>
    		</ul>
    	</li>
    	<li><a href="#">Contact</a></li>
    </ul>';
     
    $dom = new DOMDocument();
    $dom->loadHTML($html);
    foreach($dom->getElementById('current') as $current){
        $continue=true;
        $parent = $current->parentNode;
         while($continue){
             if($parent->tagName == 'li'){
                $parent->setAttribute('class',$parent->getAttribute('class').' chemin');
                $parent = $parent->parentNode;
     
             }else{
                  $continue = false;
             } 
         }
    }
    echo $dom->saveHTML();
    Pas de message d'erreur mais la classe .chemin n'est pas ajoutée.

    Merci pour votre aide.

  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 : 38
    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
    mmmh beaucoup de code pour pas grand chose...

    Voici une version plus "light":
    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
    $html =  '<ul>
    	<li><a href="#">Accueil</a></li>
    	<li><a href="#">Pays</a>
    		<ul>
    			<li><a href="#">Rca</a></li>
    			<li><a href="#" id="current">Rdc</a></li>
    			<li><a href="#">Tchad</a></li>
    		</ul>
    	</li>
    	<li><a href="#">Contact</a></li>
    </ul>';
     
    libxml_use_internal_errors(false);
     
    $doc = new DOMDocument;
    $doc->loadHTML($html);
     
    if ($anchor = $doc->getElementById('current')) {
    	$parent = $anchor->parentNode;
    	if ($parent && $parent->nodeName == 'li')
    		$parent->setAttribute('class', $parent->getAttribute('class') . ' chemin');
    }
     
    echo "<pre>" . htmlentities($doc->saveHTML()) . "</pre>";
    Chez moi ça fonctionne impec. Je ne vois pas pourquoi tu as utilisé une boucle

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut Un début de solution
    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
    function getbreadcrumb($doc, $checkclass, $addclass, $tag = null){
    	$return = false;
    	if ( $anchor = $doc->getElementById($checkclass) ) {
    		$parent = $anchor->parentNode;
    		if ( $parent && $parent->nodeName == $tag ) {
    			if ( $parent->hasAttribute ('class') ) {
    				$class = $parent->getAttribute('class');
    				$array_class = explode(' ', $class);
    				if ( !in_array($addclass, $array_class) ) $parent->setAttribute('class', $parent->getAttribute('class') . $addclass);
    			}
    			else $parent->setAttribute('class', $addclass);
    			$return = $doc->saveHTML();
    			//La récursive à ce niveau s'impose... 
                            $parent = ($parent->parentNode)->parentNode;
     
    		}
    	}
    	return $return;
    }
     
    $html =  '<ul>
    	<li><a href="#">Accueil</a></li>
    	<li><a href="#">Pays</a>
    		<ul>
    			<li><a href="#">Rca</a></li>
    			<li><a href="#" id="current">Rdc</a></li>
    			<li><a href="#">Tchad</a></li>
    		</ul>
    	</li>
    	<li><a href="#">Contact</a></li>
    </ul>';
    $doc = new DOMDocument();
    $doc->loadHTML($html);
    $html = getbreadcrumb($doc, 'current', 'chemin', 'li');
    echo $html;
    Ce code me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
    <html><body><ul><li><a href="#">Accueil</a></li>
    	<li><a href="#">Pays</a>
    		<ul><li><a href="#">Rca</a></li>
    			<li class="chemin"><a href="#" id="current">Rdc</a></li>
    			<li><a href="#">Tchad</a></li>
    		</ul></li>
    	<li><a href="#">Contact</a></li>
    </ul></body></html>
    Moi je souhaite obtenir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <ul>
    	<li><a href="#">Accueil</a></li>
    	<li class="chemin"><a href="#">Pays</a>
    		<ul>
    			<li><a href="#">Rca</a></li>
    			<li class="chemin"><a href="#" id="current">Rdc</a></li>
    			<li><a href="#">Tchad</a></li>
    		</ul>
    	</li>
    	<li><a href="#">Contact</a></li>
    </ul>
    2 soucis se posent :
    1. Tous les li parents de #current devrait posséder la classe .chemin (juste le parent direct l'a pourtant nous devrons monter à tous les li parents). Une récursive s'impose.
    2. Les doctype, head, body je n'en ai pas besoin.


    Que faire ?

    Merci d'avance...

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    pourquoi tu as utilisé une boucle
    Jusque pour ajouté une classe .chemin à tous les parents li (père, grand père, arrière grand...) de .currrent.

    Merci...

  7. #7
    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 : 38
    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
    Ok, j'avais pas compris ça

    Remarque, c'est pas beaucoup plus difficile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $doc = new DOMDocument;
    $doc->loadHTML($html);
     
    if ($current = $doc->getElementById('current')) {
    	while ($current = $current->parentNode) {
    		if ($current->nodeName == 'li')
    			$current->setAttribute('class', ltrim($current->getAttribute('class') . ' chemin'));
    	}
    }
     
    echo "<pre>" . htmlentities($doc->saveHTML()) . "</pre>";

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création d'un tableau html à partir d'un array
    Par hardShield dans le forum Langage
    Réponses: 5
    Dernier message: 26/07/2013, 15h17
  2. Générer du html à partir d'un Xpath
    Par ClemLamb dans le forum jQuery
    Réponses: 2
    Dernier message: 03/02/2009, 16h46
  3. Réponses: 1
    Dernier message: 19/11/2008, 18h51
  4. Réponses: 6
    Dernier message: 18/10/2007, 23h44
  5. Réponses: 3
    Dernier message: 07/12/2006, 07h18

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