web-dev-qa-db-fra.com

Essayer de compter le nombre d'articles dans une catégorie mais donner un nombre incorrect

J'essaie d'utiliser certains PHP que j'ai trouvés ici pour compter tous les articles d'une catégorie spécifique (10), le PHP fonctionne mais ne montre que 20 articles, quand un décompte manuel en indique 28.

$model = JModelLegacy::getInstance('Articles', 'ContentModel');

$model->setState('filter.category_id', 10); // Set category ID here

$articles = $model->getItems();

$num_articles = count($articles);

Une idée de ce que je fais mal?

3
AndrewF

Si vous appelez la méthode getItems, la méthode populateState est appelée, ce qui écrase la méthode list.limit.

populateState La méthode a un commentaire.

Cette méthode ne doit être appelée qu'une fois par instanciation et est conçue pour être appelée lors du premier appel de la méthode getState (), sauf si le drapeau de configuration du modèle pour ignorer la demande est défini.

Donc, pour refuser d'appeler populateState automatiquement, ajoutez simplement ignore_request à $config tableau (troisième variable dans JModelLegacy::getInstance).

$model = JModelLegacy::getInstance('Articles', 'ContentModel', array( 'ignore_request' => true )); // add ignore_request

$params = JFactory::getApplication()->getParams();
$model->setState('params', $params); // Set params to avoid Fatal error

$model->setState('filter.category_id', 10); // Set category ID here
$model->setState('list.limit', 0); // Remove limit

$articles     = $model->getItems();

// getTotal result is already cached, just retrieve it
$num_articles = $model->getTotal();

MISE À JOUR

Si vous avez seulement besoin de compter les articles, vous pouvez et devriez utiliser JModelList méthode getTotal, qui est un moyen plus rapide d’obtenir le nombre de résultats.

$model = JModelLegacy::getInstance('Articles', 'ContentModel', array( 'ignore_request' => true )); // add ignore_request

$params = JFactory::getApplication()->getParams();
$model->setState('params', $params); // Set params to avoid Fatal error

$model->setState('filter.category_id', 10); // Set category ID here

// getTotal clears limit and offset, so setting list.limit to 0 is not needed
$num_articles = $model->getTotal();
3
Rene Korss

Essayer

...
$model->setState('filter.category_id', 10); // Set category ID here
$model->setState('list.limit', 0);
...

en combinaison avec ignore_request _ (voir réponse de René Korss )

J'ai trouvé une autre solution pour définir la liste.limit du modèle sans ajouter ignore_request à votre modèle. Ajoutez ces lignes avant d'appeler getItems:

    $app = JFactory::getApplication();
    $app->input->set('list', array('limit' => 0));

Sinon, la limite par défaut est appliquée à getItems (qui est 20).

3
fruppel