Bon, c'est parti.
Résumé des épisodes précédents :
On dispose d'un certain nombre d'items rangés dans une catégorie. On veut faire un template pour une page qui contiendra à la fois la liste des items, et l'item sélectionné (avec une selection au hasard pour la première fois).
Exemple concret :
www.atelierdevisu.fr/index.php?option=co...ory&cid=12&Itemid=26
La catégorie c'est "expositions passées", les items sont une fiche expo.
La solution proposée n'est pas forcément la meilleure, et il est possible que dans certain cas ca fasse des choses abominables (par exemple si vous utilisez le type 'minigallery'), il est donc recommandé d'avoir un minimum de connaissances et de compréhension avant de vous lancer la dedans.
Ensuite, le principe est assez simple. On appelle toujours la view category en rajoutant un identifiant pour l'item dans l'adresse.
Concrètement, voici comment se passe la selection de l'id de l'article :
Code:
if(!empty($_GET['iid'])){
$id = JRequest::getVar('iid','-1','get','int');
}else{
$keys = array_keys($this->items);
$rnd = mt_rand(0,count($keys)-1);
$id = $this->items[$keys[$rnd]]->id;
}
Ensuite on affiche l'item comme ca :
Code:
require_once(JPATH_COMPONENT.DS.'views'.DS.'items'.DS.'view.html.php');
require_once(JPATH_COMPONENT.DS.'models'.DS.'items.php');
$mi = new FlexicontentModelItems();
$mi->setId($id);
$vi = new FlexicontentViewItems();
$vi->setModel($mi,true);
$vi->display();
Ce morceau de code va appeller le template de l'item en question.
ensuite un simple :
Code:
echo $this->loadTemplate('items');
pour afficher la liste.
Dans category_items.php, il faut penser à mettre à jour les lien avec l'identifiant de l'item.
Il faut donc construire le lien ainsi :
Code:
<a '.$active.'href="'.JRoute::_(FlexicontentHelperRoute::getCategoryRoute( $this->category->slug)).'&iid='.$item->slug.'">;
Voila une première approche rapide, dans les grandes lignes. Tout cela est bien évidement perfectible, et plus complexe (comme cette page
www.atelierdevisu.fr/index.php?option=co...ory&cid=19&Itemid=32
ou 2 niveaux sont affichés : les sous catégories, et les items de chaque sous catégorie.
Les problèmes :
Un problème majeur quand on commence à jouer à ça se trouve au niveau perf.
Le problème semble se trouver plutot au niveau de la conception de joomla (avec les plugins) que de flexi, toujours est il que lorsque les items d'une catégorie sont simplement listés, ils sont tous calculés (appel de la méthode function onDisplayFieldValue).
Ce qui peut génerer un maximum de requetes... la j'en suis a un record de 150 par page, ce qui est inacceptable pour un truc sérieux, et de toutes façons ca foirera sur n'importe quel serveur mutualisé. Il est donc important, à mon avis, d'optimiser un maximum les requetes, de créer des caches dans les modeles pour éviter d'envoyer douze fois la même, etc). Et de pouvoir mieux désactiver tout ce qui est inutile dans de nombreux cas (commentaires, votes, tags, etc) - pour ma part, en général, j'arrache tout.
D'autre part, certains plugins, comme minigallery, n'ont pas été écrit en pensant à ce genre d'utilisation, et écrivent directment du code dans les pages, au lieu de simplement préparer l'item, ce qui peut générer, au choix :
-un quantité de code inutile, proportionnelle au nombre d'item
-des conflits javascript
De mon coté, j'ai du réecrire une bonne partie du plugin minigallery pour avoir quelque chose qui convienne à mon client.
Vos commentaires/critiques/questions sont les bienvenus.