Je dois modifier l'ordre dans lequel les produits sont affichés sur la page de catégorie Virtuemart. Les fichiers models/product.php
et tables/products.php
sont trop compliqués pour que je mette les changements en eux. J'ai donc décidé d'utiliser des requêtes SQL directes dans views/category/default.php
(si plus précisément dans templates/my_template/html/com_virtuemart/category/default.php
) comme:
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('a.virtuemart_product_id');
$query->from('#__virtuemart_product_categories AS a');
$query->where($db->quoteName('virtuemart_category_id')." = ".$db->quote($this->category->virtuemart_category_id));
$query->select('b.product_in_stock, c.product_price');
$query->join('LEFT', '#__virtuemart_products AS b ON b.virtuemart_product_id = a.virtuemart_product_id');
$query->join('LEFT', '#__virtuemart_product_prices AS c ON c.virtuemart_product_id = a.virtuemart_product_id');
$query->order('b.product_in_stock DESC, c.product_price DESC');
$db->setQuery($query);
$sortedProducts = $db->loadObjectList();
...
Ce n'est pas le seul cas où j'ai eu besoin d'utiliser des requêtes SQL directes dans certaines vues ou dans des modèles.
Mais dans quelle mesure cette voie directe est-elle sûre et comment la protéger le plus possible?
Joomla est construit sur le modèle de conception MVC, il est donc déconseillé d'interroger la base de données à partir d'une vue. Mais avec votre scénario, considérons quelques alternatives:
Pour considérer votre solution actuelle:
Conclusions
Si votre travail est une preuve de concept, optez pour votre solution actuelle; S'il s'agit d'un site Web actif, investissez un peu de votre temps pour créer un assistant ou un modèle dans lequel vous coderez vos requêtes. Vous gagnerez en flexibilité, en capacité de réutilisation (si deux affichages nécessitent les mêmes données, vous n'avez pas besoin de dupliquer le code) et vous gagnerez du temps à l'avenir.