TYPO3 7.6.23+tx_news 6.1.1:隐藏更多链接及显示完整新闻方法问询
TYPO3 News扩展:两个需求的实现方案
一、当新闻内容未超出cropMaxCharacters时隐藏“更多”链接
你提到的需求完全可以实现,核心需要结合Fluid模板修改,TypoScript用来辅助配置自定义模板路径(避免修改扩展自带模板导致更新丢失)。具体步骤如下:
- 通过TypoScript指定自定义模板目录
在你的现有TypoScript配置中,给lib.news_list添加模板路径设置,指向你自己的模板文件夹(比如fileadmin/templates/news/):
lib.news_list < lib.news lib.news_list { action = list switchableControllerActions.News.1 = list view { templateRootPaths.10 = fileadmin/templates/news/Templates/ partialRootPaths.10 = fileadmin/templates/news/Partials/ layoutRootPaths.10 = fileadmin/templates/news/Layouts/ } }
- 修改List模板中的“更多”链接判断
复制TYPO3 News扩展自带的List.html模板(路径一般是typo3conf/ext/news/Resources/Private/Templates/News/List.html)到你刚才指定的fileadmin/templates/news/Templates/News/目录下,找到“更多”链接的代码块,添加条件判断:只有当内容被实际裁剪时才显示链接。
原代码大概是这样的:
<f:if condition="{newsItem.link}"> <a href="{newsItem.link}" target="_blank" class="more">{f:translate(key:'more')}</a> </f:if> <f:if condition="{newsItem.link} == 0"> <f:link.action action="detail" arguments="{news: newsItem}" class="more">{f:translate(key:'more')}</f:link.action> </f:if>
修改后加上{newsItem.cropApplied}的判断:
<f:if condition="{newsItem.cropApplied}"> <f:if condition="{newsItem.link}"> <a href="{newsItem.link}" target="_blank" class="more">{f:translate(key:'more')}</a> </f:if> <f:if condition="{newsItem.link} == 0"> <f:link.action action="detail" arguments="{news: newsItem}" class="more">{f:translate(key:'more')}</f:link.action> </f:if> </f:if>
这样一来,只有当新闻内容长度超过cropMaxCharacters(也就是cropApplied为true)时,“更多”链接才会显示;如果内容完整显示(没触发裁剪),链接就会隐藏。你当前设置cropMaxCharacters = 9999的方式没问题,足够显示大部分新闻的完整内容,这个配置可以保留。
二、单页以详情视图展示所有新闻
如果想在一个页面里展示所有新闻的详情内容(而不是列表+跳转详情页),有两种简单的实现方式:
方式1:修改List模板渲染详情内容
同样基于上面的自定义模板设置,修改List.html模板,把原来的列表摘要部分替换成详情内容的渲染。比如:
原列表循环部分大概是:
<f:for each="{news}" as="newsItem"> <div class="news-item"> <h2><f:link.action action="detail" arguments="{news: newsItem}">{newsItem.title}</f:link.action></h2> <f:if condition="{newsItem.teaser}"> <p>{newsItem.teaser -> f:format.crop(maxCharacters: settings.cropMaxCharacters, respectWordBoundaries: 1)}</p> </f:if> <!-- 更多链接 --> </div> </f:for>
修改成直接渲染详情内容:
<f:for each="{news}" as="newsItem"> <div class="news-detail-item"> <h1>{newsItem.title}</h1> <f:if condition="{newsItem.datetime}"> <p class="date">{newsItem.datetime -> f:format.date(format: 'Y-m-d H:i')}</p> </f:if> <div class="content">{newsItem.bodytext -> f:format.raw()}</div> <!-- 如果需要分隔线可以加个hr --> <hr> </div> </f:for>
这样访问列表页时,就会直接展示所有新闻的完整详情内容,不需要跳转。
方式2:用TypoScript循环调用详情视图(适合更复杂的场景)
如果你不想修改模板,也可以用TypoScript的CONTENT对象来获取所有新闻记录,然后循环调用lib.news_detail来渲染每个新闻的详情:
lib.all_news_details = CONTENT lib.all_news_details { table = tx_news_domain_model_news select { pidInList = 128 # 和你设置的startingpoint一致 orderBy = datetime DESC max = 10 # 控制显示数量,和itemsPerPage一致 } renderObj = COA renderObj { 10 < lib.news_detail 10.settings.news = {field:uid} # 传递当前新闻的UID给详情视图 20 = HR # 每个新闻之间加分隔线 20.style = margin: 2rem 0; } } # 然后替换原来的list调用 [globalVar = GP:tx_news_pi1|news > 0] page.100.10.20 = COA page.100.10.20.10 < lib.news_detail [else] page.100.10.20 = COA page.100.10.20.10 < lib.all_news_details [end]
这种方式的好处是可以复用现有的详情视图模板,不用重新写详情的渲染代码。
内容的提问来源于stack exchange,提问作者A.Wund




