src/Platform/ControlPanelBundle/Form/OneRosterSyncType.php line 76

Open in your IDE?
  1. <?php
  2. namespace Platform\ControlPanelBundle\Form;
  3. use App\Validator\Constraints\RRule;
  4. use Cms\CoreBundle\Entity\OneRosterSync;
  5. use Cms\CoreBundle\Form\Type\ChosenChoiceType;
  6. use Cms\CoreBundle\Service\OneRoster\AbstractOneRosterApi;
  7. use DateTimeZone;
  8. use Exception;
  9. use InvalidArgumentException;
  10. use Recurr\Rule;
  11. use Symfony\Component\Form\AbstractType;
  12. use Symfony\Component\Form\CallbackTransformer;
  13. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  14. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  15. use Symfony\Component\Form\Extension\Core\Type\TextType;
  16. use Symfony\Component\Form\FormBuilderInterface;
  17. use Symfony\Component\Form\FormEvent;
  18. use Symfony\Component\Form\FormEvents;
  19. use Symfony\Component\Validator\Constraints\NotBlank;
  20. /**
  21.  * Class OneRosterSyncType
  22.  * @package Platform\ControlPanelBundle\Form
  23.  */
  24. final class OneRosterSyncType extends AbstractType
  25. {
  26.     /**
  27.      * {@inheritdoc}
  28.      */
  29.     public function buildForm(FormBuilderInterface $builder, array $options)
  30.     {
  31.         $builder
  32.             ->add('vendor'ChoiceType::class, [
  33.                 'expanded' => false,
  34.                 'multiple' => false,
  35.                 'required' => true,
  36.                 'placeholder' => 'Select vendor...',
  37.                 'empty_data' => null,
  38.                 'choices' => AbstractOneRosterApi::VENDORS,
  39.                 'choice_label' => function ($value$key) {
  40.                     return $value;
  41.                 },
  42.                 'choice_value' => function ($value) {
  43.                     return $value;
  44.                 },
  45.             ])
  46.             ->add('apiClientId'TextType::class, [
  47.                 'constraints' => [
  48.                     new NotBlank(),
  49.                 ],
  50.             ])
  51.             ->add('apiClientSecret'TextType::class, [
  52.                 'constraints' => [
  53.                     new NotBlank(),
  54.                 ],
  55.             ])
  56.             ->add('apiAppName'TextType::class, [
  57.                 'required' => false,
  58.             ])
  59.             ->add('baseUri'TextType::class, [
  60.                 'required' => false,
  61.             ])
  62.             ->add('districtId'TextType::class, [
  63.                 'constraints' => [
  64.                     new NotBlank(),
  65.                 ],
  66.             ])
  67.             ->add('strategies'ChosenChoiceType::class, [
  68.                 'expanded' => false,
  69.                 'multiple' => true,
  70.                 'required' => false,
  71.                 'choices' => OneRosterSync::STRATEGIES,
  72.                 // 'choice_translation_domain' => 'CmsCoreBundle',
  73.                 'choice_label' => function ($value$key) {
  74.                     return sprintf(
  75.                         'app.oneroster.syncs.strategies.labels.%s',
  76.                         $key
  77.                     );
  78.                 },
  79.                 'choice_value' => function ($value) {
  80.                     return $value;
  81.                 },
  82.             ])
  83.             ->add('flags'ChosenChoiceType::class, [
  84.                 'expanded' => false,
  85.                 'multiple' => true,
  86.                 'required' => false,
  87.                 'choices' => OneRosterSync::FLAGS,
  88.                 // 'choice_translation_domain' => 'CmsCoreBundle',
  89.                 'choice_label' => function ($value$key) {
  90.                     return sprintf(
  91.                         'app.oneroster.syncs.flags.labels.%s',
  92.                         $key
  93.                     );
  94.                 },
  95.                 'choice_value' => function ($value) {
  96.                     return $value;
  97.                 },
  98.             ])
  99.             ->add('schedule'TextareaType::class, [
  100.                 'required' => false,
  101.                 'label_tooltip' => true,
  102.                 'constraints' => [
  103.                     new RRule(),
  104.                 ],
  105.                 'attr' => [
  106.                     'rows' => 2,
  107.                     'style' => 'height: auto;',
  108.                 ],
  109.             ]);
  110.         $builder->get('strategies')->addModelTransformer(
  111.             new CallbackTransformer(
  112.                 function (int $masks) {
  113.                     $data = [];
  114.                     foreach (OneRosterSync::STRATEGIES as $mask) {
  115.                         if (($masks $mask) > 0) {
  116.                             $data[] = $mask;
  117.                         }
  118.                     }
  119.                     return $data;
  120.                 },
  121.                 function (array $masks) {
  122.                     return array_reduce(
  123.                         $masks,
  124.                         function (int $carryint $mask) {
  125.                             return $carry $mask;
  126.                         },
  127.                         0
  128.                     );
  129.                 }
  130.             )
  131.         );
  132.         $builder->get('flags')->addModelTransformer(
  133.             new CallbackTransformer(
  134.                 function (int $masks) {
  135.                     $data = [];
  136.                     foreach (OneRosterSync::FLAGS as $mask) {
  137.                         if (($masks $mask) > 0) {
  138.                             $data[] = $mask;
  139.                         }
  140.                     }
  141.                     return $data;
  142.                 },
  143.                 function (array $masks) {
  144.                     return array_reduce(
  145.                         $masks,
  146.                         function ($carry$mask) {
  147.                             return ($carry $mask);
  148.                         },
  149.                         0
  150.                     );
  151.                 }
  152.             )
  153.         );
  154.         $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  155.             /** @var OneRosterSync $oneRosterSync */
  156.             $oneRosterSync $event->getData();
  157.             $timezone = new DateTimeZone('UTC');
  158.             try {
  159.                 if (empty($oneRosterSync->getSchedule())) {
  160.                     $oneRosterSync->setNextRunAt(nullnull$timezone);
  161.                     return;
  162.                 }
  163.                 try {
  164.                     new Rule($oneRosterSync->getSchedule());
  165.                 } catch (Exception $exception) {
  166.                     return;
  167.                 }
  168.                 $oneRosterSync->setNextRunAt(truenull$timezone);
  169.             } catch (InvalidArgumentException $exception) {
  170.                 $oneRosterSync->setNextRunAt(nullnull$timezone);
  171.             }
  172.         });
  173.     }
  174. }