Précédent   Forum des professionnels en informatique > PHP > Langage > Formulaires
Formulaires Forum d'entraide sur les formulaires avec PHP. Avant de poster -> FAQ formulaires, Cours de formulaires et Sources de formulaires
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 03/05/2007, 15h47   #1
Membre du Club
 
Avatar de Lost In Translation
 
Raphaël Deschler
Inscription : mai 2007
Messages : 166
Détails du profil
Informations personnelles :
Nom : Raphaël Deschler
Âge : 25
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : mai 2007
Messages : 166
Points : 55
Points : 55
Par défaut Soucis de création de menu

Bonjour à tous,

Je travaille sur la création d'un CMS multilingue pour une société (j'y suis stagiaire). Je butte actuellement sur une question de menu.

Les rubriques composants les menus sont enregistrés dans ma BDD (mysql).
Le menu que je dois créer est un menu déroulant sur 3étages :
ONGLET => menu déroulant 1 au passage sur l'onglet => menu déroulant 2 sur certains liens du déroulant 1.

Ainsi dans ma bdd, j'ai pour une rubrique parents trois attributs pour gérer ceci :
1) ordre, qui est un INT qui va me dire la position
2) Parent, c'est l'identifiant de la rubrique parente
3) arborescence, de la forme x-y-z (où x,y et z sont des chiffres)

Imaginons que Mon premier onglet ait un déroulant 1 à 3 lien et que le lien numéro 2 ait un déroulant à 2 liens, cela se noterait ainsi :

Onglet (1-0-0 signifie onglet 1)
|--> rubrique 1 (notée 1-1-0, elle est fille de l'onglet 1 (premier chiffre) et placée en position 1 (2e chiffre)
|--> rubrique 2 (notée 1-2-0)
|------> sous rubrique 1 (notée 1-2-1)
|------> sous rubrique 2 (notée 1-2-2)
|--> rubrique 3 (notée 1-3-0)
|
onglet 2 (noté 2-0-0)
....

Pour gérer ceci, je suis en train de faire une classe php5...

J'ai donc une fonction qui me trie mes rubriques dans trois tableaux :
- onglet si de la forme x-0-0
- menu si de la forme x-y-0
- sous menu si de la forme x-y-z

J'ai une deuxieme fonction qui détermine si deux rubriques sont parentes...

Et ensuite, je calle...

Voici à peu près sur quoi je voudrais tomber en html :
Code HTML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
<ul id="nav">
<li><a href="#">Rubrique 1-0-0</a>
  <ul>
    <li><a href="rubrique">Rubrique 1-1-0</a></li>
    <li><a href="fghjk">Rubrique 1-2-0</a>
      <ul>
        <li><a href="fghj">Rubrique 1-2-1</a></li>
        <li><a href="dfghj">Rubrique 1-2-2</a></li>
      </ul>
    </li>
    <li><a href="fghjk">Rubrique 1-3-0</a></li>
  </ul>
</li>
</ul>

Et voici les fonctions de ma classe menu.class.php

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
 
class Menu
{
  //variables de la classe
  //public
 
 
  //protected
 
  //private
  private $onglet = array(); //tableau contenant tous les onglets
  private $menu = array(); //tableau contenant tous les menus
  private $sousmenu = array();//tableau contenant tous les sousmenus
  private $arborescence = array(); //tableau contenant les tableaux ci dessus
  private $arborescenceFinale = array(); //tableau à trois dimension contenant le menu final
 
  //constructeur
 
  //Methodes de récupération
 
  private function getArborescenceMenu($langue, DB $DB)
  {
    //je récupère l'id de la langue
    $idlangue = $DB->getidLangue($langue);
 
    //je récupère toutes les rubriques où ismenu = 1 et qui sont disponible dans ma langue
    $sql = $DB->exec_sql("SELECT * FROM rubrique,existe_dans WHERE ismenu = 1 AND langue_idlangue='{$idlangue}' AND rubrique_idrubrique = idrubrique ORDER BY ordre ASC");
 
    //je trie mes langues : en trois tableau : onglet / menu / sous menu
    while($ligne = mysql_fetch_array($sql))
    {
      $e = explode('-',$ligne['numerorubrique']);
      if($e[0] > 0 && $e[1] == 0 && $e[2] == 0)
        $this->onglet[] = $ligne['idrubrique'];
      elseif($e[0] > 0 && $e[1] > 0 && $e[2] == 0)
        $this->menu[] = $ligne['idrubrique'];
      else
        $this->sousmenu[] = $ligne['idrubrique'];        
    }
    mysql_free_result($sql);
 
    //je construis un tableau arborescant
    $this->arborescence[] = $this->onglet;
    $this->arborescence[] = $this->menu;
    $this->arborescence[] = $this->sousmenu;
 
    return $this->arborescence;   
  }
 
  private function isParent($rub1, $rub2, DB $DB)
  {
    $r1 = $DB->getInfosRubrique($rub1);
    $r2 = $DB->getInfosRubrique($rub2);
 
    $e1 = explode('-',$r1['numerorubrique']);
    $e2 = explode('-',$r2['numerorubrique']);
 
    if($e1[0]==$e2[0])
      return true;
    else
      return false; 
  }
 
  private function isSubParent($rub1,$rub2, $DB)
  {
    $r1 = $DB->getInfosRubrique($rub1);
    $r2 = $DB->getInfosRubrique($rub2);
 
    $e1 = explode('-',$r1['numerorubrique']);
    $e2 = explode('-',$r2['numerorubrique']);
 
    if($e1[0]==$e2[0] && $e1[1]==$e2[1])
      return true;
    else
      return false;  
  }
Et à partir de là, je suis bloqué... deux jours que j'essaye de faire quelques trucs... mais non, j'n'y arrive pas. Je ne sais plus quoi faire de ces bouts de code...

Si quelqu'un a une solution. Je sais que je vais devoir faire quelque chose de récurssif... mais je ne sais pas quoi.

Je voyais un truc du genre

tant que j'ai des onglets dans mon tableau d'onglet
1) je verifie si menu[0] est parent de onglet[0]
2) si oui, j'écris mon bout de html (ou je le stock)
3) sinon, je passe à menu[1]
4) si menu[1] est parent de onglet[1], j'écris
5) je verifie si sousmenu[0] est parent de menu[1]
6) si oui, j'écris
7) sinon je passe à sousmenu[1]....
8) et je passe ensuite à onglet[1]

