/** * {@inheritdoc} */ public function configure($name, array $options, array $metadata, FormConfigInterface $parentConfig) { // The implementation uses a FormTypeGuesserInterface instance in order // to guess the "required" value from different sources (PHPdoc, // validation or doctrine metadata, etc.) $guessed = $this->guesser->guessRequired($parentConfig->getDataClass(), $name); if (null !== $guessed) { $options['required'] = $guessed->getValue(); } return $options; }
/** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $entity = $options['entity']; $view = $options['view']; $entityConfig = $this->configurator->getEntityConfiguration($entity); $entityProperties = $entityConfig[$view]['fields']; foreach ($entityProperties as $name => $metadata) { $formFieldOptions = $metadata['type_options']; if ('association' === $metadata['type']) { if ($metadata['associationType'] & ClassMetadata::TO_MANY) { $formFieldOptions['attr']['multiple'] = true; } // supported associations are displayed using advanced JavaScript widgets $formFieldOptions['attr']['data-widget'] = 'select2'; } if ('collection' === $metadata['fieldType']) { if (!isset($formFieldOptions['allow_add'])) { $formFieldOptions['allow_add'] = true; } if (!isset($formFieldOptions['allow_delete'])) { $formFieldOptions['allow_delete'] = true; } // The "delete_empty" option exists as of Sf >= 2.5 if (class_exists('Symfony\\Component\\Form\\FormErrorIterator')) { if (!isset($formFieldOptions['delete_empty'])) { $formFieldOptions['delete_empty'] = true; } } } elseif ('checkbox' === $metadata['fieldType'] && !isset($formFieldOptions['required'])) { $formFieldOptions['required'] = false; } if (!isset($formFieldOptions['required'])) { if (null !== ($guessRequired = $this->guesser->guessRequired($builder->getOption('data_class'), $name))) { $formFieldOptions['required'] = $guessRequired->getValue(); } } // Configure "placeholder" option for entity fields if ('association' === $metadata['type'] && $metadata['associationType'] & ClassMetadata::TO_ONE && !isset($formFieldOptions[$placeHolderOptionName = $this->getPlaceholderOptionName()]) && false === $formFieldOptions['required']) { $formFieldOptions[$placeHolderOptionName] = 'form.label.empty_value'; } $formFieldOptions['attr']['field_type'] = $metadata['fieldType']; $formFieldOptions['attr']['field_css_class'] = $metadata['class']; $formFieldOptions['attr']['field_help'] = $metadata['help']; $formFieldType = $this->useLegacyFormComponent() ? $metadata['fieldType'] : $this->getFormTypeFqcn($metadata['fieldType']); $builder->add($name, $formFieldType, $formFieldOptions); } }
/** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $entity = $options['entity']; $view = $options['view']; $entityConfig = $this->configurator->getEntityConfiguration($entity); $entityProperties = $entityConfig[$view]['fields']; foreach ($entityProperties as $name => $metadata) { $formFieldOptions = $metadata['type_options']; if ('association' === $metadata['type']) { $toManyAssociations = array(ClassMetadata::ONE_TO_MANY, ClassMetadata::MANY_TO_MANY); if (in_array($metadata['associationType'], $toManyAssociations)) { $formFieldOptions['attr']['multiple'] = true; } // supported associations are displayed using advanced JavaScript widgets $formFieldOptions['attr']['data-widget'] = 'select2'; } if ('collection' === $metadata['fieldType']) { if (!isset($formFieldOptions['allow_add'])) { $formFieldOptions['allow_add'] = true; } if (!isset($formFieldOptions['allow_delete'])) { $formFieldOptions['allow_delete'] = true; } if (version_compare(Kernel::VERSION, '2.5.0', '>=')) { if (!isset($formFieldOptions['delete_empty'])) { $formFieldOptions['delete_empty'] = true; } } } elseif ('checkbox' === $metadata['fieldType'] && !isset($formFieldOptions['required'])) { $formFieldOptions['required'] = false; } if (!isset($formFieldOptions['required'])) { if (null !== ($guessRequired = $this->guesser->guessRequired($builder->getOption('data_class'), $name))) { $formFieldOptions['required'] = $guessRequired->getValue(); } } $formFieldOptions['attr']['field_type'] = $metadata['fieldType']; $formFieldOptions['attr']['field_css_class'] = $metadata['class']; $formFieldOptions['attr']['field_help'] = $metadata['help']; $formFieldType = $this->useLegacyFormComponent() ? $metadata['fieldType'] : $this->getFormTypeFqcn($metadata['fieldType']); $builder->add($name, $formFieldType, $formFieldOptions); } }
/** * {@inheritdoc} */ public function configure($name, array $options, array $metadata, FormConfigInterface $parentConfig) { if (!isset($options['class'])) { $guessedOptions = $this->guesser->guessType($parentConfig->getDataClass(), $name)->getOptions(); $options['class'] = $guessedOptions['class']; $options['multiple'] = $guessedOptions['multiple']; $options['em'] = $guessedOptions['em']; } if ($metadata['associationType'] & ClassMetadata::TO_MANY) { $options['attr']['multiple'] = true; } // Supported associations are displayed using advanced JavaScript widgets $options['attr']['data-widget'] = 'select2'; // Configure "placeholder" option for entity fields if ($metadata['associationType'] & ClassMetadata::TO_ONE && !isset($options[$placeHolderOptionName = $this->getPlaceholderOptionName()]) && false === $options['required']) { $options[$placeHolderOptionName] = 'form.label.empty_value'; } return $options; }
/** * @dataProvider mappingTestProvider * * @param array $mapping */ public function testBuildFormMappingUsed(array $mapping) { $entityName = User::class; $fieldName = 'someCustomField'; $expectedType = 'oro_datetime'; $this->regularTypeGuesser->expects($this->never())->method('guessType'); $this->extendTypeGuesser->expects($this->never())->method('guessType'); $type = new GuessFieldType($this->entityConfigMock, $this->regularTypeGuesser, $mapping); $form = $this->factory->create($type, null, ['data_class' => $entityName, 'field_name' => $fieldName]); $view = $form->createView(); $this->assertCount(1, $view->children, 'Failed asserting that there is only one children'); $fieldView = $view->offsetGet($fieldName); $this->assertEquals(sprintf('guess_field_type[%s]', $fieldName), $fieldView->vars['full_name'], 'Failed asserting that field name is correct'); $this->assertEquals($expectedType, $form[$fieldName]->getConfig()->getType()->getName(), 'Failed asserting that correct underlying type was used'); }