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?
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();
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).