带有打字稿代码的滑动图像问题

时间:2021-05-12 12:09:43

标签: typo3 typoscript fluid

我有这样的页面结构(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

Custom content element with Pages field

该元素输出图像列表。图片取自页面。

内容元素的排版:

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来引用“父页面”

我还没有解决的问题:如果父页面也没有图片,我需要递归输出父页面的父图片(滑动)。

我知道,我可以使用“默认图像或来自根页面的图像”,但首先我想尝试从“父页面的父页面”获取图像

2 个答案:

答案 0 :(得分:0)

在 Fluid 模板中使用 hardcoded 值而不是直接在 TypoScript 中使用它的原因是什么?这很有效,如果需要,可以用 TS 轻松覆盖所选页面,如 ext-ts:lib.banner.references.uid = 789(其中 123789 是所需页面的 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就是-12,都指的是页面树的遍历。

此示例按预期工作,它将使用当前页面的媒体,如果不存在,将遍历树直到根查找它们。

注意:由于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。

相关问题