Bonjour !

J'ai un problème qui m'emmerde, clairement faut le dire comme c'est.

J'ai en place le même (exactement le même) système que Graf, dans son tuto MVC (formation POO PHP).

Suite à son tuto, je fais ma page catégorie (dans la View public et non dans l'admin).

Je veux alors récupérer le nombre d'articles par catégorie.

J'ai ainsi dans mon model cette requête :

public function countByCat($categorie) {
return $this->query("SELECT COUNT(*) FROM {$this->table} WHERE categorie = ?", [$categorie]);
}

Dans ma view, je voudrai la récupérer comme ça :

<div class="compteur">
       <span class="pull-left lbl">Nombre d'articles: 
              <?php $articles->countByCat($categorie->titre); ?>
       </span>
</div>

Pour le moment, mon controller a cette gueule :

namespace App\Controller;

class CategoriesController extends AppController {

    public function __construct(){
        parent::__construct();
        $this->loadModel('Categories');

    }

    public function index()
    {
        $categories = $this->Categories->all();
        $this->render('categories.index', compact('categories'));
    }

}

J'ai essayer plein de truc, la seule chose qui à marché, c'est remplacer

<?php $articles->countByCat($categorie->titre); ?>

par :

<?php
App::getInstance()->getTable("Articles")->countByCat($categorie->titre);
?>

Mais là, 0 utilisation du controller.

J'ai également essayer de passer la fonction dans le controller, mais comme je récupère le titre de la catégorie dans le foreach qui se trouve dans la view, je suis bloqué au niveau de l'argument à passer dans la fonction.. :/

(Il est possible, je sais pu, que j'ai été obligé également de faire un foreach pour récupérer la résultat du compteur, sinon ils me disaient un truc comme array to string conversion je sais pas quoi)

Bref, c'est la merdouille

Merci ! Je répond à vos questions si besoins

4 réponses


Genki
Auteur
Réponse acceptée

Ok donc j'ai réussi, voilà comment ça se présente :

Model --

public function countByCat($categorie)
    {
        return $this->query("SELECT COUNT(*) AS 'NB' FROM {$this->table} WHERE categorie = ?", [$categorie], true);
        // Le AS 'NB' est ce qui m'a permit de tout débloquer
    }

Controller--

<?php

namespace App\Controller;

class CategoriesController extends AppController
{

    public function __construct()
    {
        parent::__construct();
        $this->loadModel('Categories');
        $this->loadModel('Articles');

    }

    public function index()
    {

        /**
         * On récupère tous les enregistrements de catégories
         */
        $categories = $this->Categories->all();

        /**
         * On liste les catégories
         * Puis on récupère le nombre d'articles en fonction du nom de la catégorie
         */
        foreach ($categories as $categorie) {
            $nb_articles = $this->Articles->countByCat($categorie->titre);
            $articles[$categorie->titre] = $nb_articles->NB; // On récupère ainsi la clé NB qui contient notre chiffre
        }

        /**
         * On envoit tout à la vue
         */
        $this->render('categories.index', compact('categories', 'articles'));
    }

}

Et la vue--

<span class="pull-left lbl">Nombre d'articles: <?= $articles[$categorie->titre]; ?></span>

t'as pas oublié un echo par hazard ?

<?php echo($articles->countByCat($categorie->titre)); ?>

ou bien comme ça

<?= $articles->countByCat($categorie->titre); ?>

Salut,

Alors déjà @Huggy +1000 !
Ensuite, pourquoi faire une fonction alors que tu peux récupérer le nombre d'articles par catégorie directement en MySQL ? Il suffit de modifier la requête qui récupère la liste des catégories et le tour est joué ;)

Genki
Auteur

Erreur d'écris de ma part Huggy, j'ai réécris le code sur le forum, j'ai pas copié collé
Mais dans mon code j'utilise les short-tag <?= ?>

Donc l'écho y est bien.

@Cyprien : Explique un peu en détail stp ?
Dans ma table catégorie, j'ai rien qui relis aux articles. {ID ; Titre ; Description ; Date_creation}

Du coup je suis obliger de faire un select count(*) de la table articles où le nom de la catégorie = celui que j'appelle dans le foreach pour lister les catégories.