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;
}
_
検索モジュールフォームのリンク先URLに問題があると思います。フォームアクション属性には、オプションとビューパラメータが必要です。フォームの最後に非表示フィールドとして追加したようですが、これらのフィールドを削除して、JRouteのURLに次のように追加してみてください。
<form name="books-search" action="<?php echo JRoute::_('index.php?option=com_usedbooks&view=search')?>" method="get">
これらはリクエストを適切にルーティングするフレームワークにとって重要であるため、少なくともモジュールが適切なコンポーネントとビューへのルートを確実にする必要があります。