添加了命令控制器的 MM 关系未在后端字段中显示
MM relation which is added with command controller not shown in backend field
我在 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;
}
通过command controller添加mm关系后还有什么要做的吗?
总的来说上面的脚本是有效的。只是数据库结构出错了。
但是建议实施后端用户身份验证,以便能够在 运行 命令后删除缓存例如:
public function execute(InputInterface $input, OutputInterface $output)
{
Bootstrap::initializeBackendAuthentication();
我在 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;
}
通过command controller添加mm关系后还有什么要做的吗?
总的来说上面的脚本是有效的。只是数据库结构出错了。
但是建议实施后端用户身份验证,以便能够在 运行 命令后删除缓存例如:
public function execute(InputInterface $input, OutputInterface $output)
{
Bootstrap::initializeBackendAuthentication();