#typo3 #task #scheduler #typo3-9.x
#typo3 #задача #планировщик #typo3-9.x
Вопрос:
У меня есть функция, которая загружает данные из файла JSON и вводит их в базу данных TYPO3. Если я вызываю эту функцию через внутренний контроллер ( indexAction
), тогда все работает нормально. Однако, когда я вызываю его из задачи, данные не сохраняются. С помощью тестового вывода я вижу, что объект был изменен правильно, только Update
or Add
выполняется неправильно, потому что данные в базе данных не изменены.
Вот моя функция контроллера:
class ImportController extends TYPO3CMSExtbaseMvcControllerActionController
{
protected $siteRepository = null;
public function injectSiteRepository(SiteRepository $siteRepository)
{
$this->siteRepository = $siteRepository;
}
public function indexAction()
{
$this->dataImport();
}
public function dataImport() {
$file = "test.json";
$json = file_get_contents($file);
$jsonarray = json_decode($json);
foreach ($jsonarray->{'sites'} as $site) {
$newValue = false;
$dbSite = $this->siteRepository->getSiteByID($site->{'ID'});
if (empty($dbSite->getFirst())) {
$dbSite = TYPO3CMSCoreUtilityGeneralUtility::makeInstance('testtest123DomainModelSite');
$dbSite->setID($site->{'ID'});
$newValue = true;
} else {
$dbSite = $dbSite->getFirst();
}
//Set Data
$dbSite->setTest($site->{'TEST'});
//This object is correct, even in the Task
DebuggerUtility::var_dump(
$dbSite
);
//Update or Add new Data
if (!$newValue) {
$this->siteRepository->update($dbSite);
} else {
$this->siteRepository->add($dbSite);
}
}
$persistenceManager = TYPO3CMSCoreUtilityGeneralUtility::makeInstance('TYPO3CMSExtbasePersistenceGenericPersistenceManager');
$persistenceManager->persistAll();
return true;
}
}
Вот моя задача:
class JsonImportTask extends AbstractTask {
public function execute() {
$objectManager = GeneralUtility::makeInstance(
ObjectManager::class
);
$controller = $objectManager->get(ImportController::class);
$controller->dataImport();
return true;
}
}
Вот мой репозиторий:
public function getSiteByID($id) {
$query = $this->createQuery();
$query->matching(
$query->equals("uid", $id),
);
return $query->execute();
}
У кого-нибудь есть идея, что это может быть?
Ответ №1:
Хорошо, я сам нашел свою ошибку. Вот решение для всех, у кого такая же проблема:
Я добавил setRespectStoragePage
свою getSiteByID
функцию в SiteRepository:
$query->getQuerySettings()->setRespectStoragePage(false);
Ошибка заключалась в том, что он искал данные в StoragePid
1. С помощью этой команды он выполняет поиск в нужном месте
Вот моя правильная функция репозитория:
public function getSiteByID($id) {
$query = $this->createQuery();
$query->getQuerySettings()->setRespectStoragePage(false);
$query->matching(
$query->equals("uid", $id),
);
return $query->execute();
}
У меня была другая проблема. Вы должны установить номер PID для новых записей.
Например, мои данные хранятся на странице с идентификатором 12.
Я добавил эту строку здесь:
if (empty($dbSite->getFirst())) {
$dbSite = TYPO3CMSCoreUtilityGeneralUtility::makeInstance('testtest123DomainModelSite');
$dbSite->setID($site->{'ID'});
$newValue = true;
$dbSite->setPid(12); //New Line set PID (For me to PID 12)
} else {
$dbSite = $dbSite->getFirst();
}