Spaces:
No application file
No application file
namespace Mautic\FormBundle\DataFixtures\ORM; | |
use Doctrine\Common\DataFixtures\AbstractFixture; | |
use Doctrine\Common\DataFixtures\OrderedFixtureInterface; | |
use Doctrine\Persistence\ObjectManager; | |
use Mautic\CoreBundle\Doctrine\Common\DataFixtures\Event\PreExecuteEvent; | |
use Mautic\CoreBundle\Helper\CsvHelper; | |
use Mautic\CoreBundle\Helper\Serializer; | |
use Mautic\FormBundle\Entity\Action; | |
use Mautic\FormBundle\Entity\Field; | |
use Mautic\FormBundle\Entity\Form; | |
use Mautic\FormBundle\Model\ActionModel; | |
use Mautic\FormBundle\Model\FieldModel; | |
use Mautic\FormBundle\Model\FormModel; | |
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
class LoadFormData extends AbstractFixture implements OrderedFixtureInterface | |
{ | |
public const FORM_PREFIX = 'form-'; | |
/** | |
* @var array<int, Form> | |
*/ | |
private array $formEntities = []; | |
/** | |
* @var array<int, Field> | |
*/ | |
private array $fieldEntities = []; | |
/** | |
* @var array<int, Action> | |
*/ | |
private array $actionEntities = []; | |
public function __construct( | |
private FormModel $formModel, | |
private FieldModel $formFieldModel, | |
private ActionModel $actionModel, | |
EventDispatcherInterface $eventDispatcher | |
) { | |
// this will load the data before fixtures are loaded | |
$eventDispatcher->addListener(PreExecuteEvent::class, function (PreExecuteEvent $event): void { | |
$formEntities = $this->getFormEntities(); | |
$this->getFieldEntities(); | |
$this->getActionEntities(); | |
$firstId = 0; | |
// create the tables passed in LoadFormData fixture. | |
foreach ($formEntities as $form) { | |
$this->formModel->generateHtml($form); | |
if ($form->getId() < 1) { | |
// Method above saves the form entity. If this exception is thrown all you need to do is to save an entity. | |
throw new \RuntimeException('Form must have an ID set.'); | |
} | |
if (0 === $firstId) { | |
$firstId = $form->getId(); | |
} | |
$this->formModel->createTableSchema($form, true, true); | |
} | |
if ($event->isTruncate()) { | |
return; | |
} | |
// need to delete created form entities, because executor will wrap DELETE query into transaction and | |
// will insert form entries with new autoincrement. | |
foreach ($formEntities as $formEntity) { | |
$this->formModel->deleteEntity($formEntity); | |
} | |
// because form table data will be deleted we must have same autoincrement as before the insertion | |
// to have the form_results table to match the form id in table name e.g. form_results_69_kaleidosco | |
$formTableName = $this->formModel->getRepository()->getTableName(); | |
$event->getEntityManager()->getConnection()->executeStatement( | |
'ALTER TABLE '.$formTableName.' AUTO_INCREMENT='.$firstId | |
); | |
}); | |
} | |
public function load(ObjectManager $manager): void | |
{ | |
$this->getFormEntities(); | |
$this->getFieldEntities(); | |
$this->getActionEntities(); | |
foreach ($this->formEntities as $key => $formEntity) { | |
$this->formModel->getRepository()->saveEntity($formEntity); | |
$this->setReference(self::FORM_PREFIX.$key, $formEntity); | |
} | |
foreach ($this->fieldEntities as $field) { | |
$this->formFieldModel->getRepository()->saveEntity($field); | |
} | |
foreach ($this->actionEntities as $action) { | |
$this->actionModel->getRepository()->saveEntity($action); | |
} | |
} | |
public function getOrder(): int | |
{ | |
return 8; | |
} | |
/** | |
* @return array<int, Form> | |
*/ | |
private function getFormEntities(): array | |
{ | |
$forms = CsvHelper::csv_to_array(__DIR__.'/fakeformdata.csv'); | |
$this->formEntities = []; | |
foreach ($forms as $count => $rows) { | |
$form = new Form(); | |
$key = $count + 1; | |
foreach ($rows as $col => $val) { | |
if ('NULL' !== $val) { | |
$setter = 'set'.ucfirst($col); | |
if ('dateAdded' === $col) { | |
$form->setDateAdded(new \DateTime($val)); | |
} elseif ('cachedHtml' === $col) { | |
$val = stripslashes($val); | |
$form->setCachedHtml($val); | |
} else { | |
$form->$setter($val); | |
} | |
} | |
} | |
$this->formEntities[$key] = $form; | |
} | |
return $this->formEntities; | |
} | |
private function getFieldEntities(): void | |
{ | |
if (0 === count($this->formEntities)) { | |
throw new \RuntimeException('This method must be called after getFormEntities.'); | |
} | |
$this->fieldEntities = []; | |
$fields = CsvHelper::csv_to_array(__DIR__.'/fakefielddata.csv'); | |
foreach ($fields as $count => $rows) { | |
$field = new Field(); | |
foreach ($rows as $col => $val) { | |
if ('NULL' !== $val) { | |
$setter = 'set'.ucfirst($col); | |
if ('form' === $col) { | |
$form = $this->formEntities[$val]; | |
$field->setForm($form); | |
$form->addField($count, $field); | |
} elseif (in_array($col, ['customParameters', 'properties'], true)) { | |
$val = Serializer::decode(stripslashes($val)); | |
$field->$setter($val); | |
} else { | |
$field->$setter($val); | |
} | |
} | |
} | |
$this->fieldEntities[$count] = $field; | |
} | |
} | |
private function getActionEntities(): void | |
{ | |
if (0 === count($this->formEntities)) { | |
throw new \RuntimeException('This method must be called after getFormEntities.'); | |
} | |
$this->actionEntities = []; | |
$actions = CsvHelper::csv_to_array(__DIR__.'/fakeactiondata.csv'); | |
foreach ($actions as $rows) { | |
$action = new Action(); | |
foreach ($rows as $col => $val) { | |
if ('NULL' !== $val) { | |
$setter = 'set'.ucfirst($col); | |
if ('form' === $col) { | |
$action->setForm($this->formEntities[$val]); | |
} elseif ('properties' === $col) { | |
$val = Serializer::decode(stripslashes($val)); | |
$action->setProperties($val); | |
} else { | |
$action->$setter($val); | |
} | |
} | |
} | |
$this->actionEntities[] = $action; | |
} | |
} | |
} | |