TYPO3产生不同尺寸的图像

问题描述 投票:0回答:2

我有此实现,可在第2级页面子菜单中使用它。每个2级菜单都有多个子页面。每个子页面都有一个图像。因此,此实现会为每个子菜单从每个页面生成一个图像。例如,具有2个子页面的子菜单将具有2张图像(每个子页面一个)。

1 = FILES
1 {
    references {
        table = pages
        fieldName = media
        data = levelmedia:-1, slide
    }

    begin = 0
    maxItems = 2

    renderObj = COA
    renderObj {
        2 = IMAGE
        2 {
            file {
                //params = -sharpen 50  +profile "*" -quality 100
                import.data = file:current:uid
                treatIdAsReference = 1
                width.optionSplit = 300c|*|400c
                height.optionSplit = 350c|*|450c
            }
        }
    }
}

希望将图像裁切成不同的大小,以使图像1被裁切成与图像2不同的尺寸,依此类推。

我的ImageMagick安装效果很好。实际上是用它毫无障碍地裁剪单个图像。

没有上面的optionSplit,图像被很好地切成大小。不幸的是,使用optionSplit,它仅以原始尺寸输出图像。

如何产生不同尺寸的图像?我的理解是,optionSplit是解决方法(来自手册)。我读过一些文章,其中soureCollection用于响应图像使用optionSplit。我想象另一种方式是使用图像注册计数器并使用CASE来确定如何剪切图像1、2、3等,但是不熟悉注册计数器(也许有人可以告诉我该怎么做?)。还有另一种方法是使用文件/图像索引号,但是我尝试了数小时的手册才能找到这样的指针,并且如果有任何帮助的地方,没有列出。有人知道这样做的方法吗?

typo3 typoscript typo3-10.x
2个回答
1
投票

在打字稿中很难渲染两个具有不同参数的连续图像:您的optionsplit不能成功,因为在renderObj中您始终只有一个文件。所有renderObj的坏习惯。

另一方面:没有属性optionSplit。该功能是在任何wrap属性中构建的。

因此,在打字稿中的处理可能是连接元素,然后再次拆分它们,然后在拆分的renderObj中使用不同的选项来分别处理它。或使用寄存器变量实现计数器,然后评估寄存器以设置不同的值。

更容易进行流体处理,您可以在f:for viewhelper中使用迭代器,然后在f:if上执行f:switch(对于两种情况)或{iterator.index}(对于更多情况),以渲染各个版本。


0
投票

基于@Bernd的回答,即每个页面(作为项目)在每次迭代中都以TMENU的形式作为对象交付,可以通过以下两种方式之一实现这种图像渲染:

首先,通过使用两个寄存器条目register:count_menuItems,其中包含要处理的项目总数; register:count_MENUOBJ保留要迭代的当前项目的索引(从1开始)。可以将这两个图像与CASE语句结合使用,以根据自己的喜好彻底处理每个图像。如果页面上有多张图像,则可以使用两个以上的注册项目,分别是register:FILES_COUNT(从0开始计数)和register:FILES_NUM_CURRENT。由于这些注册表项本身就是计数器,因此无需实现注册表计数器。

第二,如@Bernd所述,有一种更简单的方法,一种省时得多的方法,使用自动换行,如下所示;

NO = 1
NO {
    1 = LOAD_REGISTER
    1 {
        width.cObject = TEXT
        width.cObject.stdWrap.wrap = 100c||200c

        height.cObject = TEXT
        height.cObject.stdWrap.wrap = 300c||400c
    }

    2 = FILES
    2 {
        # Get the images related to the current page
        references {
            table = pages
            fieldName = media
        }
        # Render each image and wrap it as appropriate
        renderObj = IMG_RESOURCE
        renderObj {
            file {
                treatIdAsReference = 1
                import.data = file:current:uid
                width = {REGISTER:width}
                width.insertData = 1
                height = {REGISTER:height}
                height.insertData = 1
            }
        }
        stdWrap {
            wrap = <img src="|"  />
        }
    }
}

如您所见,此代码正在TMENU中使用,并根据段1中定义的不同规则处理每个图像,并由LOAD_REGISTER存储。诀窍在于包装。 stdWrapwrap已包含optionSplit。因此,通过存储所需的模式,stdWrap将为每次迭代处理要存储的正确值。

它对我有用。希望它能对某人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.