You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:TYPO3 12在调度任务/CLI环境渲染内容元素的可行方案

TYPO3 v12 CLI/调度任务中渲染text+image内容元素示例

以下是可直接运行的代码示例,用于在CLI或调度任务环境中渲染text+image类型的内容元素(基于fluid_styled_content),并用于邮件发送:

关键说明

CLI/调度任务环境默认缺少前端上下文,必须手动初始化以下核心组件:

  • Site对象与语言上下文
  • 前端用户模拟
  • ContentObjectRenderer并绑定站点配置
  • 加载fluid_styled_content对应的TypoScript配置

调度任务实现代码

创建一个调度任务类,替换命名空间为你的扩展信息:

<?php

namespace Vendor\YourExtension\Task;

use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Context\LanguageAspectFactory;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
use TYPO3\CMS\Scheduler\Task\AbstractTask;

class RenderContentForEmailTask extends AbstractTask
{
    // 调度任务配置时可指定要渲染的内容元素UID
    public int $contentElementUid = 0;

    public function execute(): bool
    {
        if ($this->contentElementUid === 0) {
            return false;
        }

        // 1. 获取站点对象(此处取第一个站点,可根据需求指定站点ID)
        $siteFinder = GeneralUtility::makeInstance(SiteFinder::class);
        $site = $siteFinder->getFirstSite();
        $languageId = 0; // 对应站点的语言ID,按需调整

        // 2. 初始化语言上下文
        $context = GeneralUtility::makeInstance(Context::class);
        $languageAspect = LanguageAspectFactory::createFromSiteLanguage($site->getLanguageById($languageId));
        $context->setAspect('language', $languageAspect);

        // 3. 模拟前端用户(CLI无默认前端用户上下文)
        $frontendUser = GeneralUtility::makeInstance(FrontendUserAuthentication::class);
        $frontendUser->start();
        $GLOBALS['TSFE'] = new \stdClass();
        $GLOBALS['TSFE']->fe_user = $frontendUser;
        $GLOBALS['TSFE']->id = $site->getRootPageId();
        $GLOBALS['TSFE']->site = $site;
        $GLOBALS['TSFE']->sys_language_uid = $languageId;

        // 4. 初始化ContentObjectRenderer并绑定站点/语言
        $cObj = GeneralUtility::makeInstance(ContentObjectRenderer::class);
        $cObj->start([], 'tt_content');
        $cObj->setSite($site);
        $cObj->setLanguage($site->getLanguageById($languageId));
        $GLOBALS['TSFE']->cObj = $cObj;

        // 5. 加载TypoScript配置(确保fluid_styled_content规则被加载)
        $GLOBALS['TSFE']->initTemplate();
        $GLOBALS['TSFE']->getConfigArray();

        // 6. 获取目标内容元素记录
        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content');
        $contentRecord = $queryBuilder
            ->select('*')
            ->from('tt_content')
            ->where($queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($this->contentElementUid, \PDO::PARAM_INT)))
            ->executeQuery()
            ->fetchAssociative();

        if (!$contentRecord) {
            return false;
        }

        // 7. 渲染内容元素
        $renderedContent = $cObj->cObjGetSingle('RECORDS', [
            'tables' => 'tt_content',
            'source' => $this->contentElementUid,
            'dontCheckPid' => 1, // 若内容元素不在站点根页面,必须开启此参数
        ]);

        // 8. 发送邮件示例(替换为你的实际邮件逻辑)
        $mailer = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Mail\Mailer::class);
        $email = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Mail\FluidEmail::class);
        $email->setSubject('渲染的Text+Image内容')
            ->setTo(['recipient@example.com' => '收件人'])
            ->setFrom(['sender@example.com' => '发件人'])
            ->setHtml($renderedContent);

        $mailer->send($email);

        return true;
    }
}

配置与注意事项

  1. 将上述代码放入你的扩展的Classes/Task目录下
  2. 在ext_localconf.php中注册调度任务:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\Vendor\YourExtension\Task\RenderContentForEmailTask::class] = [
    'extension' => 'your_extension_key',
    'title' => '渲染内容元素并发送邮件',
    'description' => '从CLI/调度任务渲染text+image内容元素,发送到指定邮箱',
    'additionalFields' => \TYPO3\CMS\Scheduler\AdditionalFieldProvider\IntegerAdditionalFieldProvider::class,
];
  1. 进入TYPO3后端的系统 > 调度任务,新建任务,选择你注册的任务类型,填写内容元素UID
  2. 确保内容元素的权限设置允许前端用户访问(调度任务使用的是匿名前端用户,若内容元素有访问限制,需调整用户组权限)
  3. 若站点使用多语言,修改languageId参数为对应语言的ID

内容的提问来源于stack exchange,提问作者Yana Okkulata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:24:52