![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/mautic.corals.io/app/bundles/FormBundle/DataFixtures/ORM/ |
<?php 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; } } }