TYPO3 tx_news生成指向隐藏默认语言页面的无效链接如何阻止?
我最近碰到了和你一模一样的场景:一篇标记为internal link的新闻文章,在默认语言创建后完成了本地化,文章里的内部链接指向了一个开启了Hide default translation of page标记的页面。编辑用tx_news插件的list of selected items功能在默认语言选中这篇新闻后,TYPO3居然生成了指向那个已隐藏默认页面的无效链接,实在头疼。
你的核心需求很明确:想让TYPO3/tx_news只在目标页面可用时才渲染链接,对吧?结合你给出的配置(TYPO3 8.7.13、tx_news 6.3.0),我整理了几个可行的解决思路:
1. 修改Fluid模板直接控制链接渲染
tx_news的前端输出全靠Fluid模板,我们可以在模板里加个判断,只有当目标页面状态正常时才渲染链接。
比如找到你正在使用的新闻列表/详情模板(通常在typo3conf/ext/your_template/Resources/Private/Templates/News/下的List.html或Detail.html),找到处理内部链接的代码块,改成这样:
<f:if condition="{newsItem.internalLink}"> <f:then> <!-- 检查页面是否未隐藏且未开启隐藏默认翻译标记 --> <f:if condition="{newsItem.internalLink.hidden} != 1 && {newsItem.internalLink.hideDefaultTranslation} != 1"> <a href="{f:uri.page(pageUid: newsItem.internalLink.uid)}">{newsItem.title}</a> </f:if> </f:then> <f:else> <!-- 没有有效链接时直接显示标题 --> {newsItem.title} </f:else> </f:if>
这个方法最直接,不需要复杂的配置,改完模板就能生效。
2. 用Typoscript过滤无效新闻条目
如果想从根源上避免无效新闻出现在列表里,可以在Typoscript里配置查询条件,让tx_news只加载内部链接指向有效页面的新闻:
plugin.tx_news.settings.persistence.classes { GeorgRinger\News\Domain\Model\News { querySettings { # 关联pages表,通过internal_link字段关联 join = pages ON tx_news_domain_model_news.internal_link = pages.uid # 过滤掉隐藏或开启了隐藏默认翻译的页面对应的新闻 where = pages.hidden = 0 AND pages.hide_default_translation = 0 } } }
这样编辑选中的新闻如果指向无效页面,会直接被排除在列表之外,自然不会生成无效链接。
3. 扩展tx_news模型(进阶方案)
如果需要更灵活的判断逻辑,可以自定义一个新闻模型的扩展,添加方法来判断链接有效性:
namespace YourVendor\YourExtension\Domain\Model; class News extends \GeorgRinger\News\Domain\Model\News { /** * 判断内部链接是否有效 * @return bool */ public function hasValidInternalLink(): bool { $internalLink = $this->getInternalLink(); if (!$internalLink) { return false; } // 检查页面是否未隐藏且未开启隐藏默认翻译 return !$internalLink->isHidden() && !$internalLink->getHideDefaultTranslation(); } }
之后在模板里就可以用{newsItem.hasValidInternalLink()}来做条件判断,渲染逻辑会更清晰。
内容的提问来源于stack exchange,提问作者Peter Kraume

