web-dev-qa-db-ja.com

カスタム検索モジュールを使用して生成されたアイテムのページ付けされたリンクが機能しない

Mod_usedsearchというモジュールを使用して、com_usedbooksというコンポーネントを構築しようとしています。ユーザーは、ページ番号付きリストを表示する「中古本」(/ used-books)と呼ばれるメニュー項目をクリックするか、著者と著者でフィルターできる任意のページからモジュールを使用して検索することで、本を表示できます。

リストビューは機能しましたが、モジュールで検索すると、相互に関連していると思われる2つの問題があります。

モジュールの検索フォームが送信されると、現在のコンポーネントコンテキストに送信されているようです。したがって、ルートURLから検索フォームを送信する場合は、[古本リスト]ページで検索フォームを送信する場合(_/?genre=fiction&author=all&option=com_usedbooks&view=search&Itemid=101_)とは異なるクエリ文字列(_/used-books?genre=fiction&author=all&option=com_usedbooks&view=search&Itemid=108_)を取得します。

どちらの場合も、正しいフィルターデータのリストページが表示されますが、1つのキャッチがあり、ページネーションリンクのページ2をクリックすると、_/used-books/fiction/0?author=all&start=5_に移動します。

問題はルータにあると思いますが、それが何であるかを見つけるのに苦労しています。私がやろうとしていることは、検索フォームがコンポーネントコンテキストから送信されると、_/used-books/search/?genre=fiction&author=all_のようなクエリ文字列を持ち、同様にページ付けが_/used-books/search/?genre=fiction&author=all&limit=5_などになることです。

自分がやりたいことを達成するために「検索」のケースに何を付ければよいのかわかりません。

以下のコードの関連ビットを参照しました:

_<!-- 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

検索モジュールフォームのリンク先URLに問題があると思います。フォームアクション属性には、オプションとビューパラメータが必要です。フォームの最後に非表示フィールドとして追加したようですが、これらのフィールドを削除して、JRouteのURLに次のように追加してみてください。

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

これらはリクエストを適切にルーティングするフレームワークにとって重要であるため、少なくともモジュールが適切なコンポーネントとビューへのルートを確実にする必要があります。

3
Brian Bolli