bonjour,

je suis en train de créer un annuaire en MVC mais je bloque sur une fonction, la récuépration des sous catégories:

donc j'ai mon controleur avec cette fonction:

<?php
require ('model/frontend.php');

function links() {
    $cats = getCats();
    require ('view/frontend/annu/links.php');
}

dans model/frontend.php
j'ai ceci:

function getCats() {
    $db = dbConnect();
    $req = $db->query('SELECT id,name FROM annu_cat WHERE root=0 GROUP BY name ASC');

    return $req;

}

ensuite j'ai ma vue qui m'affiche les catégories:

<?php
$i=0;
while ($data = $cats->fetch()) {

    if ($i%2 == 0) {
        echo '
        <div class="col-sm-offset-1 col-sm-5">
        ';
        $i++;
    }
    else {
        echo '
        <div class="col-sm-5">
        ';
        $i++;

    }

    echo '
    <p>
            <img src="/public/images/folder.gif">&nbsp;
            <a href="">'.$data['name'].'</a><br>
            ici les sous catégories
    </p>
    </div>
    ';

}
?>

et c'est là que je bloque je vois pas comment apeller une fonction qui me permettras de récupérer les sous catégories en fonction de la catégorie principale

10 réponses


Salut,

Comment sont foutues tes table ? (ou ta table)

@plus

Pierre

alors j'ai 3 colonnes (id, name et root)

root est à 0 pour les catégories principale sinon root correspond l'id de la catégories principale

dis moi si j'ai mal expliqué ou si un truc n'est pas clair.

salut

    // ici les sous catégories
    $sqlsouscat = "SELECT id,name FROM annu_cat WHERE id = {$data['root']}";

@plus

Pierre

arf la tu me propose de faire une requète sql dans la vue ce que justement je ne veux pas.
c'est pour cela que je bloque

j'avais aussi pensé faire une une fonction afficheCat mais là ça reviendrais à mettre de l'affichage dans une fonction ce qui me plais pas trop non plus...

Oui, mais tel que tu as commencé :
SELECT id,name FROM annu_cat WHERE root=0
puisque tu ne lis que les cats principales, tu es bien obligé à un moment de lire les sous cats :D

@plus

Pierre

s'il faut modifier ça me dérange pas de le faire tant que je respecte les normes c'est surtout ça que je souhaite
même s'il faut aller jusqu'as modifier la base de donnée.

Tu peux dans ton controller récupérer les sous catégories avec la requête donnée par @Pierrot01.

function getCats() {
    $db = dbConnect();
    $req = $db->query('SELECT id,name FROM annu_cat WHERE root=0 GROUP BY name ASC');
    $categories = [];

    foreach ($req->fetch() as $cat) {
            $cat['subcat'] = $sqlsouscat;
            $categories[] = $cat;
    }

    return $categories;
}

Bonjour.
Tu pourrais faire quelque chose comme :

function links() {
    $cats = getCats();
    $cats = getChildrens($cats->fetchAll());
    require ('view/frontend/annu/links.php');
}

Puis dans la fonction getChildrens:

function getChildrens($parents) {
    $db = dbConnect();
    $childrens = $db->prepare('SELECT id, name FROM categories WHERE root = :category_id ORDER BY name = ASC');
    $categories = [];
    foreach ($parents as $parent):
        $category = $parent;
        $childrens->execute(['category_id' => $parent['id']]);
        if ($childrens->rowCount()):
            $category['childrens'] = $childrens->fetchAll();
        endif;
        array_push($categories, $category);
    endforeach;
    return $categories;
}

De cette manière tu récupéres dans ta fonction links un tableau incluant les categories parentes, dont chacunes d'elles inclues ses catégories enfants.
Ce qui donnes quelque chose comme ceci.

la ça me donne ce genre de tableau:

 0 => 
    array (size=6)
      'id' => string '134' (length=3)
      0 => string '134' (length=3)
      'name' => string 'Aéroports' (length=12)
      1 => string 'Aéroports' (length=12)
      'root' => string '15' (length=2)
      2 => string '15' (length=2)
  1 => 
    array (size=6)
      'id' => string '59' (length=2)
      0 => string '59' (length=2)
      'name' => string 'Achats' (length=6)
      1 => string 'Achats' (length=6)
      'root' => string '5' (length=1)
      2 => string '5' (length=1)
  2 => 
    array (size=6)
      'id' => string '103' (length=3)
      0 => string '103' (length=3)
      'name' => string 'Achats malins' (length=13)
      1 => string 'Achats malins' (length=13)
      'root' => string '12' (length=2)
      2 => string '12' (length=2)
  3 => 
    array (size=6)
      'id' => string '17' (length=2)
      0 => string '17' (length=2)
      'name' => string 'Actualité internationale' (length=27)
      1 => string 'Actualité internationale' (length=27)
      'root' => string '1' (length=1)
      2 => string '1' (length=1)

par contre je ne différencie pas les catégories des sous catégories

Pourquoi ne pas faire une requête qui ramènes les catégories et les sous-catégories avec une jointure ?
Dans la vue tu aurais juste à gérer les ruptures de catégories à chaque fetch