Изменение размера изображения в пользовательском ViewHelper

#typo3 #fluid

#typo3 #жидкость

Вопрос:

У меня есть ViewHelper, который обрабатывает некоторые изображения. У меня есть путь к изображению к исходному файлу. Мне нужно изменить размер этого изображения.

Есть ли PHP-код, который я могу использовать в TYPO3 для этого?

Я пробовал это:

 $imgPath = 'img/path/from_database.jpg
$imgConf = array();
$imgConf['file'] = $imgPath;
$imgConf['altText'] = "Sample alt text.";
$image = $this->cObj->IMAGE($imgConf);
 

но я получаю это исключение: "Call to a member function IMAGE() on null"

Мой ViewHelper наследует от: TYPO3CMSFluidCoreViewHelperAbstractViewHelper

Комментарии:

1. Я предполагаю, что это поле media таблицы pages , правильно? Вы могли бы рассмотреть возможность использования доступного <f:image> view-helper… Вызывается ли компонент view из контекста Extbase или с помощью какого-либо TypoScript FLUIDTEMPLATE ?

2. @OliverHader извините, код был вставлен с другого веб-сайта, я отредактировал его, чтобы он более точно соответствовал моему коду, но это не влияет на эту проблему. Этот ViewHelper вызывается внутри шаблона Fluid, размещенного в том же расширении (что и расширение ViewHelper), поэтому я предполагаю, что это контекст Extbase. Я хотел бы использовать <f:image>, но я не знаю, как использовать его в коде PHP?

Ответ №1:

Прежде всего, вы должны указать, какую версию TYPO3 вы используете, и использует ли ваше расширение Extbase или старый код на основе pibased.

Я предполагаю, что это Extbase, поскольку вы наследуете от viewhelper с пространством имен. Мой совет — взглянуть на исходный f:image код viewhelper ( TYPO3CMSFluidViewHelpersImageViewHelper ) и скопировать то, что вам нужно.

сначала добавьте это в верхнюю часть вашего viewhelper:

 /**
 * @var TYPO3CMSExtbaseServiceImageService
 * @inject
 */
protected $imageService;
 

Затем код в вашем методе

 $image = $this->imageService->getImage($imgPath);

// you have to set these variables or remove if you don't need them
$processingInstructions = array(
    'width' => $width,
    'height' => $height,
    'minWidth' => $minWidth,
    'minHeight' => $minHeight,
    'maxWidth' => $maxWidth,
    'maxHeight' => $maxHeight,
    'crop' => $crop,
);
$processedImage = $this->imageService->applyProcessingInstructions($image, $processingInstructions);
$imageUri = $this->imageService->getImageUri($processedImage);
 

$imageUri теперь содержит путь к измененному размеру изображения.

PS: Скопированный вами пример взят из старой системы на базе pibased, которая больше не существует со времен ветки 7.x.

Комментарии:

1. Спасибо, это отлично работает. Единственная проблема заключалась в том, что внедрение зависимостей в моем случае не сработало — я очистил кэш (папку кэша и значок кэша в фоновом режиме) и заменил CR LF на LF — не помогло. Из-за этого мне пришлось получить этот объект таким образом TYPO3CMSCoreUtilityGeneralUtility::makeInstance("TYPO3\CMS\Extbase\Service\ImageService") .

2. Спасибо, мне пришлось предоставить 3 аргумента getImage функции $image = $this->imageService->getImage($filename, null, false); , используя TYPO3 8.7. Я тоже столкнулся с проблемой инъекции Алана. Решение для меня было Dump Autoload Information в инструменте установки.

3. Вам всегда нужно обновлять файлы автозагрузки при создании нового класса. Вы можете использовать его либо с «Сбросом информации о автозагрузке», либо просто удалить файлы внутри typo3temp/autoload