getOptions(); // select the type depending to the SCALE $type = (0 === $options[self::SCALE] || null === $options[self::SCALE]) ? IntegerType::class : NumberType::class; // 'integer' : 'number'; $fieldOptions = $this->prepareFieldOptions($customField, $type); $builder->add($customField->getSlug(), $type, $fieldOptions); } public function buildOptionsForm(FormBuilderInterface $builder) { return $builder ->add(self::MIN, NumberType::class, [ 'scale' => 2, 'label' => 'Greater or equal than', 'required' => false, ]) ->add(self::MAX, NumberType::class, [ 'scale' => 2, 'label' => 'Lesser or equal than', 'required' => false, ]) ->add(self::SCALE, IntegerType::class, [ 'scale' => 0, 'label' => 'Precision', 'constraints' => [ new GreaterThanOrEqual(['value' => 0]), ], ]) ->add(self::POST_TEXT, TextType::class, [ 'label' => 'Text after the field', ]); } public function deserialize($serialized, CustomField $customField) { return $serialized; } public function getName() { return 'Number field'; } public function render($value, CustomField $customField, $documentType = 'html') { $template = '@ChillCustomFields/CustomFieldsRendering/number.' .$documentType.'.twig'; $options = $customField->getOptions(); return $this->templating ->render($template, [ 'number' => $value, 'scale' => $options[self::SCALE], 'post' => $options[self::POST_TEXT], ]); } public function serialize($value, CustomField $customField) { return $value; } /** * prepare the options'form field. * * @param string $type * * @return mixed[] */ private function prepareFieldOptions(CustomField $customField, $type) { $options = $customField->getOptions(); /** * @var mixed[] the formField options */ $fieldOptions = []; // add required $fieldOptions['required'] = false; // add label $fieldOptions['label'] = $this->translatableStringHelper->localize($customField->getName()); // add constraints if required if (null !== $options[self::MIN]) { $fieldOptions['constraints'][] = new GreaterThanOrEqual(['value' => $options[self::MIN]]); } if (null !== $options[self::MAX]) { $fieldOptions['constraints'][] = new LessThanOrEqual(['value' => $options[self::MAX]]); } // add precision to options if required if ('number' === $type) { $fieldOptions['scale'] = $options[self::SCALE]; } if (!empty($options[self::POST_TEXT])) { $fieldOptions['post_text'] = $options[self::POST_TEXT]; } return $fieldOptions; } }