在CommandController中渲染TypoScript对象

时间:2017-10-05 07:31:53

标签: typo3 extbase

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。

任何人都可以提供帮助或采用不同的方法吗?

2 个答案:

答案 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);
        }
    }
}