I'm writing a TYPO3 extension using TYPO3 CMS 6.2.x LTS and Extension Builder. The extension should be importing a CSV file into a domain model and populating two more models during import.
The CSV file imports okay, but a following controller method is crashing, and I'm having trouble solving the problem. I believe that the problem source may be hidden in the fact that my plugin calls the first method, but then each method goes directly to the next method. Extbase documentation leads me to believe forward()
will not return to the calling method, and I need to return to the original method to continue processing more import records.
My plugin URI activates ImportMemberController->importAction()
. ImportMemberController->importAction()
passes a $newPerson
object and a $parameters
array to PersonController->enrollAction()
okay. PersonController->enrollAction()
passes $person
, $role
, $startTime
, and $stopTime
objects to HasRoleController->commissionAction()
okay. HasRoleController->commissionAction()
crashes on the final persistAll()
line with the following message.
Fatal error: Call to a member function persistAll() on null in typo3conf\ext\myextension\Classes\Controller\HasRoleController.php on line 157
Configurations including TCA are generally intact from when they were built by Extension Builder.
Here is some of the extension's code. My apologies for the length.
<?php
namespace MyNameSpace\Myextension\Controller;
/**
* ImportMemberController
*/
class ImportMemberController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
/**
* importMemberRepository
*
* @var \MyNameSpace\Myextension\Domain\Repository\ImportMemberRepository
* @inject
*/
protected $importMemberRepository = NULL;
/**
* personRepository
*
* @var \MyNameSpace\Myextension\Domain\Repository\PersonRepository
* @inject
*/
protected $personRepository = NULL;
/**
* @var \TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager
* @inject
*/
protected $persistenceManager;
/**
* action import
*
* @return void
*/
public function importAction() {
$importMembers = $this->importMemberRepository->findAll();
foreach ($importMembers as $importMember) {
// Assess the qualification of this import person.
$newQualification = TRUE;
if ($importMember->getEmail() == "") {
$newQualification = FALSE;
}
elseif ($importMember->getFirstName() == "") {
$newQualification = FALSE;
}
elseif ($importMember->getLastName() == "") {
$newQualification = FALSE;
}
// Determine whether this person is already in the personRepository.
$queryResult = $this->personRepository->findBySomeNumber($importMember->getSomeNumber());
if ($queryResult->count() > 0) {
$person = $queryResult->getFirst();
// Update changes to an existing person's specified properties.
if ($person->getFamilyName() != $importMember->getLastName()) {
$person->setFamilyName($importMember->getLastName());
}
if ($person->getFirstName() != $importMember->getFirstName()) {
$person->setFirstName($importMember->getFirstName());
}
if ($person->getEmailAddress() != $importMember->getEmail()) {
$person->setEmailAddress($importMember->getEmail());
}
$this->personRepository->update($person);
// Obtain the qualification status of this existing person.
$existingQualification = $person->getQualifiedUser();
// Disenroll this existing person if they no longer qualify.
if ($existingQualification && !$newQualification) {
$person->setQualifiedUser(FALSE);
}
// Else enroll this existing person if they qualify after being unqualified.
elseif (!$existingQualification && $newQualification) {
$person->setQualifiedUser(TRUE); // @todo: Reevaluate the need for this instruction.
}
// Else act if this existing person qualifies but changed Office.
elseif ($existingQualification && $newQualification && 2==1) {
// @todo: Later.
}
}
else {
// Act if this new import person qualifies.
if ($newQualification) {
// Enter this new import person into personRepository.
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$newPerson = $objectManager->get('MyNameSpace\\Myextension\\Domain\\Model\\Person');
$newPerson->setFamilyName($importMember->getLastName());
$newPerson->setFirstName($importMember->getFirstName());
$newPerson->setSomeNumber($importMember->getSomeNumber());
$newPerson->setEmailAddress($importMember->getEmail());
$this->personRepository->add($newPerson);
$this->persistenceManager->persistAll();
// Enroll this new import person.
if ($importMember->getDate()) {
$startTime = $importMember->getDate();
}
else {
$startTime = new \DateTime();
}
if ($importMember->getPaidThru()) {
$stopTime = $importMember->getPaidThru();
}
else {
$stopTime = new \DateTime();
$stopTime->modify('+100 years');
}
$parameters = array(
'title' => ' Office '.$importMember->getOffice().' Member',
'startTime' => $startTime,
'stopTime' => $stopTime
);
$newPersonController = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('MyNameSpace\\Myextension\\Controller\\PersonController');
$newPersonController->enrollAction($newPerson, $parameters);
}
}
}
$this->redirect('list');
}
}
<?php
namespace MyNameSpace\Myextension\Controller;
/**
* PersonController
*/
class PersonController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
/**
* personRepository
*
* @var \MyNameSpace\Myextension\Domain\Repository\PersonRepository
* @inject
*/
protected $personRepository = NULL;
/**
* roleRepository
*
* @var \MyNameSpace\Myextension\Domain\Repository\RoleRepository
* @inject
*/
protected $roleRepository = NULL;
/**
* action enroll
*
* @param \MyNameSpace\Myextension\Domain\Model\Person $person
* @param mixed[] $parameters
* @return void
*/
public function enrollAction(\MyNameSpace\Myextension\Domain\Model\Person $person,
$parameters) {
$person->setQualifiedUser(TRUE);
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$this->roleRepository = $objectManager->get('MyNameSpace\\Myextension\\Domain\\Repository\\RoleRepository');
if ($parameters['title']) {
$queryResult = $this->roleRepository->findByTitle($parameters['title']);
if ($queryResult->count() > 0) {
$role = $queryResult->getFirst();
if ($parameters['startTime']) {
$startTime = $parameters['startTime'];
} else {
$startTime = new \DateTime();
}
if ($parameters['stopTime']) {
$stopTime = $parameters['stopTime'];
} else {
$stopTime = new \DateTime();
$stopTime->modify('+100 years');
}
$newHasRoleController = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('MyNameSpace\\Myextension\\Controller\\HasRoleController');
$newHasRoleController->commissionAction($person, $role, $startTime, $stopTime);
}
}
}
}
<?php
namespace MyNameSpace\Myextension\Controller;
/**
* HasRoleController
*/
class HasRoleController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
/**
* hasRoleRepository
*
* @var \MyNameSpace\Myextension\Domain\Repository\HasRoleRepository
* @inject
*/
protected $hasRoleRepository = NULL;
/**
* @var \TYPO3\CMS\Extbase\Object\ObjectManager
* @inject
*/
protected $objectManager;
/**
* persistence manager
*
* @var \TYPO3\CMS\Extbase\Persistence\PersistenceManagerInterface
* @inject
*/
protected $persistenceManager;
/**
* action commission
*
* @param \MyNameSpace\Myextension\Domain\Model\Person $person
* @param \MyNameSpace\Myextension\Domain\Model\Role $role
* @param \DateTime $startTime
* @param \DateTime $stopTime
* @return void
*/
public function commissionAction(\MyNameSpace\Myextension\Domain\Model\Person $person,
\MyNameSpace\Myextension\Domain\Model\Role $role,
$startTime, $stopTime) {
//$newHasRole = new \MyNameSpace\Myextension\Domain\Model\HasRole(); // @todo: Remove this line.
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$objectManager->get(\TYPO3\CMS\Extbase\Mvc\Controller\Arguments::class);
$newHasRole = $objectManager->get('MyNameSpace\\Myextension\\Domain\\Model\\HasRole');
//$newHasRole = $this->objectManager->get('MyNameSpace\\Myextension\\Domain\\Model\\HasRole');
$newHasRole->setStartTime($startTime);
$newHasRole->setStopTime($stopTime);
$newHasRole->addPerson($person);
//$newHasRole->setPerson($person); // @todo: Remove this line.
$newHasRole->addRole($role);
//$newHasRole->setRole($person); // @todo: Remove this line.
$this->hasRoleRepository = $objectManager->get('MyNameSpace\\Myextension\\Domain\\Repository\\HasRoleRepository');
//$this->hasRoleRepository = $this->objectManager->get('MyNameSpace\\Myextension\\Domain\\Repository\\HasRoleRepository');
$this->hasRoleRepository->add($newHasRole);
$this->persistenceManager->persistAll();
}
}
At the crash point, the variables in local scope are:
$newHasRole = object(MyNameSpace\Myextension\Domain\Model\HasRole)
protected 'startTime' =>
object(DateTime)[834]
public 'date' => string '1993-11-29 19:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'America/New_York' (length=16)
protected 'stopTime' =>
object(DateTime)[982]
public 'date' => string '2116-03-10 17:55:43.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'America/New_York' (length=16)
protected 'person' =>
object(TYPO3\CMS\Extbase\Persistence\ObjectStorage)[1008]
private 'warning' => string 'You should never see this warning. If you do, you probably used PHP array functions like current() on the TYPO3\CMS\Extbase\Persistence\ObjectStorage. To retrieve the first result, you can use the rewind() and current() methods.' (length=228)
protected 'storage' =>
array (size=1)
'000000007303096700000000080231e7' =>
array (size=2)
...
protected 'isModified' => boolean true
protected 'addedObjectsPositions' =>
array (size=1)
'000000007303096700000000080231e7' => int 1
protected 'removedObjectsPositions' =>
array (size=0)
empty
protected 'positionCounter' => int 1
protected 'role' =>
object(TYPO3\CMS\Extbase\Persistence\ObjectStorage)[1045]
private 'warning' => string 'You should never see this warning. If you do, you probably used PHP array functions like current() on the TYPO3\CMS\Extbase\Persistence\ObjectStorage. To retrieve the first result, you can use the rewind() and current() methods.' (length=228)
protected 'storage' =>
array (size=1)
'0000000073030eea00000000080231e7' =>
array (size=2)
...
protected 'isModified' => boolean true
protected 'addedObjectsPositions' =>
array (size=1)
'0000000073030eea00000000080231e7' => int 1
protected 'removedObjectsPositions' =>
array (size=0)
empty
protected 'positionCounter' => int 1
protected 'uid' => null
protected '_localizedUid' => null
protected '_languageUid' => null
protected '_versionedUid' => null
protected 'pid' => null
private '_isClone' (TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject) => boolean false
private '_cleanProperties' (TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject) =>
array (size=0)
empty
$objectManager = object(TYPO3\CMS\Extbase\Object\ObjectManager)
$person = object(KeystoneResearchSolutions\Grouprole\Domain\Model\Person)
$role = object(KeystoneResearchSolutions\Grouprole\Domain\Model\Role)
$startTime = object(DateTime)
$stopTime = object(DateTime)