如何将新闻中的 showPrevNext 限制为类别?
How to limit showPrevNext in news to categories?
在带有 tx_news 8.3.0 的 TYPO3 CMS 9.5.18 LTS 中,我们使用以下扩展 Typoscript:
plugin.tx_news.settings{
# what is allowed to overwrite with TS
overrideFlexformSettingsIfEmpty := addToList(categories)
overrideFlexformSettingsIfEmpty := addToList(categoryConjunction)
# ids of categories
categories = 3
# category conjunction mode
categoryConjunction = or
}
我想知道为什么我必须将类别添加到 overrideFlexformSettingsIfEmpty 以获得以下结果。尽管如此,post 更多的是关于如何实现 prev/next 链接 (settings.detail.showPrevNext) 完全尊重类别定义。
我们的客户有 3 个类别的新闻。如果我转到一个确实有一个类别限制的页面(对于详细信息和列表页面),我仍然例如可以 "forward" 转到完全不同类别的较新新闻。但是列表页面只显示该一个类别的新闻。
<f:if condition="{paginated.prev}">
<n:link newsItem="{paginated.prev}" settings="{settings}" class="ts-prev">
{paginated.prev.title}
</n:link>
</f:if>
以前不是这样吗?我是否必须添加一些 Typoscript 或在 Fluid 中进行更改?原始代码使用此设置变量作为包含类别限制的参数。
好的,我查看了 GeorgRinger\News\ViewHelpers\SimplePrevNextViewHelper,当前选择的类别没有任何限制。
这就是我所做的:
- 向 viewhelper
注册一个新的可选参数 categories
- 在 Detail.html
中的 simplePrevNext 标签中添加 categories="{settings.categories}"
- 在
getNeighbours
函数中为主查询添加一个'extra where'
- 为附加位置添加内容(我首先在 getNeighbours 函数中这样做)
额外的地方:
if( is_array($newsOfCategory) && count($newsOfCategory) > 0 ){
$extraWhere[] = $queryBuilder->expr()->in('uid', $queryBuilder->createNamedParameter($newsOfCategory, Connection::PARAM_INT_ARRAY));
}
附加内容:
if( is_string($categories) && preg_match('/^[0-9]+(,[0-9]+)*$/',$categories) ){
$categories = explode(',', $categories);
$tmpCon = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('sys_category_record_mm');
$tmpQB = $tmpCon->createQueryBuilder();
$rows = $tmpQB
->select('uid_foreign')
->from('sys_category_record_mm')
->where(
$tmpQB->expr()->in('uid_local', $tmpQB->createNamedParameter($categories, Connection::PARAM_INT_ARRAY))
)
->andWhere(
$tmpQB->expr()->like('tablenames', $tmpQB->createNamedParameter('tx_news_domain_model_news'))
)
->execute()->fetchAll();
if( is_array($rows) && count($rows) > 0 ){
foreach($rows as $row){
$newsOfCategory[] = $row['uid_foreign'];
}
}
}
将来可能会有人使用它,或者会将其集成到存储库中。
在带有 tx_news 8.3.0 的 TYPO3 CMS 9.5.18 LTS 中,我们使用以下扩展 Typoscript:
plugin.tx_news.settings{
# what is allowed to overwrite with TS
overrideFlexformSettingsIfEmpty := addToList(categories)
overrideFlexformSettingsIfEmpty := addToList(categoryConjunction)
# ids of categories
categories = 3
# category conjunction mode
categoryConjunction = or
}
我想知道为什么我必须将类别添加到 overrideFlexformSettingsIfEmpty 以获得以下结果。尽管如此,post 更多的是关于如何实现 prev/next 链接 (settings.detail.showPrevNext) 完全尊重类别定义。
我们的客户有 3 个类别的新闻。如果我转到一个确实有一个类别限制的页面(对于详细信息和列表页面),我仍然例如可以 "forward" 转到完全不同类别的较新新闻。但是列表页面只显示该一个类别的新闻。
<f:if condition="{paginated.prev}">
<n:link newsItem="{paginated.prev}" settings="{settings}" class="ts-prev">
{paginated.prev.title}
</n:link>
</f:if>
以前不是这样吗?我是否必须添加一些 Typoscript 或在 Fluid 中进行更改?原始代码使用此设置变量作为包含类别限制的参数。
好的,我查看了 GeorgRinger\News\ViewHelpers\SimplePrevNextViewHelper,当前选择的类别没有任何限制。
这就是我所做的:
- 向 viewhelper 注册一个新的可选参数
- 在 Detail.html 中的 simplePrevNext 标签中添加
- 在
getNeighbours
函数中为主查询添加一个'extra where' - 为附加位置添加内容(我首先在 getNeighbours 函数中这样做)
categories
categories="{settings.categories}"
额外的地方:
if( is_array($newsOfCategory) && count($newsOfCategory) > 0 ){
$extraWhere[] = $queryBuilder->expr()->in('uid', $queryBuilder->createNamedParameter($newsOfCategory, Connection::PARAM_INT_ARRAY));
}
附加内容:
if( is_string($categories) && preg_match('/^[0-9]+(,[0-9]+)*$/',$categories) ){
$categories = explode(',', $categories);
$tmpCon = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('sys_category_record_mm');
$tmpQB = $tmpCon->createQueryBuilder();
$rows = $tmpQB
->select('uid_foreign')
->from('sys_category_record_mm')
->where(
$tmpQB->expr()->in('uid_local', $tmpQB->createNamedParameter($categories, Connection::PARAM_INT_ARRAY))
)
->andWhere(
$tmpQB->expr()->like('tablenames', $tmpQB->createNamedParameter('tx_news_domain_model_news'))
)
->execute()->fetchAll();
if( is_array($rows) && count($rows) > 0 ){
foreach($rows as $row){
$newsOfCategory[] = $row['uid_foreign'];
}
}
}
将来可能会有人使用它,或者会将其集成到存储库中。