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

  1. #1
    Membre confirmé
    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
    Points : 460
    Points
    460
    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 éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    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 confirmé
    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
    Points : 460
    Points
    460
    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 éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    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 confirmé
    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
    Points : 460
    Points
    460
    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 confirmé
    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
    Points : 460
    Points
    460
    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 éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    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>";

  8. #8
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    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>";
    Exactement exact pour la récursion, merci.
    Résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!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 class="chemin"><a href="#">Pays</a>
    		<ul><li><a href="#">Rca</a></li>
    			<li class="chemin"><a href="#">Cameroun</a>
    				<ul><li><a href="#">Yaounde</a></li>
    					<li class="chemin"><a href="#" id="current">Douala</a>
    				</li></ul></li>
    			<li><a href="#">Tchad</a></li>
    		</ul></li>
    	<li><a href="#">Contact</a></li>
    </ul></body></html>

    Mais un souci persiste. Du html intrusif. Les doctype, html, head et body. Je n'en ai pas besoin.

    Moi je souhaite juste :

    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="#">Cameroun</a>
    				<ul><li><a href="#">Yaounde</a></li>
    					<li class="chemin"><a href="#" id="current">Douala</a>
    				</li></ul></li>
    			<li><a href="#">Tchad</a></li>
    		</ul></li>
    	<li><a href="#">Contact</a></li>
    </ul>

    Comment éjecter ce html en trop ?

    Merci d'avance...

  9. #9
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par okoweb Voir le message
    Mais un souci persiste. Du html intrusif. Les doctype, html, head et body. Je n'en ai pas besoin.
    Comment éjecter ce html en trop ?
    Le paramètre DOMNode fait affaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DOMDocument::saveHTML ([ DOMNode $node = NULL ] )
    Pour notre cas j'ai modifié ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if ($current = $doc->getElementById('current')) {
    	$node = null;
    	while ($current = $current->parentNode) {
    		if ($current->nodeName == 'li') {
    			$current->setAttribute('class', ltrim($current->getAttribute('class') . ' chemin'));
    			$node = $current->parentNode;
    		}
    	}
    }
     
    echo "<pre>" . htmlentities($doc->saveHTML($node)) . "</pre>";
    Merci pour votre aide.

+ 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