Mais, voilà, n'est-ce pas trop lourd niveau exécution ? N'y a-t-il pas plus simple ?

Merci de vos aides... ceic est mon premier post sur ce forum ^^ désolé si je ne respecte pas certaines règles
Lost In Translation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2007, 18h07   #2
Membre du Club
 
Avatar de Lost In Translation
 
Raphaël Deschler
Inscription : mai 2007
Messages : 166
Détails du profil
Informations personnelles :
Nom : Raphaël Deschler
Âge : 25
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : mai 2007
Messages : 166
Points : 55
Points : 55
Et bien, rien que le fait d'avoir détaillé ici les étapes qu'il faudrait que je fasse m'a éclairci la route...

Je viens de finir et le résultat marche.

Voici donc le code final

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
 
public function createHtmlMenu($langue, DB $DB)
  {
    //je récupere mon arborescence
    $arbo = $this->getArborescenceMenu($langue, $DB);
 
    $i = 0;
    while($i < count($arbo[0]))
    {
      //j'entame le html
      $this->arborescenceFinale = '<ul id="nav">'."\n";  
      //je recupere les infos de la rubrique de type x-0-0
      $rub = $DB->getInfosRubrique($arbo[0][$i]);
      //j'écris les infos
      $this->arborescenceFinale .= '<li><a href="'.$rub['cible'].'">'.$rub['titrerubrique'].'</a>'."\n";
 
      //je verifie s'il a un enfant ou pas
      if($DB->getNbreEnfants($i+1) <= 0) //il n'y a pas d'enfant
        $this->arborescenceFinale .= '</li>'."\n".'</ul>'."\n";//c'est un onglet seul
      else
      {//il y a des enfants...
        //je continue mon html
        $this->arborescenceFinale .= '<ul>'."\n";
 
        $j = 0;
        while($j < count($arbo[1]))
        {
          //je regarde si arbo[0][$i] est parent avec arbo[1][$j]
          $srub = $DB->getInfosRubrique($arbo[1][$j]);
          if ($this->isParent($rub['numerorubrique'],$srub['numerorubrique']))
          {//ils sont parents 
            //j'écris mon html
            $this->arborescenceFinale .= '<li><a href="'.$srub['cible'].'">'.$srub['titrerubrique'].'</a>'."\n";
            //je verifie si $arbo[1][$j] a des enfants
            if($DB->getNbreEnfants($i+1,$j+1) <= 0)//il n'y a pas d'enfants
              $this->arborescence .= '</li>'."\n";
            else
            {//il y a des enfants
              //je continue mon html
              $this->arborescenceFinale .='<ul>'."\n";
 
              $k = 0;
              while($k < count($arbo[2]))
              {
                $ssrub = $DB->getInfosRubrique($arbo[2][$k]);
                //je regarde si arbo[1][$j] est Subparent avec arbo[2][$k]
                if($this->isSubParent($srub['numerorubrique'],$ssrub['numerorubrique']))
                {//ils sont parents
                  //j'écris mon html
                  $this->arborescenceFinale .= '<li><a href="'.$ssrub['cible'].'">'.$ssrub['titrerubrique'].'</a></li>'."\n";
                }
 
                $k++;
              }
              $this->arborescenceFinale .= '</ul>'."\n";
            }              
          } 
          $j++;
        }
      $this->arborescenceFinale .= '</ul>'."\n";
      }
      $this->arborescenceFinale .='</ul>'."\n";
      $i++;
    }   
    return $this->arborescenceFinale;
  }
Lost In Translation est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h02.


 
 
 
 
Partenaires

Hébergement Web