custom/plugins/MoorlFormsClassic/src/Core/Subscriber/ValidateFormSubscriber.php line 19

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace MoorlFormsClassic\Core\Subscriber;
  3. use MoorlForms\Core\Content\Element\ElementDataStruct;
  4. use MoorlForms\Core\Event\ValidateFormEvent;
  5. use MoorlForms\Core\Service\DataStructFactory;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. class ValidateFormSubscriber implements EventSubscriberInterface
  8. {
  9.     public static function getSubscribedEvents(): array
  10.     {
  11.         return [
  12.             ValidateFormEvent::class => 'processConditions',
  13.         ];
  14.     }
  15.     public function processConditions(ValidateFormEvent $event): void
  16.     {
  17.         $dataStruct $event->getForm()->getDataStruct();
  18.         $this->_walkTree(
  19.             $dataStruct->getElements(),
  20.             $dataStruct->getFlattenElements()
  21.         );
  22.     }
  23.     private function _walkTree(array $elements, array $flattenElements): void
  24.     {
  25.         if (empty($elements)) {
  26.             return;
  27.         }
  28.         /** @var ElementDataStruct $element */
  29.         foreach ($elements as $element) {
  30.             if (DataStructFactory::_enrichCallback($element, function ($elements) use ($flattenElements) {
  31.                 self::_walkTree($elements$flattenElements);
  32.             })) {continue;}
  33.             if ($element->getConditions()) {
  34.                 foreach ($element->getConditions() as $condition) {
  35.                     try {
  36.                         $path $condition['name'];
  37.                         $match $this->_compare(
  38.                             $condition['value'],
  39.                             $flattenElements[$path]->getValue(),
  40.                             $condition['type']
  41.                         );
  42.                     } catch (\Exception $exception) {
  43.                         $match false;
  44.                     }
  45.                     if (!$match) {
  46.                         $element->unset();
  47.                     }
  48.                 }
  49.             }
  50.             $this->_walkTree($element->getChildren(), $flattenElements);
  51.         }
  52.     }
  53.     private function _compare($value1$value2$type): bool
  54.     {
  55.         // Prevent misconfiguration
  56.         if (!$value1 || !$value2) {
  57.             return true;
  58.         }
  59.         if (!is_array($value1)) {
  60.             $value1 explode(";"$value1);
  61.         }
  62.         if (!is_array($value2)) {
  63.             $value2 explode(";"$value2);
  64.         }
  65.         switch ($type) {
  66.             case 'is':
  67.                 return !!array_filter($value1, function ($element) use ($value2) {
  68.                     return in_array($element$value2);
  69.                 });
  70.             case 'not':
  71.                 return !!array_filter($value1, function ($element) use ($value2) {
  72.                     return !in_array($element$value2);
  73.                 });
  74.             case 'gt':
  75.                 return (float) $value1[0] > (float) $value2[0];
  76.             case 'lt':
  77.                 return (float) $value1[0] < (float) $value2[0];
  78.             case 'gte':
  79.                 return (float) $value1[0] >= (float) $value2[0];
  80.             case 'lte':
  81.                 return (float) $value1[0] <= (float) $value2[0];
  82.             case 'contains':
  83.                 return !!array_filter($value1, function ($element) use ($value2) {
  84.                     if (is_array($element)) {
  85.                         return !in_array($element$value2);
  86.                     } else {
  87.                         return str_contains((string) $value2[0], $element);
  88.                     }
  89.                 });
  90.         }
  91.         return false;
  92.     }
  93. }