📅  最后修改于: 2023-12-03 14:48:05.867000             🧑  作者: Mango
最近我们在使用 Typo3 进行新闻搜索时遇到了一个问题,我们发现分页时搜索参数丢失,导致分页不生效,这个问题我们分析后发现是由于代码中缺少了必要的代码所导致的。
我们的搜索表单提交到 search
页面,然后在 search
页面的 action
中设置了搜索表单的参数,如下所示:
<form method="get" action="/search">
<input type="text" name="q">
<button type="submit">搜索</button>
</form>
然后在 search
页面中,我们使用 Typo3 的搜索插件来进行 SQL 查询,然后将查询结果逐个输出到页面上。
$searchResult = $GLOBALS['TSFE']->cObj->cObjGetSingle(
'SEARCH_RESULT',
array(
'pid' => '123',
'search.' => array(
'searchPage' => '456',
'searchFields' => 'tx_news_domain_model_news.title,tx_news_domain_model_news.bodytext',
'orderBy' => 'datetime DESC',
'groupBy' => 'tx_news_domain_model_news.uid',
),
)
);
print $searchResult;
在这个代码中,我们设置了 pid
参数来指定搜索的页面 ID,以及 searchPage
、searchFields
、orderBy
、groupBy
等参数来指定搜索的具体方式。
但是当我们进行分页时,我们发现搜索参数丢失,导致分页不生效。我们分析后发现,这是因为在分页时我们没有将搜索参数带入到分页链接中去。
要解决这个问题,我们需要将搜索参数带入到分页链接中去。我们可以通过下面的代码来实现这个功能:
$currentPageNumber = $this->cObj->stdWrap($this->cObj->data['GP']['curPage'], 1);
$pagesConfig['q'] = isset($_GET['q']) ? $_GET['q'] : '';
$pagination = $GLOBALS['TSFE']->cObj->cObjGetSingle(
'COA_INT',
array(
'10 = TEXT',
'10.value = <nav><ul class="pagination">',
'20 = USER',
'20.userFunc = TYPO3\\CMS\\Fluid\\Core\\ViewHelpers\\Widget\\PaginateViewHelper->render',
'20 {
itemsPerPage = 10
insertAbove = 1
insertBelow = 1
collection = ' . $searchResultArray . '
data = paginate
# Prev and next texts
prevText = «
nextText = »
# Wrap for nav
wrap = <li>|</li>
wrap.insertData = 1
# Active current page
active = 1
# Insert current page into links
insertData = 1
# Current page number
curPage = ' . $currentPageNumber . '
# Link configuration
link {
parameter.data = parameters : allParams
additionalParams = ' . http_build_query($pagesConfig) . '
additionalParams.insertData = 1
useCacheHash = 1
}
}',
'30 = TEXT',
'30.value = </ul></nav>',
)
);
print $pagination;
在这个代码中,我们首先将搜索参数 q
保存到一个变量 $pagesConfig
中去,然后在分页链接的 additionalParams
中将其添加到分页链接中去。
这样,当我们进行分页时,搜索参数就会被带入到分页链接中去了,从而解决了搜索参数丢失的问题。
总结起来,这个问题的解决方案就是:将搜索参数带入到分页链接中去。