it-swarm.com.de

Paginierte Links zu Elementen, die mit einem benutzerdefinierten Suchmodul erstellt wurden, funktionieren nicht

Ich versuche, eine Komponente namens com_usedbooks mit einem Modul namens mod_usedsearch zu erstellen. Der Benutzer kann Bücher anzeigen, indem er auf einen Menüeintrag namens "Gebrauchte Bücher" (/ used-books) klickt, der eine paginierte Liste anzeigt, oder indem er sie mit einem Modul von jeder Seite aus durchsucht, auf der er sie nach Autor und Autor filtern kann.

Ich habe die Listenansicht aktiviert, aber wenn ich mit dem Modul suche, habe ich zwei Probleme, die meiner Meinung nach zusammenhängen:

Wenn das Suchformular im Modul gesendet wird, wird es anscheinend an den aktuellen Komponentenkontext gesendet. Wenn ich also das Suchformular über die Stamm-URL abschicke, erhalte ich eine andere Abfragezeichenfolge (/?genre=fiction&author=all&option=com_usedbooks&view=search&Itemid=101) im Vergleich zu dem Zeitpunkt, zu dem ich das Suchformular auf der Seite "Gebrauchtbücherliste" (/used-books?genre=fiction&author=all&option=com_usedbooks&view=search&Itemid=108).

In beiden Fällen wird die Listenseite mit den richtigen gefilterten Daten angezeigt, aber mit einem Haken. Wenn ich auf Seite 2 auf die Paginierungslinks klicke, geht es weiter zu: /used-books/fiction/0?author=all&start=5.

Ich vermute, dass das Problem im Router liegt, aber ich kämpfe, um zu finden, was es ist. Was ich versuche zu tun ist, wenn das Suchformular aus einem beliebigen Komponentenkontext gesendet wird, wird es eine Abfragezeichenfolge wie /used-books/search/?genre=fiction&author=all und in ähnlicher Weise für die Paginierung zu /used-books/search/?genre=fiction&author=all&limit=5 und so weiter.

Ich bin nicht sicher, was ich in den Fall "Suche" stecken würde, um das zu erreichen, was ich will.

Ich habe die relevanten Codebits unten referenziert:

<!-- 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;
}
2
sifu

Ich glaube, ich sehe das Problem mit der Ziel-URL des Suchmoduls. Das Formularaktionsattribut benötigt die Parameter option und view. Sie haben sie am Ende des Formulars als ausgeblendetes Feld hinzugefügt. Versuchen Sie jedoch, diese Felder zu entfernen und der JRoute-URL wie folgt hinzuzufügen:

<form name="books-search" action="<?php echo JRoute::_('index.php?option=com_usedbooks&view=search')?>" method="get">

Da diese für die ordnungsgemäße Weiterleitung der Anforderung für die Rahmenarbeit von entscheidender Bedeutung sind, sollte dies zumindest sicherstellen, dass das Modul Routen zur richtigen Komponente und Ansicht bildet.

3
Brian Bolli