TYPO3 8 Fluid_styled_content: 在Image-partial中使用layout值

TYPO3 8 Fluid_styled_content: use value of layout in Image-partial

基本上我想使用TYPO3中内容元素的"layout"值来实现图像的不同渲染:例如一个名为 "circle images" 的布局,将该内容元素的所有图像呈现为正方形,并且可能还有一些额外的 css-class.

CSC-times of courde 中使用的代码片段不适用于新的 fluid_styled_content,所以我尝试让它与 FSC 一起使用,但我遇到了一些奇怪的问题,因为我无法在部分最终渲染图像中获取 "layout" 值。

添加一些布局条目(有效):

TCEFORM {
tt_content {
    layout {
        addItems {
            4 = Circle images
        }
    }
}

使用我自己的 FSC 部分(和模板)(一般有效):

lib.contentElement.partialRootPaths.200 = EXT:myextkey/Resources/Private/Partials/
lib.contentElement.templateRootPaths.200 = EXT:myextkey/Resources/Private/Templates/FluidContentTemplates

(它们基于原始版本的副本,除了一些调试条目外没有任何更改。)

现在到了我卡住的地方:我可以很容易地获得(并使用,例如,对于某些 if 条件或仅作为测试/调试输出)[=57= 中的 layout-值],在 Textmedia.html(模板)以及 Gallery.html 中,我得到了 {data.layout} 的期望值,例如使用

<f:debug title="my-layout-value">{data.layout}</f:debug>

实际图像的渲染由以下f:render viewhelper-line 完成,与原始版本相同:

<f:for each="{gallery.rows}" as="row">
        <div class="ce-row">
            <f:for each="{row.columns}" as="column">
                <f:if condition="{column.media}">
                    <div class="ce-column">
                        <f:debug title="my-layout-value">{data.layout}</f:debug>
                        <f:render partial="Media/Type" arguments="{file: column.media, dimensions: column.dimensions, data: data, settings: settings}" />
                    </div>
                </f:if>
            </f:for>
        </div>
    </f:for>

所以,据我目前的理解,所有这些列为 arguments 的变量都应该传递给图像的渲染。

但是在 Rendering\Image.html-partial 中,{data} 的内容突然变成了 NULL,所以没有机会使用我的布局值。 Image-partial 的其余部分保持不变,图像照常渲染(包括一些硬编码测试 css-class 以验证我的 "custom" partial 是否被使用)。

我还尝试在 Gallery.html-partial 中使用 arguments={_all}(真正得到 "everything"),导致 "Oops"-错误: 提供的文件对象类型 TYPO3\CMS\Fluid\ViewHelpers\MediaViewHelper 必须是 FileInterface 或 AbstractFileFolder

我不知道我哪里出错了,也不知道如何使所需的逻辑起作用(根据内容元素的布局设置改变图像的渲染/classes/裁剪)。

正如您所注意到的,partial 仅获取 arguments 参数中提到的那些变量。如果您想评估另一个值,您需要更改部分调用并添加该值。

在您的示例中,data 已作为参数传递。但是该调用不会调用您需要 layout 值的部分。您需要进一步跟踪(并确保您的 data.layout 被传递)直到您到达对部分 Rendering/Image

的调用

提示:
如果您使用 f:debug-tag,请始终使用 title 参数来标识调用了哪个调试标记:

<f:debug title="my-layout-value at Template X,Line Y">{data.layout}</f:debug>