/** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name')->add('description')->add('countries')->add('tags', 'text', ['mapped' => false]); $tagManager = $this->tagManager; $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { if (!$event->getData() || !$event->getData()->getId()) { $event->getForm()->add('url', 'url')->add('type', 'text', ['mapped' => false, 'constraints' => [new Constraints\NotBlank(['groups' => ['new']]), new Constraints\Choice(['choices' => Platform::getAvailableTypes(), 'groups' => ['new'], 'message' => 'Неправильный тип площадки'])]]); } }); $builder->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) use($tagManager) { /** @var Platform $platform */ $platform = $event->getData(); $form = $event->getForm(); $formTags = $form['tags']->getData(); if (!empty($formTags) && !is_string($formTags)) { $error = new FormError('неправильный формат тегов'); $form['tags']->addError($error); } else { $tagNames = $tagManager->splitTagNames($form['tags']->getData()); $tags = $tagManager->loadOrCreateTags($tagNames); $tagManager->replaceTags($tags, $platform); } if (!$platform->getId() && $platform->getUrl()) { // для новой площадки $url = new Url($platform->getUrl()); $platform->setUrl(rtrim($url->format('hp'), '//')); if (in_array($url->getHostname(), ['vk.com', 'vkontakte.ru']) !== ($form['type']->getData() == 'vk')) { $error = new FormError('Тип площадки не соответствует адресу'); $form['url']->addError($error); } } }); }
/** * @dataProvider providePattern */ public function testFormat($input, $pattern, $expected) { $url = new Url($input); $this->assertEquals($expected, $url->format($pattern)); }