J'essaye de construire un composant appelé com_usedbooks avec un module appelé mod_usedsearch. L'utilisateur peut visualiser des livres en cliquant sur un élément de menu appelé 'Livres utilisés' (/ used-books) qui affichera une liste paginée ou en effectuant une recherche à l'aide d'un module à partir de n'importe quelle page où ils pourront le filtrer par auteur et par auteur.
La vue de liste fonctionne, mais lorsque je cherche dans le module, j'ai deux problèmes qui, je pense, sont liés:
Lorsque le formulaire de recherche dans le module est soumis, il semble être soumis au contexte de composant actuel. Donc, si je soumets le formulaire de recherche à partir de l'URL racine, j'obtiens une chaîne de requête différente (/?genre=fiction&author=all&option=com_usedbooks&view=search&Itemid=101
) par rapport au moment où je soumets le formulaire de recherche dans la page Liste des livres d'occasion (/used-books?genre=fiction&author=all&option=com_usedbooks&view=search&Itemid=108
).
Dans les deux cas, la page de liste avec les données filtrées correctes est affichée, mais avec une capture et lorsque je clique sur la page 2 sur les liens de pagination, elle passe à: /used-books/fiction/0?author=all&start=5
.
Mon hypothèse est que le problème réside dans le routeur, mais j'ai du mal à trouver ce que c'est. Ce que j'essaie de faire, c'est que lorsque le formulaire de recherche est soumis à partir de n'importe quel contexte de composant, il aura une chaîne de requête du type /used-books/search/?genre=fiction&author=all
et de même pour que la pagination soit /used-books/search/?genre=fiction&author=all&limit=5
etc.
Je ne suis pas sûr de ce que je mettrais sur la "recherche" de cas pour obtenir ce que je veux.
J'ai référencé les bits de code pertinents ci-dessous:
<!-- Module Search Form -->
<form name="books-search" action="<?php echo JRoute::_('index.php')?>" method="get">
<!-- fields -->
<input type="hidden" name="option" value="com_usedbooks">
<input type="hidden" name="view" value="search">
<?php
/* Model
* /com_usedbooks/models/search.php
*/
class UsedbooksModelSearch extends JModelList {
protected function getListQuery() {
$db = JFactory::getDBO();
$query = $db->getQuery(true);
// Get the genre
$genre = $this->getState('genre', '');
$query
->select('*')
->from($db->quoteName('used_books'))
->where('genre = ' . $db->quote($genre))
->order('id ASC');
return $query;
}
protected function populateState ($ordering = null, $direction = null) {
$app = JFactory::getApplication();
$this->setState('genre', $app->input->get('genre', '', 'STRING'));
// Limit the number of list items per page
$this->setState('list.limit', $app->input->get('limit', 5, 'uint'));
/* Sets the offset where the page should start, for e.g
* Page limitstart=5 will start the list with the 6th item
*/
$this->setState('list.start', $app->input->get('limitstart', 0, 'uint'));
}
}
/* View
* /com_usedbooks/views/search/tmpl/default.php
*/
class UsedbooksViewSearch extends JViewLegacy
{
// Overwriting JView display method
function display($tpl = null)
{
// Get the Used Books Array
$this->items = $this->get('Items');
// Pagination
$this->pagination = $this->get('Pagination');
// Display the view
parent::display($tpl);
}
}
?>
<!-- /com_usedbooks/views/search/tmpl/default.php -->
<form action="<?php echo htmlspecialchars(JFactory::getURI()->toString()); ?>" method="get">
<?php foreach ($usedBooks as $usedBook): ?>
<h2><?php echo $usedBook->title . ' - '. $usedBook->author; ?></h2>
<?php endforeach; ?>
<?php echo $this->pagination->getListFooter(); ?>
<?php echo $this->pagination->getLimitBox(); ?>
<?php echo $this->pagination->getResultsCounter(); ?>
</form>
<?php
/* Router
* /com_usedbooks/router.php
*/
function UsedbooksBuildRoute(&$query)
{
$segments = array();
if(isset($query['genre'])){
$segments[] = $query['genre'];
unset($query['genre']);
}
if(isset($query['author'])){
$segments[] = $query['author'];
unset($query['author']);
}
if(isset($query['id'])){
$segments[] = $query['id'];
unset($query['id']);
}
unset( $query['view'] );
return $segments;
}
function UsedbooksParseRoute($segments)
{
$vars = array();
$app =& JFactory::getApplication();
$menu =& $app->getMenu();
$item =& $menu->getActive();
// Count segments
$count = count($segments);
//Handle View and Identifier
switch($item->query['view'])
{
case 'usedbooks':
if($count == 1) {
$vars['view'] = 'genre';
}
if($count == 2) {
$vars['view'] = 'author';
}
if($count == 3) {
$vars['view'] = 'usedbook';
}
$id = explode( ':', $segments[$count-1] );
$vars['id'] = (int) $id[0];
break;
case 'genre':
if($count == 1) {
$vars['view'] = 'genre';
}
if($count == 2) {
$vars['view'] = 'author';
}
$id = explode(':', $segments[$count-1]);
$vars['id'] = (int) $id[0];
break;
case 'author':
if($count == 1) {
$vars['view'] = 'author';
}
if($count == 2) {
$vars['view'] = 'usedbook';
}
$id = explode(':', $segments[$count-1]);
$vars['id'] = (int) $id[0];
break;
case 'usedbook':
$reg = explode(':', $segments[$count-1]);
$vars['reg'] = (int) $reg[0];
$vars['view'] = 'usedbook';
break;
case 'search':
break;
}
return $vars;
}
Je pense que je vois le problème avec l'URL de destination du formulaire de module de recherche. L'attribut action de formulaire nécessite les paramètres d'option et de vue. Je vois que vous les avez ajoutés en tant que champ masqué à la fin du formulaire, mais essayez de supprimer ces champs et d’ajouter à l’URL JRoute comme suit:
<form name="books-search" action="<?php echo JRoute::_('index.php?option=com_usedbooks&view=search')?>" method="get">
Etant donné que ces éléments sont essentiels au bon fonctionnement du bâti, l'acheminement de la demande doit garantir au moins que le module achemine la route vers le composant et la vue appropriés.