首页 > 解决方案 > 使用命令控制器添加的 MM 关系未显示在后端字段中

问题描述

我在通过 TYPO3 中的命令控制器添加 mm 关系时遇到了一些问题。

我试图将页面的作者字段(通常是一个 varchar 字段以填充字符串)迁移到 fe_users 的 mm 关系。在我的数据库中,正确添加了 mm 关系,但在后端,所选的 fe_users 未显示在作者字段中。

我尝试通过命令控制器中的数据处理程序脚本添加它们(我之前也尝试使用查询生成器添加它们,但同样的问题):

/**
 * @var array
 */
protected $mappingUsers = [
    'Max Mustermann' => 2,
    'Miri Musterfrau' => 5
];

public function execute(InputInterface $input, OutputInterface $output)
{
    /** @var ConnectionPool $connectionPool */
    $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);

    /** @var QueryBuilder $queryBuilderPages */
    $queryBuilderPages = $connectionPool->getQueryBuilderForTable('pages');

    /** @var QueryBuilder $queryBuilderAuthor */
    $queryBuilderAuthor = $connectionPool->getQueryBuilderForTable('tx_project_pages_author_mm');

    $pages = $queryBuilderPages
        ->from('pages')
        ->select('*')
        ->execute()
        ->fetchAll();

    /** @var DataHandler $dataHandler */
    $dataHandler = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\DataHandling\DataHandler::class);
    $data = [];

    foreach ($pages as $page) {
        if ($page['author']) {
            foreach ($this->mappingUsers as $key => $value) {
                if ($page['author'] === $key) {
                    $data = [
                        'pages' => [
                            $page['uid'] => [
                                'author' => $value,
                                'tstamp' => time(),
                            ]
                        ],
                        'tx_project_pages_author_mm' => [
                            str_replace(' ', '', 'NEW' . microtime() . rand()) => [
                                'uid_local' => $page['uid'],
                                'uid_foreign' => $value
                            ]
                        ]
                    ];

                    $dataHandler->start($data, []);
                    $dataHandler->process_datamap();

                    unset($data);
                }
            }
        }
    }

    $queryBuilderPages
        ->update('pages')
        ->where(
            $queryBuilderPages->expr()->eq('author', "''"),
        )
        ->set('author', 0)
        ->execute();

    return 0;
}

通过命令控制器添加 mm 关系后还有什么可做的吗?

标签: typo3typo3-10.xdatahandler

解决方案


一般来说,上面的脚本有效。只是数据库结构中出现了错误。

但是建议实现后端用户身份验证,以便能够在运行命令后删除缓存,例如:

    public function execute(InputInterface $input, OutputInterface $output)
    {
        Bootstrap::initializeBackendAuthentication();

推荐阅读