在Backend中保存记录时我正在使用TCEmainHook processDatamap_preProcessFieldArray。我根据此记录中的其他字段创建,更改和删除内联记录。一切都按预期工作,但删除内联记录仍然存在错误/警告,即使作业执行正确。错误发生在TYPO3 7和8中。
详细信息:对于我删除的每个内联记录,我收到以下Flash消息(在TYPO3 7中,它只在sys_log中写入):
未经许可,尝试修改记录'foo bar'(tx_datednews_domain_model_newsrecurrence:527)。或者不存在的页面。
在TYPO3 8中我可以将问题跟到typo3 / sysext / core / Classes / DataHandling / DataHandler.php方法:recordInfoWithPermissionCheck。 添加了删除限制。当我删除它,一切都很好。这引出了我的想法,即记录已被删除,因此它无法再找到记录。但我不会删除它两次。
但正如我上面提到的,最后删除此内联记录已完美执行。
这些可能是相关的代码段:
通过以下方式删除/删除内联记录。切换这两行并没有帮助。当我重新打开新闻并且没有从新闻记录中删除oldRec或删除但未删除时,仅使用其中一个会导致致命错误。所以我确定我需要做两个步骤。
$this->newsRecurrenceRepository->remove($oldRec);
$news->removeNewsRecurrence($oldRec);
tx_datednews_domain_model_newsrecurrence的TCA:
return [
'ctrl' => [
'title' => 'LLL:EXT:dated_news/Resources/Private/Language/locallang_db.xlf:tx_datednews_domain_model_newsrecurrence',
'label' => 'eventstart',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
'cruser_id' => 'cruser_id',
'default_sortby' => 'eventstart',
'versioningWS' => true,
'languageField' => 'sys_language_uid',
'transOrigPointerField' => 'l10n_parent',
'transOrigDiffSourceField' => 'l10n_diffsource',
'delete' => 'deleted',
...
内联元素的TCA:
'newsrecurrence' => [
'config' => [
'type' => 'inline',
'foreign_table' => 'tx_datednews_domain_model_newsrecurrence',
'MM' => 'tx_datednews_news_newsrecurrence_mm',
'foreign_field' => 'parent_event',
'foreign_default_sortby' => 'eventstart DESC',
'maxitems' => 9999,
'appearance' => [
'collapseAll' => 1,
'levelLinksPosition' => 'top',
'showSynchronizationLink' => 1,
'showPossibleLocalizationRecords' => 1,
'useSortable' => 0,
'showAllLocalizationLink' => 1,
'enabledControls' => [
'info' => true,
'new' => false,
'dragdrop' => true,
'sort' => false,
'hide' => true,
'delete' => false,
'localize' => true,
],
],
],
]
newsRecurrenceRepository中的Defaul QuerySettings:
$this->defaultQuerySettings = $this->objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Typo3QuerySettings');
$this->defaultQuerySettings->setIgnoreEnableFields(true);
$this->defaultQuerySettings->setEnableFieldsToBeIgnored(['hidden', 'deleted']);
$this->defaultQuerySettings->setRespectStoragePage(FALSE);
理解警告出现的原因以及如何摆脱它将会非常棒。
答案 0 :(得分:0)
解决方法是,使用钩子中可用的DataHandler对象作为$ pObj。
因此,使用存储库删除记录,需要使用DataHandler删除它。我替换了
行$this->newsRecurrenceRepository->remove($oldRec);
使用这段代码:
$cmd = [];
$cmd['tx_datednews_domain_model_newsrecurrence'][$oldRec->getUid()]['delete'] = true;
$pObj->start([], $cmd);
$pObj->process_cmdmap();