You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

TYPO3 7.6.23+tx_news 6.1.1:隐藏更多链接及显示完整新闻方法问询

TYPO3 News扩展:两个需求的实现方案

一、当新闻内容未超出cropMaxCharacters时隐藏“更多”链接

你提到的需求完全可以实现,核心需要结合Fluid模板修改,TypoScript用来辅助配置自定义模板路径(避免修改扩展自带模板导致更新丢失)。具体步骤如下:

  1. 通过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/
    }
}
  1. 修改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

火山引擎 最新活动