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:forviewhelper, а затем выполните f:if (для двух случаев) или f:switch (для большего количества случаев) на {iterator.index} для визуализации отдельных версий.

На основе @Bernd ответ на тот факт, что каждая страница (как элемент) доставляется как объект в TMENUs на каждой итерации можно добиться такого рендеринга изображения одним из двух способов:

Во-первых, за счет использования двух записей в регистре 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 будет обрабатывать правильное значение, которое будет сохранено для каждой итерации.

У меня это сработало. Надеюсь, это кому-то поможет.

Другие вопросы по тегам