Bonjour à tous,

Je viens vers vous pour vous demander de l'aide sur la mise en forme d'un foreach.

En effet, j'aimerais afficher une liste comme suit:

<div id="accordeon">
        <div class="card">
      <div class="card-body">
        <h4 class="card-title">Liste pricipale</h4>
      </div>
      <div class="card-header">
        <a href="#item1" class="card-link" data-toggle="collapse" data-parent="#accordeon"><?= $v['shelf_name'] ?></a>
      </div>
      <div class="collapse" id="item1">
        <div class="card-body"> <!-- Ici on doit pouvoir afficher autant de input et label qu'on a d'article ID  dans la BDD -->
          <input type="checkbox" class="form-check-input" value="<?= $v['article_id'] ?>">
          <label class="form-check-label" for="defaultCheck1"><?= $v['article_name'] ?></label>
          <input type="checkbox" class="form-check-input" value="2"> <!-- Par exemple -->
          <label class="form-check-label" for="defaultCheck1">Lait</label>
          <input type="checkbox" class="form-check-input" value="3">
          <label class="form-check-label" for="defaultCheck1">Crème fraiche</label> <!-- Fin exemple -->
        </div>
      </div>
      <!-- On répéte fois X le nombre de shelf_name contenu dans la BDD -->
      <div class="card-header">
        <a href="#item1" class="card-link" data-toggle="collapse" data-parent="#accordeon"><?= $v['shelf_name'] ?></a>
      </div>
      <div class="collapse" id="item1">
        <div class="card-body">
          <input type="checkbox" class="form-check-input" value="<?= $v['article_id'] ?>">
          <label class="form-check-label" for="defaultCheck1"><?= $v['article_name'] ?></label>
          <input type="checkbox" class="form-check-input" value="<?= $v['article_id'] ?>">
          <label class="form-check-label" for="defaultCheck1"><?= $v['article_name'] ?></label>
        </div>
      </div>
        </div>
  </div>

J'avais fait un forum à une époque antérieure, mais je vous avoue que j'ai oublié comment procéder à la mise en forme.

Voici ma requête qui est dans une fonction (prévue pour un jour être dans une classe, mais j'y suis pas encore Oo), et la façon dont j'appel et je génère le foreach.

Récupération des articles

function recuperer_articles()
{
  global $cnx;
  $articles = array();
  $query = $cnx->prepare('
  SELECT 
    t_shelf.shelf_id,
    t_shelf.shelf_name,
    t_article.article_id,
    t_article.article_name,
    t_article.shelf_id
  FROM t_shelf
  INNER JOIN t_article
    ON t_shelf.shelf_id = t_article.shelf_id
  ORDER BY t_shelf.shelf_name ASC, t_article.article_name ASC');
  try {
    $query->execute()
    or die ('<div id="alert" class="alert alert-error">
        Une erreur est survenue, merci de contacter un administrateur ou le webmaster!
      </div>');
    while ($data = $query->fetch(PDO::FETCH_ASSOC)) 
    {
      $articles[] = $data;
    }
  }
  catch(PDOException $e){
    echo '<div id="alert" class="alert alert-error">
        Erreur : La requête à un problème, merci de contacter un administrateur ou le webmaster!
      </div>';
    exit;
  }
  return $articles;
  $query->CloseCursor();
}

Le Foreach

<?php
    $articles = recuperer_articles();
  $rayon = '';
  foreach($articles as $v)
  {
    if($rayon!=$v['shelf_name']){
      echo  <<<HTML
      <h5 class="text-primary">{$v['shelf_name']}</h5>
HTML;
      $rayon=$v['shelf_name'];
    }
    echo <<<HTML
    <div class="form-check">
      <input type="checkbox" class="form-check-input" value="{$v['article_id']}">
      <label class="form-check-label" for="defaultCheck1">{$v['article_name']}</label>
    </div>
HTML;
  }
?>

Voilà, en espérant que vous pourrez m'aider.

D'ici là, bon courage à tous pour le taff et autre ;-)

Au plaisir et merci à vous.

Cordialement.

5 réponses


Fre3z69
Auteur
Réponse acceptée

Salut,

J'ai bien lu, je posais la question comme ça, juste pour info.

Mais j'ai retrouvé un vieux script sur un forum, que j'avais fait, j'ai donc réadapté et donc, mon soucis est résolut.

Merci pour l'aide, j'aurais au moins corriger quelques trucs ;-)

Au plaisir et encore merci.

Bonjour.
Tu as déja un problème dans la fonction, la méthode closeCursor, tu dois y faire appel avant de faire un return à ta fonction, sinon la méthode ne sera jamais exécutée.
Ensuite, Je ne vois pas l'intérêt de faire boucler les résultats dans ta fonction avec la méthode fetch, si c'est pour y reboucler dessus en dehors de la fonction.
Donc pour résumer, dans ta fonction :

function recuperer_articles()
{
    global $cnx;
    $articles = [];
    $query = $cnx->prepare('
        SELECT 
            t_shelf.shelf_id,
            t_shelf.shelf_name,
            t_article.article_id,
            t_article.article_name,
            t_article.shelf_id 
        FROM t_shelf 
        INNER JOIN t_article 
        ON t_shelf.shelf_id = t_article.shelf_id 
        ORDER BY t_shelf.shelf_name ASC, t_article.article_name ASC');
    try {
        $query->execute();
        $articles = $query->fetchAll();
    } catch(PDOException $e) {
        // ...
    }
    $query->closeCursor();
    return $articles;
}

Puis ta boucle foreach tu l'a fait normalement :

$articles = recuperer_articles();
if ($articles):
    $rayon = '';
    foreach ($articles as $v): ?>
        // Code HTML/PHP
    <?php endforeach;
else:
    // Ce que tu veux afficher dans le cas où il n'y a pas de résultat
endif;

Au passage, la condition que tu met dans la boucle foreach est incorrecte si tu y réfléchis bien.

Fre3z69
Auteur

Salut.

Oui je vois mieux pour le bouclage dans la condition.

Pour la condition dans le foreach c'est pour n'afficher qu'une seule fois le nom du rayon shelf_name. Mais je penses de toute façon que c'est vouer à changer au vu du résultat que je souhaite.

En tout cas merci à toi.

Cordialement.

Fre3z69
Auteur

Bonjour.

après avoir chercher sur le net j'ai trouvé ceci:
array_key_last
et
end()

Puis je utiliser ceci dans un foreach et sinon comment arriver à déterminer le dernier élément de la boucle ?

je vous remercie.

Cordialement

Si tu as bien lu la documentation pour les deux fonctions, elles différent, la première array_key_last retourne la clé (comme son nom l'indique) de la dernière entrée du tableau alors que end retourne la valeur de la dernière entrée du tableau.
Par contre je ne comprends pas pourquoi tu veux utiliser l'une ou l'autre au sein même de la boucle.