Добавить дополнительный источник в изображение для дальнейших действий
Я пытаюсь добавить дополнительный источник в dce-образ для дальнейших действий, например, альтернативный источник для выполнения некоторых действий JavaScript.
Требуемый результат должен выглядеть следующим образом:
<img src="path/to/foo.png" data-altsrc="path/to/bar.png">
Проблема в том, что dce, который я использую, выполняет итерацию "изображений" следующим образом:
<f:for each="{dce:fal(field:'image', contentObject:contentObject)}" as="fileReference">
<f:image src="{fileReference.uid}" treatIdAsReference="1" />
</f:for>
Поэтому, если бы я вставил несколько изображений в это, у меня нет реальной связи между изображениями, где я знаю, какой из них является нормальным источником, а какой - альтернативным источником.
Таким образом, появилась возможность создать раздел и добавить два поля для изображений, которые мы можем ограничить одним изображением на поле. Но опять-таки есть цикл for, который не позволяет мне получить доступ к источнику второго изображения для первого изображения.
Должно быть видимое отношение между этими изображениями для пользователя, который работает с dce.
Я пытаюсь достичь чего-то вроде этого:
<f:for each="{field.images}" as="images">
<!-- want to achieve something like this -->
<f:image image="{images.foo.src}" data-altsrc="{images.bar.src}">
<!-- thats the normal way iterating through images -->
<f:for each="{images.foo}" as="image">
<f:image image="{image}" />
</f:for>
</f:for>
Другая идея состояла бы в том, чтобы сначала выполнить итерации по альтернативным изображениям и сохранить их в массиве и на основных изображениях, чтобы получить к ним доступ, но я понятия не имею, возможно ли это, и это ограничит удобство использования dce для пользователя.
Есть ли способ достичь этого с помощью жидкости?
заранее спасибо
2 ответа
Ну, я думаю, вы могли бы расширить таблицу sys_file_reference, чтобы добавить отношение оттуда. Таким образом, у вас были бы вложенные отношения (никогда не делайте этого, поэтому вам придется попробовать).
Вы также должны добавить поле к типу tca в нужном вам месте, что может быть немного сложнее. Посмотрите на переопределения типов Tca.
Вы можете расширить таблицу sys_file_reference с помощью поля "alternative_reference" и добавить необходимые настройки TCA. Затем вам нужно будет извлечь FileReferences через FileRepository и использовать sys_file_reference в качестве внешней таблицы (и, конечно, sys_file_reference uid в качестве идентификатора).
FileRepository::findByRelation(
'sys_file_reference',
'alternative_reference',
$uidOfActualSysFileReferenceRecord
);
Другой возможностью будет совершенно новая запись с двумя различными отношениями sys_file_reference. Эта запись (например, tx_ext_domain_model_imageset) будет иметь поля image_default и image_alternate, оба будут настроены как file_relations. Это будет работать наверняка.
$defaultImages = FileRepository::findByRelation(
'tx_ext_domain_model_imageset',
'image_default',
$uidOfRecord
);
$alternativeImages = FileRepository::findByRelation(
'tx_ext_domain_model_imageset',
'image_alternative',
$uidOfRecord
);
Я предполагаю, что у вас есть знания о создании записей, моделей, TCA и так далее.
Лично я предпочел бы второй способ, он более чистый и не меняет структуры таблицы ядра.
Также есть второе окно просмотра изображений, которое может лучше удовлетворить ваши потребности.
<img src="{f:uri.image()}" data-altsrc="{f:uri.image()}" />
Но лучший способ - написать собственный ViewHelper для этой цели. Вы можете передать свой Object (ImageSet) в качестве параметра и обработать всю логику там. Таким образом, ваш шаблон будет проще и проще для чтения / работы.
Вы должны использовать атрибут данных Fluid Viewhelper, а затем получить URI изображения с помощью встроенного вызова. Вот как это сделать:
<f:image src="{fileReference.uid}" data="{altsrc: '{f:uri.image(src: \'{fileReference.uid}\', treatIdAsReference: 1}" treatIdAsReference="1"/>
Это должно сделать работу.