我有这样的页面结构(Typo3 v10):
Page 1
- Page 1.1
- Page 1.2
- - Page 1.2.1
...
Page 2
- Page 2.1
- Page 2.2
...
我需要显示具有滑动功能的图像(来自页面资源)。所以我使用这个代码:
lib.banner = FILES
lib.banner {
references {
table = pages
data = levelmedia: -1, slide
}
renderObj = IMAGE
renderObj {
file.import.data = file:current:uid
file.treatIdAsReference = 1
wrap = <div class="banner">|</div>
}
}
在 HTML 模板中,我使用它如下:
<f:cObject typoscriptObjectPath="lib.banner" />
一切正常。我从当前页面资源或当前页面的父资源中看到图像。
现在如果我需要显示来自具有特殊 ID 的其他页面的图像,我使用以下代码
lib.banner = FILES
lib.banner {
references {
table = pages
uid.data = field:PageIdParam
fieldName = media
}
renderObj = IMAGE
renderObj {
file.import.data = file:current:uid
file.treatIdAsReference = 1
wrap = <div class="banner">|</div>
}
}
在 HTML 中:
<f:cObject typoscriptObjectPath="lib.banner" data="{ PageIdParam: 123 } />
但是如果我需要添加滑动功能怎么办?
我尝试使用以下代码:
lib.banner = FILES
lib.banner {
references {
table = pages
data = levelmedia: -1, slide
uid.data = field:PageIdParam
fieldName = media
}
renderObj = IMAGE
renderObj {
file.import.data = file:current:uid
file.treatIdAsReference = 1
wrap = <div class="banner">|</div>
}
}
不幸的是它停止工作..我做错了什么?
我也尝试过使用 file.import.data = levelmedia:-1, slide,但没有帮助
更新:
更详细的信息以及解释为什么我需要这个:
我创建了一个自定义内容元素 (根据https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/ContentElements/AddingYourOwnContentElements.html)
该元素输出图像列表。图片取自页面。
内容元素的排版:
tt_content {
images_from_pages =< lib.contentElement
images_from_pages {
templateName = ImagesFromPages
dataProcessing {
30 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
30 {
special = list
special.value.field = pages
maxItems = 100
as = contentElementPages
titleField = nav_title // title
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
10 {
references.fieldName = media
}
}
}
}
}
}
为了输出图像,我使用了流体模板:
<html data-namespace-typo3-fluid="true" xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers">
<f:if condition="{contentElementPages}">
<f:for each="{contentElementPages}" as="page">
<h2>{page.title}</h2>
<f:if condition="{page.files.0} ">
<f:then>
<f:render partial="ImagesFromPages/Image" arguments="{file: page.files.0}" />
</f:then>
<f:else>
<f:cObject
typoscriptObjectPath="lib.banner"
data="{
parentPageId: page.data.pid,
width: '300c',
height: '300c'
}"
/>
</f:else>
</f:if>
</f:for>
</f:if>
</html>
因此,我有一个列表 [page1 title / img1, page2 title / img2 ...]
如果循环中的页面没有图像,我使用page.data.pid
来引用“父页面”
我还没有解决的问题:如果父页面也没有图片,我需要递归输出父页面的父图片(滑动)。
我知道,我可以使用“默认图像或来自根页面的图像”,但首先我想尝试从“父页面的父页面”获取图像
答案 0 :(得分:0)
在 Fluid 模板中使用 hardcoded 值而不是直接在 TypoScript 中使用它的原因是什么?这很有效,如果需要,可以用 TS 轻松覆盖所选页面,如 ext-ts:lib.banner.references.uid = 789
(其中 123
和 789
是所需页面的 uid,媒体的字段图像应该来自这些页面被采取):
经过测试和工作的示例(实际上它与您的第一个版本相同,只是):
lib.banner {
references {
table = pages
uid = 123
fieldName = media
}
renderObj = IMAGE
renderObj {
file.import.data = file:current:uid
file.treatIdAsReference = 1
wrap = <div class="banner">|</div>
}
}
滑动问题
请记住,slide
被放置在相对父子上下文中,将静态 uid
与幻灯片结合起来可能会产生奇怪的结果.
一般来说slide
accepts just two values就是-1
和2
,都指的是页面树的遍历。
此示例按预期工作,它将使用当前页面的媒体,如果不存在,将遍历树直到根查找它们。
注意:由于levelmedia
已经指向media
字段,不需要再次使用fieldName
,其余代码保持不变< /p>
references {
table = pages
data = levelmedia: -1, slide
}
您对问题的更新完全改变了事情,现在在我看来,您希望显示您在 CE 中选择的第一页中的图像。这不是 TS slide
的工作,您应该使用自定义 PHP 来检查这些页面并从包含任何图像的第一个页面中选择图像。下面是执行此操作的 FE 插件的示例代码,请注意,这只是一个 POC,可能需要修复。如果这是你想要的,我可以在 Github 上发布完整的扩展,你可以测试一下。
插件的动作:
public function listAction()
{
/** @var FileRepository $fileRepo */
$fileRepo = GeneralUtility::makeInstance(FileRepository::class);
$fileObjects = [];
$pidList = $this->configurationManager->getConfiguration(
ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK
)['persistence']['storagePid'];
$pids = GeneralUtility::trimExplode(',', $pidList, true);
$mediaFound = false;
foreach ($pids as $pid) {
if ($mediaFound) continue;
$fileObjects = $fileRepo->findByRelation('pages', 'media', $pid);
if (count($fileObjects) > 0) {
$mediaFound = true;
}
}
$this->view->assign('files', $fileObjects);
}
动作视图
<f:for each="{files}" as="file">
<f:image src="{file.uid}" treatIdAsReference="1"/>
</f:for>
答案 1 :(得分:0)
只是为了重新解决您的问题:
您将图像分配给继承的页面。如果页面未分配图像,则在有图像之前咨询父母。
只要考虑当前页面,此机制在带有 levelfields
的 TYPO3 中有效。
如果您想从另一个页面访问数据(由 uid
给出),typoscript 中没有内置机制
如果您需要任何其他页面的图像(例如用于预告片),您需要使用 PHP 从该页面的根线计算图像。如果您仍然使用 FLUID,请构建一个 userfunc 或 viewhelper。
或者您构建一个包含许多 .ifEmpty
元素的级联排版文字,您可以在其中请求父级、父级的父级、父级的父级的父级,...是否有图像。
这将是一个手动递归,因为您需要手动复制所有可能级别的代码(并调整相关页面 uid 的确定)。所以我推荐使用PHP。