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

Décisions SGBD Discussion :

Quel table(s) et champs pour réaliser un Menu (BDD -> PHP -> Smarty)


Sujet :

Décisions SGBD

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 46
    Points : 50
    Points
    50
    Par défaut Quel table(s) et champs pour réaliser un Menu (BDD -> PHP -> Smarty)
    Bonjour à tous et à toutes.

    Voilà comme expliqué dans le titre je souhaiterai faire un menu qui serait stocké en BDD, pour que je puisse le récupérer via requête SQL et afficher le tout avec Smarty.

    Alors déjà je vous montre ce que j'ai déjà réalisé et pour commencer voila ma requêtes SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `menu` ORDER BY `pid`
    Voici ma table :

    Nom : Sans titre-1.png
Affichages : 316
Taille : 35,0 Ko


    Grâce à ce résultat, quand je récupère ce dernier dans un tableau en php, je fais une boucle et à chaque ligne (grâce aux champs class et pid) j'ouvre et ferme les balises qu'il faut avec smarty. L'avantage du "machin" que j'ai fait c'est que mon tableau ne sera parcouru qu'une et une seul fois. L’inconvénient par contre c'est que maintenant si je souhaite ajouter un nouvel entête à mon menu par exemple et que je désire qu'il soit en première position devant tout les autres. Je devrais changer le "pid" de toutes les lignes de mon tableau et le stocker en BDD. Si par contre je souhaite ajouter un sous menu à l’entête "Home" et bien je devrais changer le pid de tout les sous menus qui sont après lui pour le mettre à la bonne position...etc en gros je devrais faire pas mal de requêtes SQL. Ce qui, vous en conviendrez, n'est pas du tout optimisé.

    Donc ma question est, y a t-il une méthode pour créer le(s) table(s) et les champs à mettre dans une BDD qui puisse respecter ses trois critères :
    - Qu'il y est le moins de table possible. (1 table idéalement)
    - Que je n'ai pas à parcourir un ou plusieurs tableau(x) plusieurs fois juste pour afficher mon menu.
    - Que lorsque je souhaite ajouter, supprimer ou modifier un entête ou sous menu. Je n'ai pas besoin de faire une tonne de requête sql pour réorganiser ma table afin de respecter l'ordre d'affichage du menu selon le désire du client.

    Désoler pour ce long pavé mais je voulais bien détailler mon problème. Merci par avance au temps que vous me consacrerez et aux réponses (je suis sûr) utile pour la réalisation de mon problème.

    Cordialement.

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Pour moi ça serait possible avec sans doute 2 tables mais ...
    ... la gestion devrait se faire selon le SGBD avec PL/SQL ou PL/pgSQL, Transact-SQL etc.
    ou avec un langage de programmation comme PHP.
    Imaginons que la Maison passe après le garage dans le menu ? En une requête ça serait une requête plutôt balaise

    Bon ça fait une réponse ...
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 46
    Points : 50
    Points
    50
    Par défaut
    Alors je ne sais pas si ça a été compris mais je vais juste clarifier une chose. La requête SELECT me sert juste à mettre le menu en ordre pour que je puisse ensuite le mettre dans un tableau et l'envoyer à smarty pour le parcourir ligne par ligne et afficher mon menu. (Je peux poster la partie smarty si besoin). Donc oui j'utilise bien PHP.


    Citation Envoyé par vttman Voir le message
    Imaginons que la Maison passe après le garage dans le menu ? En une requête ça serait une requête plutôt balaise
    Exactement oui, c'est à dire que si on prend ton exemple je devrais changer le pid de tout les 'enfants' de Maison. Le faire en une requête serait absurde. Mon but et de trouver un moyen réorganiser ma table menu quand il y a des modif en utilisant le moins de INSERT et UPDATE possible. Je sais que mon souci vient de la manière dont j'ai créé ma table. C'est pourquoi je demande un semblant de structure qui pourrait m’aiguiller vers un truc plus optimisé. lorsque je ferait le côté php et Smarty.



    Pour ceux qui veulent plus de détails voilà mon php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $smarty->assign('subTitleLength', 1);
    $sql = 'SELECT * FROM `menu` ORDER BY `pid`';
    $result = Database::getInstance()->request($sql, false, true);
    $menuArray = array();
    foreach($result as $key_r)
    {
        $menuArray[] = $key_r;
    }
    $smarty->assign("menuResult", $menuArray);
    $smarty->display('templates/menu.tpl');

    Et voilà mon Smarty :

    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
    <nav class="nav1 navbar-expand-lg navbar-light">
    	<button class="navbar-toggler" type="button">
    		<span class="fa fa-align-justify "></span>
    	</button>
    	<ul id="navbar-nav" class="navbar-nav navbar-collapse collapse">
    		{foreach from=$menuResult item=$item name=iter}
    			{if $item->class=='nav_title'}
    				{if $smarty.foreach.iter.first}
    					<li><span class="{$item->class}">{$item->libelle_menu}</span>
    						<ul>
    				{else}
    					{if $subTitleLength > 1}
    						{while $subTitleLength > $item->pid|count_characters}
    						</ul>
    							</li>
    							 {assign var="subTitleLength" value=($subTitleLength-3)}
    						{/while}
    						{assign var="subTitleLength" value=1}
    					{/if}
    						</ul>
    					</li>
    					<li><span class="{$item->class}">{$item->libelle_menu}</span>
    						<ul>
    				{/if}
    			{elseif $item->class=='sub_title'}
    				{if $item->pid|count_characters > $subTitleLength}
    					<li><span class="{$item->class}">{$item->libelle_menu}</span>
    						<ul>	
    					{assign var="subTitleLength" value=$subTitleLength+3}
    				{elseif  $item->pid|count_characters == $subTitleLength}
    						</ul>
    					</li>
    					<li><span class="{$item->class}">{$item->libelle_menu}</span>
    						<ul>
    				{elseif  $item->pid|count_characters lt $subTitleLength}
    					{while $subTitleLength >= $item->pid|count_characters}
    							</ul>
    						</li>
    						{assign var="subTitleLength" value=($subTitleLength-3)}
    					{/while}
    					<li><span class="{$item->class}">{$item->libelle_menu}</span>
    						<ul>
    					{assign var="subTitleLength" value=($subTitleLength+3)}
    				{/if}
    			{elseif $item->class=='title'}
    				{if $item->pid|count_characters-2 lt $subTitleLength}
    					{while $subTitleLength > $item->pid|count_characters-2}
    							</ul>
    						</li>
    						{assign var="subTitleLength" value=($subTitleLength-3)}
    					{/while}
    				{/if}
    				<a class="{$item->class}" href="{$item->aURL}">{$item->libelle_menu}</a>
    				{assign var="subTitleLength" value=$subTitleLength}
    			{/if}
    		{/foreach}
    			</ul>
    		</li>
    	</ul>
    </nav>

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 775
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 775
    Points : 52 750
    Points
    52 750
    Billets dans le blog
    5
    Par défaut
    Un menu est arborescent. Donc la modélisation est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE T_MENU
    (MENU_ID                 INT IDENTITY PRIMARY KEY,
     MENU_ID_PERE            INT REFERENCES T_MENU (MENU_ID),
     MENU_ITEM               VARCHAR(256) NOT NULL);
    néanmoins, si vous allez faire des requêtes intensives, je vous conseille de modélisez cela sous forme intervallaire, car sinon, il faudra effectuer des requêtes récursives.

    Lire les articles que j'ai écrit à ce sujet :
    1) arborescence et requêtes récursive :
    https://sqlpro.developpez.com/cours/...te-recursives/
    2) arborescence en mode intervallaire
    https://sqlpro.developpez.com/cours/arborescence/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 46
    Points : 50
    Points
    50
    Par défaut
    Je vous remercie pour votre aide et les liens fournis. Cordialement.

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

Discussions similaires

  1. Récuperation de champs pour insérer dans une bdd.
    Par fazexx dans le forum Langages
    Réponses: 3
    Dernier message: 15/02/2016, 12h18
  2. Réponses: 13
    Dernier message: 29/04/2014, 14h02
  3. Quel CMS a été utilisé pour réaliser ce site ?!
    Par bnadem35 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 17/09/2008, 09h09
  4. alias ou synonymes pour les tables ou les champs ?
    Par nanou9999 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/03/2006, 11h04
  5. Réponses: 2
    Dernier message: 22/01/2006, 01h11

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