tldr: 如何使用CommandController内的GIFBUILDER图像渲染TypoScript COA对象?
我目前正在开发一个电子商务平台,我需要定期导入一个包含产品目录的Excel文件。从excel文件中的一行数据创建产品后,将在目录中搜索与该项目相关的产品图像,并将它们作为FileReferences链接到产品。我编写了一个负责处理的ImportCommandController。
这一切都像魅力一样,唯一明显的问题是图像处理的表现。对产品列表页面的第一次调用需要30秒,这是单个视图的第一个请求。我经常需要从头开始重新创建整个目录,而源产品图像是巨大的文件,我对此没有任何影响。
该目录的产品图像由TypoScript生成,它负责在方形白色背景中拟合这些图像,返回IMG_RESOURCE网址。我使用cObject ViewHelper从Fluid模板中调用TypoScript。
我一直在尝试从ImportCommandController-> importAction调用这一段TypoScript,因此导入cronjob会事先使用相同的文件名哈希来创建这些缩放图像,因此他们可以使用它们。在单个视图调用时已经处理完毕。但我无法做到这一点。
有问题的TypoScript是这样的:
plugin.tx_productfinder_products {
// Productfinder-Produktbilder
// Bilder quadratisch auf weissen Hintergrund einpassen
productimage = COA
productimage {
// Daten der FileReference im Regsiter ablegen
10 = FILES
10 {
references.data = current
renderObj = COA
renderObj {
10 = LOAD_REGISTER
10 {
param = TEXT
param.data = file:current.uid
}
}
}
20 = IMG_RESOURCE
20 {
file = GIFBUILDER
file {
XY = 960,960
format = jpg
quality = 95
backColor = #ffffff
20 = IMAGE
20 {
offset = 960-[20.w]/2,960-[20.h]/2
file {
import.data = current
treatIdAsReference = 1
maxW = 960
maxH = 960
}
}
// // Text aus Daten der FileReference als Wasserzeichen ins Bild rendern
// 30 = TEXT
// 30 {
// //text.data = register:param
// text.data = current
// fontColor= #dddddd
// fontSize = 12
// offset = 20,[20.h]-20
// align = left
// antiAlias = 1
// }
}
}
}
}
我从Fluid模板中调用它们,如下所示:
<img class="img-responsive" src="{f:cObject(typoscriptObjectPath:'plugin.tx_productfinder_products.productpreviewimage', data:'{image.uid}')}">
到目前为止我尝试了什么?几乎所有东西。
我首先尝试直接调用ContentObjectRenderer,
/** @var \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer $cObj */
$contentObject = GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\ContentObject\\ContentObjectRenderer');
$contentObject->setCurrentVal($image->getUid());
$content = $contentObject->cObjGetSingle($this->settings['productimagetest'], $this->settings['productimagetest.']);
导致这些奇怪的错误。
Oops, an error occurred: PHP Warning: imagejpeg(typo3temp/GB/csm_8000424600_cbbd127be3_9cb1d3c8cc.jpg): failed to open stream: No such file or directory in /html/typo3/typo3_src-7.6.16/typo3/sysext/core/Classes/Imaging/GraphicalFunctions.php line 2912
似乎关于Grapics Processing的TYPO3配置没有像前端一样初始化。
接下来,我尝试将一个StandaloneFluidView实例化为每个项目呈现整个SingleItem模板,但我无法弄清楚因为请求和上下文丢失,因此模板中引用的部分不会被渲染。 / p>
然后我厌倦了每个项目创建FrontendUrls并从CommandController请求它们,
/** @var \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer $cObj */
$contentObject = GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\ContentObject\\ContentObjectRenderer');
$test = $contentObject->typolink_URL(array(
'parameter' => 671,
'additionalParams' =>
'&tx_productfinder_products[product]='.$product->getUid().
'&tx_productfinder_products[action]=show'.
'&tx_productfinder_products[controller]=Product',
'returnLast' => 'url'
));
$this->outputLine(print_r($test,true));
但以这种方式生成的网址缺少cHash。
任何人都可以提供帮助或采用不同的方法吗?
答案 0 :(得分:1)
由于这些图像仅为前端输出生成一次,然后无论如何都可用,我不会预先看到生成它们的优势。使用CSS可以很容易地生成白色方块,所以对我来说这甚至看起来都不像是GIFBUILDER的用例。
话虽如此,你仍然可以做的事情:既然你已经在PHP环境中,为什么不直接实现GIFBUILDER或使用甚至纯IM / GM命令而不是去IMG_RESOURCE实际上是要在前端输出吗?
答案 1 :(得分:0)
我知道这是一个古老的问题,但是我遇到了同样的问题,不得不花一些时间来调试它,所以也许这个答案对将来的其他人很有用。
CLI使用的工作目录与前端不同,因此无法解析typo3temp/
类中使用的GifBuilder
目录的相对路径,这将导致上述警告。
要修复相对路径分辨率,必须将工作目录更改为前端目录,这可以通过以下方式实现:
class AcmeCommand extends Command
{
protected static $cwdBackup;
protected function execute(InputInterface $input, OutputInterface $output)
{
if (Environment::isCli()) {
static::$cwdBackup = getcwd();
chdir(Environment::getPublicPath());
}
//
if (Environment::isCli()) {
chdir(static::$cwdBackup);
}
}
}