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

JavaScript Discussion :

Parse et remplissage de tableaux dynamiques


Sujet :

JavaScript

  1. #21
    Futur Membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Novembre 2018
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Novembre 2018
    Messages : 53
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    @psychadelic
    Depuis le début le gros du problème est que vous donnez l'impression de lire mes posts qu'en diagonale!
    Mon dernier code, tu l'as lu (que les 20 premières lignes), ou tu l'as exécuté?
    En le lisant, on pourrait comprendre comme toi.
    En l'exécutant on comprend très bien que ce select dont tu parles concerne une partie déjà réalisée, montrée à titre d'exemple précisément pour que le traitement de code de la seconde partie de page, celle mon objectif avec vous, soit similaire, et en tout cas donne le même type de rendu pour les tags produits.
    Et là encore çà ne vous va pas, alors que tout est posé!
    Je veux bien comprendre que tout ne soit pas toujours très clair, mais j'aimerai bien avancer concrètement sur ce qui me pose problème, et pas sur mon dev ou autre qui est pourri :
    - parser un code html (d'un menu, vous l'avez)
    - organiser les données récupérées dans X tableaux, X dimensions ou pas bref je prend ce qui est possible, mon développement n'ira pas plus loin et restera hors ligne

    Et avec la difficulté, je l'accorde, que techniquement je ne sois pas au niveau.
    Et que vous ayez beaucoup plus de mal à vous adapter un minimum au mien, qui demandais d'emblée un<minimum de tolérance...

    Cà tombe bien que j'ai une course à faire ce matin, çà me donnera le temps de me poser moi aussi.

    [EDIT]
    Je complète tout de même avec des éléments de réponse :
    qu'elles sont les informations à prélever sur la source ?
    => uniquement le nom des catégories, sous-catégories, sous-sous-catégories
    dans quel logique de hiérarchie faut-il les classer ?
    => j'imaginais un 1er tableau avec en indice 0 la 1ère grande catégorie, en 1 la seconde, en 2 la 3ème
    => puis un second tableau[0][0] avec la sous-catégorie 1.1, [0][1] avec la sous-catégorie 1.2, etc....
    => puis un 3ème tableau[0][0][0] avec la sous-catégorie 1.1, [0][1] avec la sous-catégorie 1.2, et [0][1] [1] avec la sous-sous-catégorie 1.2.2, etc etc...
    Et ce pour toutes mes catégories, sous-catégories, sous-sous catégories de mon menu.
    Un tableau à X dimensions me selbait pertinent pour tout çà. Voilà
    [/EDIT]

    Je dois vraiment y aller, à tout à l'heure j'espère

  2. #22
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- On a compris !

    ...Depuis le début le gros du problème est que vous donnez l'impression de lire mes posts qu'en diagonale!...
    Tu m'étonnes... Chacun de tes posts fait 15km de long !
    A chaque question qu'on pose, tu nous fais une dissertation. Avec thèse, antithèse..... Mais sans synthèse !

    Comprends-nous : on n'a pas le temps.
    Tu n'auras pas de réponse précise tant que tu essaieras de nous vendre ton encyclopédie en 30 volumes.



    2- DONC : UNE SEULE CHOSE A LA FOIS !
    Soyons concrets, soyons précis.

    • - parser un code html (on OUBLIE l'organisation de l'array, pour l'instant)

    On t'a donné des pistes.
    As-tu testé quoi que ce soit ?

    Merci de :
    • répondre par : "oui" / "non"
    • Et si "oui", montre le bout de code (et seulement ça)
    Dernière modification par Invité ; 06/11/2018 à 09h47.

  3. #23
    Futur Membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Novembre 2018
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Novembre 2018
    Messages : 53
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    On t'a donné des pistes.
    As-tu testé quoi que ce soit ?

    Merci de :
    • répondre par : "oui" / "non"
    • Et si "oui", montre le bout de code (et seulement ça)
    NON, je n'ai encore rien testé, rien à vous mettre sous la dent, et compte-tenu de la réponse, j'aimerai tellement revenir vers vous rapidement, mais j'en doute fortement (à défaut, le problème restera non résolu, sachez-le).

    Pour ceux qui n'ont pas assez de temps, pas besoin DU TOUT de lire le reste.

    Pour les autres, je détaille, peu importe le crédit que vous y accorderez, çà ne changera pas mon esprit du moment...
    Je connais mes limites et je vais vite être largué ; j'ai déjà précisé que je me sentais incapable de mettre en oeuvre ces API.
    Je constate que la seule réponse serait de me laisser foncer droit dans le mur, car je ne sais même pas par où commencer (je n'en ai JAMAIS utilisé, et c'est visiblement en anglais...).
    Il va falloir que je décortique et tente (sans aucune garantie d'y parvenir, je me connais) de comprendre TOUTE une doc pour à priori 2 ou 3 types de traitements qui me seraient utiles?
    Je sais déjà que le temps -et les nerfs- que je vais y passer est incompatible avec le temps qu'il me reste pour obtenir un bout de code valable, et je vois bien que l'enjeu d'un décoincement rapide de la situation n'a pas été entendu...

    Bref, le but n'est pas de faire perdre plus de temps aux bonnes âmes.
    D'autres, bien plus à l'aise en développement, ont aussi des problèmes à résoudre, et verront leur problème s'envoler avec le nom d'une API dédiée, mais moi c'est pas mon cas.

    Je ne sais même pas si j'oserai encore revenir demander de l'aide. Non sans fierté, je reviendrai peut-être pour dire résolu, mais à quel prix...
    D'un superbe projet, on arrive sans nécessairement s'en rendre compte, à déstabiliser des gars et les rendre encore moins sûr d'eux que lorsqu'ils sont arrivés sur le forum.
    Si t'as besoin d'aide, on te fait comprendre qu'il faut savoir bien coder, savoir te démerder avec n'importe quelle API etc etc, peu importe ton niveau...
    Pourtant je suis un bosseur, j'aligne parfois plus de 15 ou 20 heures plusieurs jours d'affilée lorsque je me colle à un développement laborieux, et lorsque j'arrive au bout de mes limites, OK mon code est pourri, c'est nul, y'a toujours mieux à faire, plus efficace et plus joli, bien meilleur que moi, mais cette fois-ci j'ai pris sur moi et ma fierté pour solliciter de l'aide, car je ne pouvais pas me permettre de perdre davantage de temps.
    C'était il y a déjà plus de 15 ans, souvent les mêmes qui aident encore aujourd'hui ; à la différence que de mon côté, j'ai plus ou moins décroché, et certaines réponses qui m'ont été faites ici ont largement contribué à ce décrochage.
    Mais comme il y a 15 ans, les débutants ont toujours le sentiment de ne pas avoir leur place ici, et de faire perdre le temps aux autres et c'est bien dommage, çà ne donne pas le goût et l'envie d'aller plus loin.

  4. #24
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ton problème essentiel n'est pas le manque de connaissance en programmation.

    Ton problème essentiel est de vouloir TOUT faire en même temps !
    C'est NORMAL que tu te sentes perdu, et à la limite d'abandonner.


    Citation Envoyé par jreaux62 Voir le message
    UNE SEULE CHOSE A LA FOIS !


    “Un voyage de mille lieues commence toujours par un premier pas.”
    Lao-Tseu

  5. #25
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 890
    Points : 3 729
    Points
    3 729
    Par défaut
    Voici un début pour t'aider, tu peux tester ici : https://jsbin.com/qurozihazo/edit?html,css,js,output

    - Pour la première étape (parser le code HTML) j'ai utilisé la deuxième solution dont je parlais : remplacer ta <textarea> par une simple <div> ayant pour id : "menu" (tu peux voir cela dans le lien ci-dessus), le code html sera alors parsé automatiquement par le navigateur...

    ---> On a donc accès à toutes les méthodes du DOM, comme querySelectorAll()...

    - Le code JS ne fait pas tout, il construit les deux premiers tableaux : "a_categories" (une dimension) et "a_sous_categories" (deux dimensions)... Les éléments de ces tableaux sont les liens (balises <a>) correspondant respectivement aux catégories et sous-catégories... On pourrait y mettre autre chose comme le texte, c'est facile à changer si besoin...

    D'ailleurs cela dépend de ton besoin, ces éléments pourraient être des objets contenant le texte du lien, le lien...

    --> Pour visualiser ces tableaux utilise la console du navigateur...

    Pour le code JS, je pense qu'il y a mieux, c'est à voir... Mais au moins tu as un exemple de la première étape...

  6. #26
    Futur Membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Novembre 2018
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Novembre 2018
    Messages : 53
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Ton problème essentiel est de vouloir TOUT faire en même temps !
    C'est NORMAL que tu te sentes perdu, et à la limite d'abandonner.
    Non, pas du tout....
    A la question "comment puis-je parser rapidement à mon niveau", mon 1er problème, je me vois répondre en dernier lieu qu'il me faut décortiquer une API dédiée et vous envoyer le résultat de mes tentatives, qui SERONT laborieuses...
    Ben désolé, mais même avec toute la bonne volonté du monde, avec mes bagages et l'urgence de la situation, la réponse DANS MON CAS n'est pas adaptée.
    C'est mon sentiment, et c'est aussi votre droit, pour accepter de m'aider, de m'imposer l'étude complète d'une API, puisque çà vous ferait gagner pas mal de temps...
    Mais c'est d'abord pour celà que oui, je me sens d'autant plus perdu et à la limite d'abandonner.

    Après, ce projet, c'est mon avenir, et il se joue dans les tous prochains jours, donc je vais persévérer, et cela se fera avec ou peut-être sans vous...
    Mais toujours en regrettant de ce forum la forme et le fond... Et ce satané petit coup de pouce tant attendu de codeurs aguerris, qui m'aurait à cette heure-ci déjà permis de mettre en oeuvre un traitement (un patch, une solution de secours, bref un truc un peu plus concret) qui répondrait au problème et me permettrait de passer à l'étape suivante.

    Bref, quand tu as l'impression de tomber comme un cheveu sur la soupe, et en plus de donner mauvais goût, tu t'écrases (parce que clairement c'est déjà bien gentil d'avoir eu plusieurs profils qui se sont intéressés à ton problème) et tu tentes de te démerder avec ce que tu as, sans ennuyer davantage une communauté déjà bien occupée sans toi.

  7. #27
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 749
    Points
    4 749
    Par défaut
    tsss..
    Code HTML : 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
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    <!DOCTYPE HTML>
    <html lang="fr">
    <head>
      <meta charset="UTF-8">
      <title>aaa parse</title>
      <style>
        h3,h5 { text-align: center }
        textarea {
          margin: 7px auto;
          border: 1px solid grey;
          padding: 3px;
          width: 700px;
          height: 320px;
          display: block;
        }
        input[type="button"] { display: block; margin:0 auto;}
     
        nav { padding: 5px;
          background-color: lightseagreen
        }
        nav ul { list-style: none; padding: 0 0 0 20px }
      </style>
    </head>
    <body>
     
      <h3>RECONSTRUCTION DU MENU</h3>
      <form name="form">
     
        <h5>Arborescence copiée-collée :</h5>
     
          <textarea name="codeorigine">
              <ul class="site-nav nav-position-2" id="accessibleNav">
     
                  <li data-dropdown-rel="categorie-1" class="site-nav--has-dropdown" aria-haspopup="true">
     
                    <a  href="/collections/collectionX">Catégorie 1
                      <span class="icon-fallback-text">
                        <i class="fa fa-angle-down" aria-hidden="true"></i>
                      </span></a>
     
     
     
     
     
                  <ul class="site-nav--dropdown ">
     
     
                      <li >
     
                        <a href="/collections/collectZ">Sous-Catégorie 1.1</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.1.1</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.1.2</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.1.3</a></li>
     
                          <li ><a href="/collections/collectionX-1">Sous-Sous-Catégorie 1.1.4</a></li>
     
                        </ul>
                      </li>
     
     
     
                      <li >
     
                        <a href="/collections/collectZ">Sous-Catégorie 1.2</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.2.1</a></li>
     
                          <li ><a href="/products/produitSZ">Sous-Sous-Catégorie 1.2.2</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.2.3</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.2.4</a></li>
     
                        </ul>
                      </li>
     
     
     
                      <li >
     
                        <a href="/collections/collectZ">Sous-Catégorie 1.3</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.3.1</a></li>
     
                          <li ><a href="/collections/collectZ">Sous-Sous-Catégorie 1.3.2</a></li>
     
                          <li ><a href="/products/produitOPD">Sous-Sous-Catégorie 1.3.3</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.3.4</a></li>
     
                        </ul>
                      </li>
     
     
     
                      <li >
     
                        <a href="/products/produitOPD">Sous-Catégorie 1.4</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.4.1</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.4.2</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.4.3</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.4.4</a></li>
     
                        </ul>
                      </li>
     
     
                    </ul>
     
     
                  </li>
     
     
     
                  <li data-dropdown-rel="categorie-2" class="site-nav--has-dropdown" aria-haspopup="true">
     
                    <a  href="/collections/collectionX">Catégorie 2
                      <span class="icon-fallback-text">
                        <i class="fa fa-angle-down" aria-hidden="true"></i>
                      </span></a>
     
     
     
     
     
                  <ul class="site-nav--dropdown ">
     
     
                      <li >
     
                        <a href="/collections/collectionX">Sous-Catégorie 2.1</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.1.1</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.1.2</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.1.3</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.1.4</a></li>
     
                        </ul>
                      </li>
     
     
     
                      <li >
     
                        <a href="/collections/collectionX">Sous-Catégorie 2.2</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.2.1</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.2.2</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.2.3</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.2.4</a></li>
     
                        </ul>
                      </li>
     
     
     
                      <li >
     
                        <a href="/collections/collectionX">Sous-Catégorie 2.3</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX-1">Sous-Sous-Catégorie 2.3.1</a></li>
     
                          <li ><a href="/products/produitOPD">Sous-Sous-Catégorie 2.3.2</a></li>
     
                          <li ><a href="/products/produitOPD">Sous-Sous-Catégorie 2.3.3</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.3.4</a></li>
     
                        </ul>
                      </li>
     
     
     
                      <li >
     
                        <a href="/collections/collectionX">Sous-Catégorie 2.4</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.4.1</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.4.2</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.4.3</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.4.4</a></li>
     
                        </ul>
                      </li>
     
     
                    </ul>
     
     
                  </li>
     
     
     
                  <li data-dropdown-rel="categorie-3" class="site-nav--has-dropdown" aria-haspopup="true">
     
                    <a  href="/collections/collectionX">Catégorie 3
                      <span class="icon-fallback-text">
                        <i class="fa fa-angle-down" aria-hidden="true"></i>
                      </span></a>
     
     
     
     
     
                  <ul class="site-nav--dropdown ">
     
     
                      <li >
     
                        <a href="/collections/collectionX">Sous-Catégorie 3.1</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.1.1</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.1.2</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.1.3</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.1.4</a></li>
     
                        </ul>
                      </li>
     
     
     
                      <li >
     
                        <a href="/collections/collectionX">Sous-Catégorie 3.2</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.2.1</a></li>
     
                          <li ><a href="/collections/collectZ">Sous-Sous-Catégorie 3.2.2</a></li>
     
                          <li ><a href="/products/produitOPD">Sous-Sous-Catégorie 3.2.3</a></li>
     
                          <li ><a href="/products/produitOPD">Sous-Sous-Catégorie 3.2.4</a></li>
     
                        </ul>
                      </li>
     
     
     
                      <li >
     
                        <a href="/collections/collectionX">Sous-Catégorie 3.3</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.3.1</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.3.2</a></li>
     
                          <li ><a href="/collections/collectionX-1">Sous-Sous-Catégorie 3.3.3</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.3.4</a></li>
     
                        </ul>
                      </li>
     
     
     
                      <li >
     
                        <a href="/collections/collectionX">Sous-Catégorie 3.4</a>
     
                        <ul class="site-nav--dropdown site-nav--submenu">
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.4.1</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.4.2</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.4.3</a></li>
     
                          <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.4.4</a></li>
     
                        </ul>
                      </li>
     
     
                    </ul>
     
     
                  </li>
     
     
                  <li class="customer-navlink large--hide"><a href="/account/login" id="customer_login_link">Connexion</a></li>
                  <li class="customer-navlink large--hide"><a href="/account/register" id="customer_register_link">Créer un compte</a></li>
     
     
                </ul>
          </textarea>
     
          <input type="button" OnClick="GenererMenu()" value="Lancer le split du code">
     
          <textarea name="codetraite">
              code traité...
          </textarea>
     
          <input type="button" OnClick="AfficheTabMenu()" value="Voir MENU">
        </div>
      </form>
     
     
      <nav id="Generated_Menu"> </nav>
      <script>
        function replaceAll(str, find, replace) {
          return str.replace(new RegExp(find, 'g'), replace);
        }
     
        // var TaBMenu = new Array();
     
        function GenererMenu() {
     
          var chaine = document.form.codeorigine.value;
     
          var newchaine = "";
     
          //effecue divers traitements de mise en forme du code avant traitement
          newchaine = chaine.replace(/\n|\r/g, ''); // remplace tous les sauts de ligne par vide
          newchaine = newchaine.replace(/   /g, ''); // enlève les tabulations '   '
          newchaine = newchaine.replace(/  /g, ''); // supprime tous les doubles espaces compris dans une chaine
          var reg = new RegExp("> <", "g");
          newchaine = newchaine.replace(reg, "><"); // supprime tous les 1 espaces compris entre fin et debut de balise > <
     
          var reg2 = new RegExp("><", "g");
          newchaine = newchaine.replace(reg2, ">\n<"); 
     
          var reg3 = new RegExp("<ahref=", "g");
          newchaine = newchaine.replace(reg3, "<a href="); 
     
           document.form.codetraite.value = newchaine;
        }
     
        function GenererMenu_spagetti() {  // 
          //récupère le code html du menu à parser
     
          var chaine = document.form.codeorigine.value;
     
          var newchaine = "";
     
          //effecue divers traitements de mise en forme du code avant traitement
          newchaine = chaine.replace(/\n|\r/g, ''); // remplace tous les sauts de ligne par vide
          newchaine = newchaine.replace(/   /g, ''); // enlève les tabulations '   '
          newchaine = newchaine.replace(/  /g, ''); // supprime tous les doubles espaces compris dans une chaine
          var reg = new RegExp("> <", "g");
          newchaine = newchaine.replace(reg, "><"); // supprime tous les 1 espaces compris entre fin et debut de balise > <
     
          x = 0;
          var GlobalMenu = "";
          //1/ Identifier les GRANDES CATEGORIES
          //alert("Entree dans split pour générer GrandesSections");
          var MorceauGrandesSections = newchaine.split('<span class="classmenu">');
          var GrandesSections = "";
          var SectionEnCours = "";
          
          var TaBMenu = new Array(10);
     
     
          for (var i = 0; i < MorceauGrandesSections.length - 1; i++) {
            var evalueeMorceauGrandesSections = MorceauGrandesSections[i];
            var PosSectionEnCours = MorceauGrandesSections[i].lastIndexOf(">");
            SectionEnCours = MorceauGrandesSections[i].substring(PosSectionEnCours + 1, MorceauGrandesSections[i].length);
            //alert("Section en cours (grande): " + SectionEnCours);
            GrandesSections = GrandesSections + i + " : " + SectionEnCours + "\n";
            GlobalMenu = GlobalMenu + "\n-GRANDE CATEGORIE =>" + SectionEnCours;
     
            // insertion dans tableau des grandes catégories
            TaBMenu[i] = new Array(10);
            TaBMenu.push(SectionEnCours);
     
            // pour chaque grande catégorie, récupérer les sous-catégories
            var MorceauMoyennesSections = evalueeMorceauGrandesSections.split('</a><ul class="tadam">');
            var SectionEnCoursM = "";
            for (var x = 0; x < MorceauMoyennesSections.length - 1; x++) {
              var evalueeMorceauMoyennesSections = MorceauGrandesSections[i];
              var PosSectionEnCours = MorceauMoyennesSections[x].lastIndexOf(">");
              SectionEnCoursM = MorceauMoyennesSections[x].substring(PosSectionEnCours + 1, MorceauMoyennesSections[x].length);
              GlobalMenu = GlobalMenu + "\n-MOYENNE CATEGORIE =>" + SectionEnCoursM;
     
              //pour chaque element du tableau grandes categories, lister les sous-catégories
              TaBMenu[i][x] = SectionEnCoursM;
     
              //reste ici à traiter 1 niveau de profondeur du menu....
              //############################
              //############################
     
            } //end for moyennes catégories
     
          } //end for grandes catégories
     
          //affecte la chaine traitee dans 2nd textarea pour verif visu
          document.form.codetraite.value = newchaine;
          chaine = newchaine;
          newchaine = "";
          // affiche arborescence GlobalMenu
          // alert("GlobalMenu vaut :\n" + GlobalMenu);
     
        }
     
        function AfficheTabMenu() {
     
        //   var TabMenuTxt = "";
     
        //   // récupère les éléments des tableaux pour afficher menu dans alert()
        //   for (var i = 0; i < TaBMenu.length; i++)                       // --> ReferenceError: TaBMenu is not defined
        //     for (var j = 0; j < TaBMenu[j].length; j++)
        //       TabMenuTxt = "Case " + i + "-" + j + " : " + TaBMenu[i][j] + "\n";
     
        //   alert(TabMenuTxt);
     
          document.getElementById('Generated_Menu').innerHTML = document.form.codetraite.value;
     
        }
      </script>
    </body>
    </html>

  8. #28
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 890
    Points : 3 729
    Points
    3 729
    Par défaut
    Tu préfères l'autre solution avec le parser ?
    C'est peut-être plus pratique : on auarit une page html avec une textarea et alors tu copies/collerais le code dans la textarea et alors tu obtiendrais les tableaux en cliquant sur un boutant ???

  9. #29
    Futur Membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Novembre 2018
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Novembre 2018
    Messages : 53
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Voici un début pour t'aider, tu peux tester ici : https://jsbin.com/qurozihazo/edit?html,css,js,output ...
    C'est superbe, merci beaucoup, voilà quelque chose de plus concret pour moi, bien moins lourd que de devoir apprendre puis gérer une API complète...
    Pas sûr de comprendre tous les traitements réalisés mais je vais étudier çà de plus près, même si pas mal de choses ne me parlent pas du tout du tout (par exemple ---> On a donc accès à toutes les méthodes du DOM, comme querySelectorAll()...), mais çà a l'air de faire le job...
    Après, je ne sais pas du tout comment intégrer ce code dans ma page pour traiter ma chaîne (ou mon doc, le concept est flou)....
    Je ne comprends même pas comment, depuis la structure de ton lien, tu as pu coller mon exemple de menu, le faire traiter, et y insérer un topo dédié!!!!!
    En soi je n'ai besoin que du texte, pas des liens...
    Sauf erreur il ne me manquerait pas grand-chose pour traiter le 3ème niveau avec "<ul class="site-nav--dropdown site-nav--submenu">"

    Ecoute, je vais essayer de voir çà de plus près et je reviens vers vous si j'ai du mal...

    Merci beaucoup, çà redonne un peu d'espoir :-)

  10. #30
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je jette un coup d'œil rapide sur le premier post seulement et, en particulier, la fonction concernant onClick="AfficheTabMenu()". Or, je vois ça (les lignes #97...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // récupère les éléments des tableaux pour afficher menu dans alert()
    for(var i=0; i<TaBMenu.length; i++)
       for(var j=0; j<TaBMenu[j].length; j++)
          TabMenuTxt = "Case "+ i + "-" + j +" : "+ TaBMenu[i][j] + "\n";
    Voyez le problème sur l'index dans la deuxième boucle ?

  11. #31
    Futur Membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Novembre 2018
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Novembre 2018
    Messages : 53
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Tu préfères l'autre solution avec le parser ?
    C'est peut-être plus pratique : on auarit une page html avec une textarea et alors tu copies/collerais le code dans la textarea et alors tu obtiendrais les tableaux en cliquant sur un boutant ???
    Ah oui, à priori cette proposition ressemble fortement au traitement que j'imaginais, en effet.

    Il faut déjà que je me pose et que j'étudie plus tranquillement ton 1er code (https://jsbin.com/qurozihazo/edit?html,css,js,output), parce que j'aimerai comprendre ce que j'utilise (déjà c'est compliqué, alors si je comprends pas un minimum ce que j'intègre je suis foutu...)
    ...et que je vois cette autre solution de parser que tu proposes, pour prendre celle avec laquelle je me sens le plus à l'aise.

    Un grand merci, je respire déjà mieux !

  12. #32
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 890
    Points : 3 729
    Points
    3 729
    Par défaut
    Voilà la même chose avec la deuxième solution plus pratique je pense : https://jsbin.com/jupuqaxada/edit?html,output

    Voici le code :

    Code HTML : 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
    <!DOCTYPE html>
    <html>
     
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <title>Parse et remplissage de tableaux dynamiques</title>
     
        <style>
            textarea {
                margin: 7px auto;
                border: 1px solid grey;
                padding: 3px;
                width: 700px;
                height: 320px;
                display: block;
            }
        </style>
    </head>
     
    <body>
     
        Ici c'est la solution avec le parser, copie/colle le code HTML du menu dans la zone de texte ci-dessous puis clique sur "Parse
        !" :
        <textarea id="menu"></textarea>
        <button onclick="parse()">Parse !</button>
        <p id="msg">...</p>
        <script>
            function parse() {
     
                var codeMenu = document.getElementById("menu").value;
                if (codeMenu === "") {
                    alert("la zone de texte est vide !")
                    return;
                }
                parser = new DOMParser();
                var docCodeMenu = parser.parseFromString(codeMenu, "text/html");
     
                // récupère tous les liens <a> correspondant aux catègories...
                var a_categories = docCodeMenu.querySelectorAll(".site-nav--has-dropdown > a");
                console.log("a_categories : ", a_categories);
     
                // récupère tous les liens <a> correspondant aux sous-catègories...
                // c'est plus difficile car les sous-sous-catégories sont imbriquées dans les sous-catègories
                // et parce que la class "site-nav--dropdown" leur est commune..
                var ul_sous_categories = docCodeMenu.querySelectorAll("[class='site-nav--dropdown ']"); // attention il y a un espace apès "site-nav--dropdown"...
                var a_sous_categories = []
     
                for (var i = 0, l1 = ul_sous_categories.length; i < l1; i++) {
                    a_sous_categories[i] = [];
                    for (var j = 0, l2 = ul_sous_categories[i].children.length; j < l2; j++) {
                        a_sous_categories[i][j] = ul_sous_categories[i].children[j].firstElementChild;
                    }
                }
                console.log("a_sous_categories : ", a_sous_categories);
     
                document.getElementById("msg").textContent = "regarde la console..."
     
            }
        </script>
    </body>
     
    </html>

  13. #33
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 890
    Points : 3 729
    Points
    3 729
    Par défaut
    si tu préfères juste récupérer les textes des liens alors voilà : https://jsbin.com/fukoqovaxi/edit?html,console,output

  14. #34
    Futur Membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Novembre 2018
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Novembre 2018
    Messages : 53
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Voilà la même chose avec la deuxième solution plus pratique je pense : https://jsbin.com/jupuqaxada/edit?html,output
    Franchement, je ne sais pas comment te remercier!
    Ce code me semble à priori plus pratique, plus accessible, et plus en adéquation avec le traitement que j'imaginais.

    Mais honnêtement je frôle le burn-out aujourd'hui, donc je n'arriverai à rien tellement j'ai la tête qui explose...

    Je vais essayer de passer une bonne nuit, et avoir l'esprit frais et dispo demain matin pour étudier plus précisément les 2 solutions, essayer de les comprendre et voir ce que je peux faire avec.

    Ca va vous paraître fou mais j'en profite pour préciser que je découvre tout juste 'la console' et son intérêt....

    Merci encore, je vous donne des nouvelles dès que possible promis.

  15. #35
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 890
    Points : 3 729
    Points
    3 729
    Par défaut
    Puisque toi tu veux ne récupérer que les textes alors regarde plutôt le lien de mon message précédent...

    Avec les textes on voit mieux les résultats dans la console...

    Eh oui la console c'est très utile ! Surtout celle du navigateur (touche F12).

  16. #36
    Invité
    Invité(e)
    Par défaut
    @Beginner.
    J'ai constaté un bug dans ton programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                for (var i = 0, l1 = ul_sous_categories.length; i < l1; i++) {
    Les index fonctionne ici, car on a des sous-menus dans TOUTES les catégories.
    Par contre, si on supprime le <ul> (et contenu) du menu "Catégorie 1" (par exemple), les index des sous-catégories ne correspondent plus à celui de leur parent.

    Ce qui sera particulièrement gênant pour la suite du projet, puisqu'on cherche à faire des liste liées.


    Voici ma version : https://codepen.io/jreaux62/pen/zMvqeB

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <textarea id="le-textarea"></textarea>
    <button type="button" id="le-button">Parser</button>
     
    <div>
      Catégories : <select id="select-lvl-0"></select> 
      Sous-Catégories : <select id="select-lvl-1"></select> 
      Sous-Sous-Catégories : <select id="select-lvl-2"></select> 
    </div>
    Code JavaScript : 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
    // --------------
    // variables globales
    var le_textarea = document.querySelector('#le-textarea');
    var le_button = document.querySelector('#le-button');
    // --------------
    // categories : objet contenant les catégories, sous-catégories et sous-sous-catégories
    var les_categories = [];
    // chaque ligne est de la forme : idx:{ txt:"Sous-Sous-Catégorie 1.3.1", lvl:2, par:11 }
    // idx : index de la ligne
    // txt : le texte (nom de la catégorie)
    // lvl : niveau de la catégorie (0:catégorie, 1:sous-catégorie ,2:sous-sous-catégorie)
    // par : index de la catégorie parente ('' si pas de parent)
    // --------------
    // les <select>
    var le_select_1 = document.querySelector('#select-lvl-0');
    var le_select_2 = document.querySelector('#select-lvl-1');
    var le_select_3 = document.querySelector('#select-lvl-2');
    // --------------
    // clic sur le bouton "Parser"
    le_button.addEventListener('click',function(){
      // --------
      // on récupère le code HTML
      var le_html = le_textarea.value.trim();
      if( le_html == '' )
        {
         alert('Le textarea est vide');
          return false;
        }
      // --------
      // on vide les <select>
      le_select_1.innerHTML = '';
      le_select_2.innerHTML = '';
      le_select_3.innerHTML = '';
      // --------
      // on parse le code HTML
      var parser = new DOMParser();
      var doc_html = parser.parseFromString(le_html, "text/html");
      // --------
      // on récupère les catégories, sous-catégories et sous-sous-catégories dans UN SEUL objet "les_categories"
      // SPECIAL : on NE prend PAS les 2 menus "Connexion" et "Créer un compte" (avec la classe "customer-navlink")
      var elts = doc_html.querySelectorAll('#accessibleNav > li:not(.customer-navlink)');
      les_categories = get_categories_by_level( [], elts, 0, '' );
     
      console.log( les_categories );
      // --------
      // on construit les options du 1er <select>
      var le_select_categorie_lvl_0 = '';
      le_select_categorie_lvl_0 = select_options_categorie_by_level_by_parent( les_categories, 0, '' );
    //  console.log( le_select_categorie_lvl_0 );
      le_select_1.innerHTML = le_select_categorie_lvl_0; // on remplit le 1er <select>
    });
    // --------------
    // fonction récursive de récupération des catégories
    function get_categories_by_level( arr=[], elts, lvl=0, par='' )
    {
      ii = arr.length;
      elts.forEach( function(elt){
        // si on a des noeuds
        if (elt.hasChildNodes()) 
        {
          // pour chaque noeud
          elt.childNodes.forEach( function(node){
            if (node.tagName && node.tagName.toLowerCase() == 'a')  // lien
            {
                arr[ii] = {'txt':node.textContent.trim(),'lvl':lvl,'par':par};
                ii = arr.length;
            }
            else if (node.tagName && node.tagName.toLowerCase() == 'ul')  // sous-menu ?
            {
              var arr2 = get_categories_by_level( arr, node.childNodes, lvl+1, ii-1 ); // récursivité
              // on regroupe les 2 :
              arr = json_concat( arr, arr2 );
            }
          });
        }
      });
      return arr;
    }
    // --------------
    // fonction de fusion de 2 objets en un seul
    function json_concat( o1, o2 )
    {
      for (var key in o2) {
        o1[key] = o2[key];
      }
      return o1;
    }
    // --------------
    // 1er <select> : on affiche les options dans le 2ème (sous-catégories)
    le_select_1.addEventListener('change',function(elt){
    //  console.log( this.value );
      if( this.value != '')
        {
          le_select_2.innerHTML = select_options_categorie_by_level_by_parent( les_categories, 1, this.value );
          le_select_3.innerHTML = '';
        } else {
          le_select_2.innerHTML = '';
          le_select_3.innerHTML = '';
        }
    });
    // --------------
    // 2ème <select> : on affiche les options dans le 3ème (sous-sous-catégories)
    le_select_2.addEventListener('change',function(elt){
    //  console.log( this.value );
      if( this.value != '')
        {
          le_select_3.innerHTML = select_options_categorie_by_level_by_parent( les_categories, 2, this.value );
        } else {
          le_select_3.innerHTML = '';
        }
    });
    // --------------
    // fonction de création des <option> par niveau et catégorie parente
    function select_options_categorie_by_level_by_parent( arr=[], lvl=0, par='' )
    {
      var options = [];
      var option = '<option value="">...</option>'; // option vide
      options.push( option );
      arr.forEach( function(elt,idx){
        if( elt.lvl == lvl && elt.par == par )
        {
     //     console.log( elt.txt,elt.lvl,elt.par,idx );
          var option = '<option value="'+idx+'">'+elt.txt+'</option>';
          options.push( option );
        }
      });
      return options.join("\n");
    }
    // --------------

    Code HTML, mis dans le <textarea> (pour test) :
    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
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    <ul class="site-nav nav-position-2" id="accessibleNav">
     
      <li data-dropdown-rel="categorie-1" class="site-nav--has-dropdown" aria-haspopup="true">
        <a  href="/collections/collectionX">Catégorie 1
          <span class="icon-fallback-text">
            <i class="fa fa-angle-down" aria-hidden="true"></i>
          </span></a>
     
        <ul class="site-nav--dropdown ">
     
          <li >
            <a href="/collections/collectZ">Sous-Catégorie 1.1</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.1.1</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.1.2</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.1.3</a></li>
              <li ><a href="/collections/collectionX-1">Sous-Sous-Catégorie 1.1.4</a></li>
            </ul>
          </li>
     
          <li >
            <a href="/collections/collectZ">Sous-Catégorie 1.2</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.2.1</a></li>
              <li ><a href="/products/produitSZ">Sous-Sous-Catégorie 1.2.2</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.2.3</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.2.4</a></li>
            </ul>
          </li>
     
          <li >
            <a href="/collections/collectZ">Sous-Catégorie 1.3</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.3.1</a></li>
              <li ><a href="/collections/collectZ">Sous-Sous-Catégorie 1.3.2</a></li>
              <li ><a href="/products/produitOPD">Sous-Sous-Catégorie 1.3.3</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.3.4</a></li>
            </ul>
          </li>
     
          <li >
            <a href="/products/produitOPD">Sous-Catégorie 1.4</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.4.1</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.4.2</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.4.3</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 1.4.4</a></li>
            </ul>
          </li>
     
        </ul>
     
      </li>
     
      <li data-dropdown-rel="categorie-2" class="site-nav--has-dropdown" aria-haspopup="true">
        <a  href="/collections/collectionX">Catégorie 2
          <span class="icon-fallback-text">
            <i class="fa fa-angle-down" aria-hidden="true"></i>
          </span></a>
     
     
        <ul class="site-nav--dropdown ">
     
          <li >
            <a href="/collections/collectionX">Sous-Catégorie 2.1</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.1.1</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.1.2</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.1.3</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.1.4</a></li>
            </ul>
          </li>
     
          <li >
            <a href="/collections/collectionX">Sous-Catégorie 2.2</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.2.1</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.2.2</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.2.3</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.2.4</a></li>
            </ul>
          </li>
     
          <li >
            <a href="/collections/collectionX">Sous-Catégorie 2.3</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX-1">Sous-Sous-Catégorie 2.3.1</a></li>
              <li ><a href="/products/produitOPD">Sous-Sous-Catégorie 2.3.2</a></li>
              <li ><a href="/products/produitOPD">Sous-Sous-Catégorie 2.3.3</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.3.4</a></li>
            </ul>
          </li>
     
          <li >
            <a href="/collections/collectionX">Sous-Catégorie 2.4</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.4.1</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.4.2</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.4.3</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 2.4.4</a></li>
            </ul>
          </li>
     
        </ul>
     
      </li>
     
      <li data-dropdown-rel="categorie-3" class="site-nav--has-dropdown" aria-haspopup="true">
        <a  href="/collections/collectionX">Catégorie 3
          <span class="icon-fallback-text">
            <i class="fa fa-angle-down" aria-hidden="true"></i>
          </span></a>
     
     
        <ul class="site-nav--dropdown ">
     
          <li >
            <a href="/collections/collectionX">Sous-Catégorie 3.1</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.1.1</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.1.2</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.1.3</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.1.4</a></li>
            </ul>
          </li>
     
          <li >
            <a href="/collections/collectionX">Sous-Catégorie 3.2</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.2.1</a></li>
              <li ><a href="/collections/collectZ">Sous-Sous-Catégorie 3.2.2</a></li>
              <li ><a href="/products/produitOPD">Sous-Sous-Catégorie 3.2.3</a></li>
              <li ><a href="/products/produitOPD">Sous-Sous-Catégorie 3.2.4</a></li>
            </ul>
          </li>
     
          <li >
            <a href="/collections/collectionX">Sous-Catégorie 3.3</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.3.1</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.3.2</a></li>
              <li ><a href="/collections/collectionX-1">Sous-Sous-Catégorie 3.3.3</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.3.4</a></li>
            </ul>
          </li>
     
          <li >
            <a href="/collections/collectionX">Sous-Catégorie 3.4</a>
            <ul class="site-nav--dropdown site-nav--submenu">
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.4.1</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.4.2</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.4.3</a></li>
              <li ><a href="/collections/collectionX">Sous-Sous-Catégorie 3.4.4</a></li>
            </ul>
          </li>
     
        </ul>
     
      </li>
     
      <li class="customer-navlink large--hide"><a href="/account/login" id="customer_login_link">Connexion</a></li>
      <li class="customer-navlink large--hide"><a href="/account/register" id="customer_register_link">Créer un compte</a></li>
     
      </ul>
    Dernière modification par Invité ; 06/11/2018 à 20h30.

  17. #37
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 890
    Points : 3 729
    Points
    3 729
    Par défaut
    Salut à tous,

    Ah bah je vois que tu as déjà fait la suite, joli code, très instructif ! +1 !

    J'en connais un qui va être content... La méthode que tu as utilisée me rappelle cet autre fil : Convertir des listes à la syntaxe particulière en HTML très instructif aussi...

    Sinon bah moi j'ai juste aidé pour les premières étapes et je m'étais demandé pourquoi passer par des tableaux puisque ce que l'on veut c'est construire automatiquement trois menus déroulants (liés) à partir du code HTML (une liste avec des <ul> et des <li>) correspondant au menu...

    Mais comme c'est ce que semblait vouloir l'auteur du fil :

    Citation Envoyé par claude.aignant Voir le message
    Je complète tout de même avec des éléments de réponse :

    => uniquement le nom des catégories, sous-catégories, sous-sous-catégories

    => j'imaginais un 1er tableau avec en indice 0 la 1ère grande catégorie, en 1 la seconde, en 2 la 3ème
    => puis un second tableau[0][0] avec la sous-catégorie 1.1, [0][1] avec la sous-catégorie 1.2, etc....
    => puis un 3ème tableau[0][0][0] avec la sous-catégorie 1.1, [0][1] avec la sous-catégorie 1.2, et [0][1] [1] avec la sous-sous-catégorie 1.2.2, etc etc...
    Et ce pour toutes mes catégories, sous-catégories, sous-sous catégories de mon menu.
    Un tableau à X dimensions me selbait pertinent pour tout çà. Voilà
    Alors voilà, c'est ce que j'ai commencé à faire...


    Citation Envoyé par jreaux62 Voir le message
    @Beginner.
    J'ai constaté un bug dans ton programme.
    Euh bah non c'est pas un bug ça ??? Mon code se base sur la structure fournie par l'auteur alors c'est sûr si tu modifies cette structure cela pourrait poser problème dans certains cas puisque mon code n'a pas pour but d'anticiper des modifications éventuelles...

    Mais ça c'est valable aussi pour d'autres codes, si tu modifies les données sur lesquelles ces codes se sont basés c'est clair qu'il est possible que tu les plantes mais ce ne serait pas un bug... Si tu changes les données tu changes le code c'est normal et si le code est censé s'adapter eh bien il faut le dire dés le départ et alors préciser les types de changement possibles...

    Par exemple on peut aussi planter ton code si on remplace les balises <a> par une autre ou autre changement de ce genre mais ce ne serait pas un bug de ton code...

    Citation Envoyé par jreaux62 Voir le message
    Par contre, si on supprime le <ul> (et contenu) du menu "Catégorie 1" (par exemple), les index des sous-catégories ne correspondent plus à celui de leur parent.
    Oui mais pourquoi ferait-on cela ? Et si effectivement dans le cahier des charges on te dit qu'il peut y avoir des catégories sans sous-catégories alors oui il faudra en tenir compte...

    Et d'ailleurs dans ce cas on pourrait ne pas supprimer ce <ul> mais juste son contenu et là le code fonctionnerait...

    En tous cas merci, c'est instructif tout ça...

  18. #38
    Invité
    Invité(e)
    Par défaut
    Mon code tient compte des cas de catégories sans sous-catégories.

    Comme du fait qu'il peut y avoir des sous-sous-sous-catégories, ou sous-sous-sous-sous-......-catégories.
    (sauf qu'on ne traite que les 3 premiers niveaux dans les <select>, ce qui est largement suffisant !)
    Dernière modification par Invité ; 07/11/2018 à 13h11.

  19. #39
    Futur Membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Novembre 2018
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Novembre 2018
    Messages : 53
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous,

    Déjà merci à tous les 2.
    La structure à parser est effectivement celle du menu html produit, et si le thème change sa façon de coder le menu, tout pète effectivement, mais je me sentais prêt à corriger le code si celà s'imposait, bien que ce soit à terme assez contraignant : pour pallier au changement de structure du menu généré ET 'affiché', j'aurai idéalement voulu récupérer la structure html de la page native de Shopify qui permet justement de générer et afficher depuis l'admin Shopify la ou les arborescences créées, car bien moins susceptible d'évoluer et non dépendante d'un thème ou autre, mais je ne suis pas parvenu à le déceler, même en ouvrant tous les .js auxquels fait référence le source de la page...
    La procédure imposait aussi de devoir se connecter à la boutique et rejoindre la section adhoc pour générer mon menu, dont avec une contrainte plus récurrente à l'usage.

    Et potentiellement oui, il pourrait y avoir des catégories sans sous-categories, ou une seule, ou 2 ou 3 ou 12 etc...

    Bref, le code de @jreaux62 est, clairement, diablement efficace et aboutit, mais aussi diablement plus compliqué pour moi ; je n'en saisi pas la moitié et suis très mal à l'aise de devoir l'intégrer sans le maîtriser.
    Et même bien commenté comme il est, je risque de manquer de temps pour tenter de le décortiquer et de connaissances pour en comprendre toutes les subtilités (mais ô combien de gagné car incapable de produire un tel code!!!).

    A l'inverse, la structure de code de @Beginner. me semblait plus accessible techniquement, et surtout me donnait une direction de travail concrète et d'utilisation de DOMParser, sans tout me mâcher non plus (enfin si pas mal déjà, j'en attendais pas tant mais tellement appréciable).

    Au début, je ne comprenais pas la problématique que relèvait @jreaux62 à @Beginner. au sujet de mon besoin de créer des listes liées, mais maintenant je (pense) la saisir : le code de @Beginner. lit et parse linéairement le html sans boucles imbriquées, celui de @jreaux62 bouclerait à chaque niveau de l'arborescence...

    Du coup, s'il n'y a pas d'autre façon de faire à partir d'un code (que je vais appeler plus phrasé, et à priori plus explicite pour moi) comparable à celui de @Beginner. , je pense ne pas avoir d'autre choix que d'essayer de comprendre le code de @jreaux62...

    Ne vous attendez pas à me voir tout de suite revenir (surtout que malheureusement je ne peux me mettre à fond sur mon projet qu'une semaine sur deux, d'où ma nécessité d'avancer concrètement très vite lorsque je peux m'y mettre, car le site aurait dû sortir il y a déjà 2 mois, j'ai commencé très tard pour diverses raisons, et là je bloquais déjà au tout début sur des traitements bidons ce qui était très démoralisant...) car j'appréhende un peu cette prise en main du code, mais je vous tiendrai assurément au courant.

    Encore un grand merci à vous car, même si je n'ai toujours pas compris POURQUOI mon tableau était mal déclaré dans mon 1er code et ce qui ne fonctionnait ps concrètement dans ma boucle de parse et ce que j'en ressortais (j'aurai bien aimé savoir avant de passer à une autre solution), j'ai déjà une solution qui semble aussi fonctionnelle que compliquée à saisir.
    Bref, je vais regarder tout çà de plus près.

  20. #40
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- Tout d'abord, je tiens à dire que c'est la PREMIERE FOIS que j'utilise DOMparser.
    Je suis, de ce point de vue, un débutant.

    J'ai donc fait ce que tout "bon débutant" doit faire : des recherches sur le web. "javascript parser code html"

    Certaines pages m'ont beaucoup aidé :

    Mais c'est bien beau de parser.
    Encore faut-il savoir quoi en faire après. D'où nouvelle recherche : "javascript parcourir le DOM"

    Bref, je te l'accorde : ça demande des efforts.
    Et, j'avoue, un peu d'expérience pour savoir quels mots-clés utiliser pour la recherche.


    2- Maintenant, pour les explications de mon code.
    AVANT de faire une recherche ou de CODER, il faut RÉFLÉCHIR.

    Puis, on avance ETAPE par ETAPE.
    • il faut garder à l'esprit la problématique générale, et l'objectif
    • mais il faut régler UN PROBLEME A LA FOIS.

    Le code n'est pas "sorti" tout seul : il m'a fallu m'y reprendre à plusieurs fois avant d'arriver au résultat final.


    2a- D'abord, il fallait parser le code HTML.
    La structure à parser, simplifiée à son maximum, s'écrit :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <ul id="accessibleNav">
       <li>
          <a>nom catégorie</a>
          <ul>...(sous-catégories)...</ul>
       </li>
    </ul>
    Pour chaque niveau, on doit donc chercher :
    • la balise <a>
    • la balise <ul>

    le contenu de cette balise <ul> est très similaire à la structure ci-dessus.
    D'où l'idée de créer une fonction récursive (= qui s'appelle elle-même) : get_categories_by_level().


    2b- Ensuite, il fallait mettre les résultats dans une variable exploitable (un ou plusieurs array ? un objet ? comment le structurer ?)
    Là, c'est l'expérience qui parle.
    J'ai choisi UNE SEULE variable les_categories, construite de la même manière qu'une table de base de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // --------------
    // categories : objet contenant les catégories, sous-catégories et sous-sous-catégories
    var les_categories = [];
    // chaque ligne est de la forme : idx:{ txt:"Sous-Sous-Catégorie 1.3.1", lvl:2, par:11 }
    // idx : index de la ligne
    // txt : le texte (nom de la catégorie)
    // lvl : niveau de la catégorie (0:catégorie, 1:sous-catégorie ,2:sous-sous-catégorie)
    // par : index de la catégorie parente ('' si pas de parent)
    Si on regarde dans la console (https://codepen.io/jreaux62/pen/zMvqeB, après avoir cliqué sur "Parser"), on voit la structure des données (cliquer sur la flèche pour "déplier" l'array si nécessaire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    0: { txt: "Catégorie 1", lvl: 0, par: "" }
    1: { txt: "Sous-Catégorie 1.1", lvl: 1, par: 0 }
    2: { txt: "Sous-Sous-Catégorie 1.1.1", lvl: 2, par: 1 }
    3: { txt: "Sous-Sous-Catégorie 1.1.2", lvl: 2, par: 1 }
    4: { txt: "Sous-Sous-Catégorie 1.1.3", lvl: 2, par: 1 }
    5: { txt: "Sous-Sous-Catégorie 1.1.4", lvl: 2, par: 1 }
    6: { txt: "Sous-Catégorie 1.2", lvl: 1, par: 0 }
    7: { txt: "Sous-Sous-Catégorie 1.2.1", lvl: 2, par: 6 }
    8: { txt: "Sous-Sous-Catégorie 1.2.2", lvl: 2, par: 6 }
    ...
    A SAVOIR : en JavaScript, l'index d'un array commence à 0 (zéro).
    • Ce qui explique que pour les catégories de 1er niveau (= sans catégorie parente) j'ai mis par: "" : "Catégorie 1", "Catégorie 2", "Catégorie 3".
    • { txt: "Sous-Catégorie 1.1", lvl: 1, par: 0 } : "par: 0" signifie que la catégorie parente est "Catégorie 1" (index 0)
    • { txt: "Sous-Sous-Catégorie 1.1.2", lvl: 2, par: 1 } : "par: 1" signifie que la catégorie parente est "Sous-Catégorie 1.1" (index 1)
    • ...



    2c- Enfin, il fallait créer les <select>, et les remplir avec les <option> idoines.
    C'est le rôle de la fonction select_options_categorie_by_level_by_parent().
    "lvl" correspond au "niveau" de catégorie.
    • lvl: 0 : catégorie
    • lvl: 1 : sous-catégorie
    • lvl: 2 : sous-sous-catégorie
    • ... (le code peut gérer autant de niveau que nécessaire. 3 étant largement suffisant !)

    Pour lier les listes, on fait toujours appel à cette fonction, en lui indiquant l'index du parent.

    CQFD.


    3- ETAPE SUIVANTE :

    Citation Envoyé par jreaux62 Voir le message
    Et qu'est-ce que c'est que ces boutons "Ajouter une catégorie", "Ajouter une sous-catégorie",... ??
    J'en ai tenu compte.

    La structure de ma variable les_categories permet d'ajouter facilement des catégories, sous-catégories, sous-sous-catégories !
    Il suffit d'en connaitre le niveau ('lvl') et le parent ('par') :
    ex. :
    • { txt: "nouvelle Sous-Catégorie pour la catégorie 1", lvl: 1, par: 0 },
    • { txt: "nouvelle Sous-Sous-Catégorie pour la Sous-catégorie 1.1", lvl: 2, par: 1 },

    Pour "ajouter" à la variable les_categories, on utilisera .push().[*]{ txt: "Sous-Catégorie 1.1", lvl: 1, par: 0 } : "par: 0" signifie que la catégorie parente est "Catégorie 1" (index 0)


    Mais ça, c'est une autre histoire.....



    @Beginner.
    Concernant TON code :
    J'ai constaté un bug dans ton programme.
    1- Si, il s'agit bien d'un bug "conceptuel".
    • Si tu pars du principe que "toutes les catégories DOIVENT avoir des sous-catégories", alors tu ajoutes une contrainte supplémentaire, et donc restrictive.
    • Or, il faut partir du principe que "des catégories peuvent NE PAS avoir de sous-catégories", qui est le cas le plus général (en théorie comme en pratique).

    Citation Envoyé par Beginner. Voir le message
    ...Et si effectivement dans le cahier des charges on te dit qu'il peut y avoir des catégories sans sous-catégories alors oui il faudra en tenir compte...
    • il n'y a aucun "cahier des charges"... et donc il n'est écrit nulle part que les catégories DOIVENT avoir des sous-catégories.

    J'ai repris ton code ici : https://codepen.io/jreaux62/pen/GwpbPL
    En masquant les sous-catégories de la catégorie 1, on constate alors que les index de a_sous_categories sont décalés (ils devraient commencer à 1, qui est la "catégorie 2").

    2- D'autre part, tu ne traites pas les sous-sous-catégories... ce qui limite encore la portée de ton code.

    3- Tu t'es compliqué la vie en voulant récupérer des "classes".
    Le <ul> prinicipal a un id : "accessibleNav".
    A partir de là, il est simple d'appeler les bons niveaux (comme en CSS) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var a_categories = docCodeMenu.querySelectorAll("#accessibleNav > li > a");
    var a_sous_categories = docCodeMenu.querySelectorAll("#accessibleNav > li > ul > li > a");
    var a_sous_sous_categories = docCodeMenu.querySelectorAll("#accessibleNav > li > ul > li > ul > li > a");
    (mais ça ne règle pas le problème des mauvais index...)
    Dernière modification par ProgElecT ; 07/11/2018 à 14h09.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 8 PremièrePremière 123456 ... DernièreDernière

Discussions similaires

  1. Tableaux dynamiques
    Par sebduth dans le forum Fortran
    Réponses: 5
    Dernier message: 05/07/2005, 15h36
  2. tableaux dynamiques
    Par Mynautor dans le forum C++
    Réponses: 23
    Dernier message: 12/02/2005, 02h45
  3. [D7] Tableaux dynamiques dans un record
    Par bobby-b dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2004, 23h23
  4. Article sur les tableaux dynamiques
    Par Eric Sigoillot dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2004, 22h00
  5. [Kylix] Tableaux dynamiques sour Kylix2
    Par Krän dans le forum EDI
    Réponses: 6
    Dernier message: 07/10/2003, 14h31

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