Планировщик TYPO3 v9 не сохраняет данные

#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();
}