/** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $routes = $this->router->getRouteCollection(); $nRoutes = array(); foreach ($routes as $key => $route) { if (($dotPos = strpos($key, '.')) !== false) { $key = substr($key, 0, $dotPos); } $routeOptions = $route->getOptions(); if (isset($routeOptions['label'])) { $nRoutes[$key] = $routeOptions['label']; } } asort($nRoutes); $formModifier = function (FormInterface $form, $link) { if ($link) { $form->add('parameters', ParameterType::class, array('link' => $link)); } }; $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use($formModifier, $nRoutes) { $form = $event->getForm(); $parentForm = $event->getForm()->getParent(); $data = $event->getData(); $parentData = $form->getParent()->getData(); $getMethod = 'get' . ucfirst($form->getName()); $entityLink = $data ? $parentData->{$getMethod}() : null; $name = isset($entityLink['name']) ? $entityLink['name'] : null; $externalLink = isset($entityLink['externalLink']) ? $entityLink['externalLink'] : null; $linkType = isset($entityLink['linkType']) ? $entityLink['linkType'] : true; $form->add('name', ChoiceType::class, array('data' => $name, 'empty_data' => 'Choose a link', 'choices' => $nRoutes, 'required' => false, 'attr' => array('class' => 'bigfoot_link_routes', 'data-parent-form-link' => $parentForm->getName()))); $form->add('externalLink', TextType::class, array('data' => $externalLink, 'required' => false)); $form->add('linkType', HiddenType::class, array('data' => $linkType, 'required' => false)); if (isset($data['name'])) { $formModifier($event->getForm(), $data['name']); } }); $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use($formModifier) { $form = $event->getForm(); $data = $event->getData(); $parentData = $form->getParent()->getData(); $setMethod = 'set' . ucfirst($form->getName()); $parentData->{$setMethod}($data); if (isset($data['name'])) { $formModifier($event->getForm(), $data['name']); } }); }
/** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $link = $options['link']; if ($link) { $routeName = $this->router instanceof \BeSimple\I18nRoutingBundle\Routing\Router ? sprintf('%s.%s', $link, $this->locale) : $link; $route = $this->router->getRouteCollection()->get($routeName); if ($route) { $routeOptions = $route->getOptions(); } } $entities = array(); $parameters = array(); if (isset($routeOptions['parameters'])) { foreach ($routeOptions['parameters'] as $key => $parameter) { if (preg_match('/Bundle/i', $parameter['type'])) { $method = 'findBy'; if (isset($parameter['repoMethod'])) { $method = $parameter['repoMethod']; } $methodParameters = array(); if (isset($parameter['label'])) { $methodParameters[$parameter['label']] = 'ASC'; } $entities[$parameter['name']] = $this->entityManager->getRepository($parameter['type'])->{$method}(array(), $methodParameters); } else { $parameters[$parameter['name']] = $parameter['name']; } } } if (count($entities)) { foreach ($entities as $key => $entity) { $builder->add($key, ChoiceType::class, array('choices' => $this->getEntities($entity, $routeOptions))); } } if (count($parameters)) { foreach ($parameters as $key => $parameter) { $builder->add($parameter, TextType::class, array('required' => true)); } } }
/** * @expectedException Symfony\Component\Routing\Exception\MissingMandatoryParametersException */ public function testGenerateI18nTranslatedWithoutLocale() { if (method_exists('Symfony\\Component\\Routing\\RouterInterface', 'getContext')) { $parentRouter = $this->getMock('Symfony\\Component\\Routing\\RouterInterface'); } else { // use the Router for Symfony 2.0 as it implements the needed methods but they were not in the interface $parentRouter = $this->getMockBuilder('Symfony\\Component\\Routing\\Router')->disableOriginalConstructor()->getMock(); } $context = $this->getMockBuilder('Symfony\\Component\\Routing\\RequestContext')->disableOriginalConstructor()->setMethods(array('getParameter', 'hasParameter'))->getMock(); $context->expects($this->once())->method('hasParameter')->with($this->equalTo('_locale'))->will($this->returnValue(false)); $parentRouter->expects($this->any())->method('getContext')->will($this->returnValue($context)); $router = new Router($parentRouter); $router->generate('test_route', array('foo' => 'bar', 'translate' => 'foo'), false); }