J'ai un plugin qui doit prétraiter la description d'une catégorie en fonction de ses paramètres avant d'afficher toutes les sous-catégories qu'elle contient.
Pour les articles (context = com_content.article
), le plugin onContentPrepare
événement passe $article
et $params
donnant tout ce dont on aurait besoin, mais quand le contexte est com_content.category
, $params
est vide et $article
a seulement $article->text
.
Je sais que la catégorie d'intérêt se trouve dans la chaîne de requête, mais existe-t-il un meilleur moyen de trouver des informations sur la catégorie, etc. déjà récupérées?
Avec index.php?option=com_content&view=category&id=123&Itemid=456
public function onContentPrepare($context, &$article, &$params, $page=0)
if($context == 'com_content.category') {
// $article has only article ->text
// $params is empty
// how can I get category params here?
}
Comme @codinghands l'a souligné, la catégorie n'est pas techniquement satisfaisante, de sorte que (par sa conception) toutes les informations d'intérêt ne sont pas disponibles, ne laissant que le titre de la catégorie généralement disponible pour modification.
L’autre "attrapé" lorsqu’il énumère toutes les sous-catégories et articles de la catégorie est que l’événement du plug-in est déclenché pour tous , donc si vous en avez plus que quelques catégories et/ou articles, le code du plugin va tirer beaucoup , à moins qu’il ne soit prévu de ne tirer qu’une fois.
Pour obtenir les paramètres de seule la catégorie principale étant affichée, mon hypothèse est que la première fois que le plugin est activé, il est pour la catégorie principale. (Cela a été prouvé vrai dans mon cas, mais je ne peux pas être sûr que d'autres paramètres pourraient changer cela).
index.php? option = com_content & view = categorie & id = 123
static $isMainCat = true;
if($isMainCat){
$catid = JFactory::getApplication()->input->getInt('id');
$basePath = JPATH_ADMINISTRATOR . '/components/com_categories';
require_once $basePath . '/models/category.php';
$category = new CategoriesModelCategory(array('table_path' => $basePath . '/tables'));
$item = $category->getItem($catid);
$params = new JRegistry;
$params->loadString($item->params);
$image = $params->get('image','noimage.gif');
$isMainCat = false; // Prevent this code from running on any but the first category
}
En regardant view.html.php
pour com_content.category
, L'appel de déclenchement est le suivant:
$dispatcher->trigger('onContentPrepare', array ('com_content.category', &$item, &$item->params, 0));
qui envoie les paramètres $item
(article). Pas bien.
En regardant la ligne 72 du même fichier (parent::commonCategoryDisplay();
), qui est elle-même dans JCategoryView
( code ici ), le $params
sont stockés (dans view.html.php
, $this->params
), mais en tant que catégorie non techniquement contenu, l'événement contentPrepare n'est pas déclenché à ce stade.
Vous pouvez remplacer ce view.html.php
Pour déclencher l'événement. Voir ce guide - mais cela nécessite un plugin spécial.