求助: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; } }
配置与注意事项
- 将上述代码放入你的扩展的
Classes/Task目录下 - 在
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, ];
- 进入TYPO3后端的系统 > 调度任务,新建任务,选择你注册的任务类型,填写内容元素UID
- 确保内容元素的权限设置允许前端用户访问(调度任务使用的是匿名前端用户,若内容元素有访问限制,需调整用户组权限)
- 若站点使用多语言,修改
languageId参数为对应语言的ID
内容的提问来源于stack exchange,提问作者Yana Okkulata
相关产品推荐
相关产品推荐

