TYPO3 Создавайте изображения разных размеров
У меня есть эта реализация, использующая ее в подменю уровня страницы 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 и так далее, но я не знаком со счетчиками регистров (может быть, кто-нибудь покажет мне, как это сделать?). И еще один способ - использовать индексный номер файла / изображения, но я пытался часами смотреть в руководствах для такого указателя, и нигде он не указан, если есть что-то, что могло бы помочь с обработкой. Кто-нибудь знает, как это сделать?
2 ответа
Рендеринг двух последовательных изображений с разными параметрами будет затруднен в typoscript:
ваш optionsplit не может быть успешным, так как в renderObj у вас всегда есть только один файл. Плохая привычка всехrenderObj
.
с другой стороны: нет собственности optionSplit
. функциональность встроена в любое свойство обертывания.
поэтому обработка в typoscript может заключаться в объединении элементов, затем их повторном разделении, но затем использовании различных параметров в разделенном renderObj для обработки их отдельно.
или реализовать счетчик с регистровой переменной, а затем оценить регистр, чтобы установить другие значения.
проще было бы работать с жидкостью, где вы могли бы использовать итератор с f:for
viewhelper, а затем выполните f:if
(для двух случаев) или f:switch
(для большего количества случаев) на {iterator.index}
для визуализации отдельных версий.
На основе @Bernd
ответ на тот факт, что каждая страница (как элемент) доставляется как объект в TMENU
s на каждой итерации можно добиться такого рендеринга изображения одним из двух способов:
Во-первых, за счет использования двух записей в регистре 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
. Хитрость в секрете.stdWrap
с wrap
уже содержит optionSplit
. Таким образом, сохраняя желаемый узор,stdWrap
будет обрабатывать правильное значение, которое будет сохранено для каждой итерации.
У меня это сработало. Надеюсь, это кому-то поможет.