TYPO3 Fluid resource.record.fal

С помощью vhs viewhelper "resource.record.fal" я выбираю изображение на странице ресурсов. Это работает очень хорошо, но я также хочу наследовать изображение, если нет другого загруженного изображения. Есть способ сделать это? Атрибут слайда недоступен для этого помощника вида. Я знаю, что могу сделать все это только с Typoscript, но я хочу найти решение на основе Fluid.

Вот мой код:

<v:resource.record.fal table="pages" field="media" uid="{data.uid}" as="resources" >
<f:for each="{resources}" as="resource">
    <v:resource.image identifier="{resource.id}" />
</f:for>

2 ответа

Хорошо, вот небольшой встроенный синтаксис Fluid:

{v:page.rootLine()
    -> v:iterator.column(columnKey: 'media', indexKey: 'uid')
    -> v:iterator.filter(preserveKeys: 1)
    -> v:iterator.keys()
    -> v:iterator.last()
    -> f:variable(name: 'firstPageUidWithMedia')}

По шагам:

  1. Извлечь корневую строку страницы
  2. Извлечь подмассив всех media значения столбца, используйте столбец uid как ключи
  3. Фильтруйте это, чтобы удалить все пустые значения, но сохранить ключи
  4. Извлечь подмассив только ключей
  5. Выберите последний ключ, который является реальным UID страницы, который мы хотим
  6. Присвойте это переменной

Затем используйте {firstPageUidWithMedia} вместо {data.uid},

Я работаю над обновлением Typo3 с 6.2 до 9.5 LTS, я обнаружил, что FluxContent больше будет использоваться, теперь ниже код, используемый для предварительного просмотра изображения в содержимом Flux.

Я заменил свой старый код:

<f:for each="{v:content.resources.fal(field: 'teaserImage')}" as="image">
    <img src="{f:uri.image(src:'{image.id}',maxWidth:'64',treatIdAsReference:'1')}" alt="{image.alternative}"/>
</f:for>

К ниже новому коду:

 <v:content.resources.fal field="teaserImage" as="images" record="{record}">
        <f:for each="{images}" as="image">
            <f:if condition="{image}">
                <f:image src="{image.id}" treatIdAsReference="1" maxWidth="100"/>
            </f:if>
        </f:for>
 </v:content.resources.fal>

Я разработал этот VH, который делает то, что вам нужно:

namespace Your\Vendor\ViewHelpers;

/*
 * This file is part of the TYPO3 CMS project.
 *
 * It is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License, either version 2
 * of the License, or any later version.
 *
 * For the full copyright and license information, please read the
 * LICENSE.txt file that was distributed with this source code.
 *
 * The TYPO3 project - inspiring people to share!
 */

use TYPO3\CMS\Core\Resource\File;
use TYPO3\CMS\Core\Resource\FileReference;
use TYPO3\CMS\Core\Resource\FileRepository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Utility\DebuggerUtility;
use TYPO3\CMS\Frontend\Page\PageRepository;
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;

/**
 * View helper to get the first image of rootline.
 */
class RootlineFirstImageViewHelper extends AbstractViewHelper
{
    use CompileWithRenderStatic;

    /**
     * {@inheritdoc}
     */
    public function initializeArguments()
    {
        $this->registerArgument('pid', 'int', '', true);
    }

    /**
     * {@inheritdoc}
     */
    public static function renderStatic(
        array $arguments,
        \Closure $renderChildrenClosure,
        RenderingContextInterface $renderingContext
    ): ?File {
        $fileRepository = GeneralUtility::makeInstance(FileRepository::class);
        $pages = GeneralUtility::makeInstance(PageRepository::class)->getRootLine($arguments['pid']);
        $files = [];
        foreach ($pages as $page) {
            /** @var FileReference[] $files */
            $files = $fileRepository->findByRelation('pages', 'media', $page['uid']);
            if (!empty($files)) {
                break;
            }
        }

        // It would be nice to have an extra argument to get a random image of the array.
        return !empty($files) ? $files[0]->getOriginalFile() : null;
    }
}

Затем вы можете назвать это так в своем шаблоне Fluid:

<f:variable name="rootlineFirstImage"><whatever:rootlineFirstImage pid="{data.uid}"/></f:variable>
<f:if condition="{rootlineFirstImage}">
    <f:image image="{rootlineFirstImage}" width="1280"/>
</f:if>
Другие вопросы по тегам