getToken()->getUser() instanceof User) { throw new \RuntimeException("you should have a valid user"); } $this->user = $tokenStorage->getToken()->getUser(); $this->authorizationHelper = $authorizationHelper; $this->om = $om; $this->translatableStringHelper = $translatableStringHelper; $this->timeChoices = $timeChoices; } /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { // handle times choices $timeChoices = array(); foreach ($this->timeChoices as $e) { $timeChoices[$e['label']] = $e['seconds']; }; $durationTimeTransformer = new DateTimeToTimestampTransformer('GMT', 'GMT'); $durationTimeOptions = array( 'choices' => $timeChoices, 'choices_as_values' => true, 'placeholder' => 'Choose the duration', ); $builder ->add('date', 'date', array( 'required' => true, 'widget' => 'single_text', 'format' => 'dd-MM-yyyy') ) ->add('durationTime', ChoiceType::class, $durationTimeOptions) ->add('remark', 'textarea', array( 'required' => false, 'empty_data' => '' )) ->add('attendee', ChoiceType::class, array( 'expanded' => true, 'required' => false, 'choices' => array( true => 'present', false => 'not present' ) )) ->add('user') ->add('scope') ->add('reasons', TranslatableActivityReason::class, array( 'multiple' => true, 'required' => false )) ->add('type', TranslatableActivityType::class, array( 'placeholder' => 'Choose a type', 'active_only' => true )) ; $this->appendScopeChoices($builder, $options['role'], $options['center'], $this->user, $this->authorizationHelper, $this->translatableStringHelper, $this->om); $builder->get('durationTime') ->addModelTransformer($durationTimeTransformer); $builder->get('durationTime') ->addEventListener( FormEvents::PRE_SET_DATA, function(FormEvent $formEvent) use ( $timeChoices, $builder, $durationTimeTransformer, $durationTimeOptions ) { // set the timezone to GMT, and fix the difference between current and GMT // the datetimetransformer will then handle timezone as GMT $timezoneUTC = new \DateTimeZone('GMT'); /* @var $data \DateTime */ $data = $formEvent->getData() === NULL ? \DateTime::createFromFormat('U', 300) : $formEvent->getData(); $seconds = $data->getTimezone()->getOffset($data); $data->setTimeZone($timezoneUTC); $data->add(new \DateInterval('PT'.$seconds.'S')); // test if the timestamp is in the choices. // If not, recreate the field with the new timestamp if (!in_array($data->getTimestamp(), $timeChoices)) { // the data are not in the possible values. add them $timeChoices[$data->format('H:i')] = $data->getTimestamp(); $form = $builder->create( 'durationTime', ChoiceType::class, array_merge( $durationTimeOptions, array( 'choices' => $timeChoices, 'auto_initialize' => false ) )); $form->addModelTransformer($durationTimeTransformer); $formEvent->getForm()->getParent()->add($form->getForm()); } }); } /** * @param OptionsResolverInterface $resolver */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'Chill\ActivityBundle\Entity\Activity' )); $this->appendScopeChoicesOptions($resolver); } /** * @return string */ public function getName() { return 'chill_activitybundle_activity'; } }