/** * Replace form control with new rules * * @param BuilderDefinition $definition */ private function replaceFormControl(BuilderDefinition $definition) { $form = $this->form; if (isset($form[$definition->getName()])) { unset($form[$definition->getName()]); } $methodName = 'add' . ucfirst($definition->getComponentType()); /** @var BaseControl $control */ $control = Callback::invokeArgs(array($form, $methodName), [$definition->getName(), $definition->getLabel()]); // is required? if ($definition->isRequired()) { $control->addRule(Form::FILLED, sprintf('%s is required!', $definition->getLabel() === NULL ? $definition->getName() : $definition->getLabel())); } // rules conditions - validation rules foreach ($definition->getValidationRules() as $validationRule) { if ($validationRule['conditional']) { $control->addCondition(Form::FILLED)->addRule($validationRule['validator'], $validationRule['text'], $validationRule['arg']); } else { $control->addRule($validationRule['validator'], $validationRule['text'], $validationRule['arg']); } } // placeholder if ($definition->getPlaceholder() !== NULL) { $control->setAttribute('placeholder', $definition->getPlaceholder()); } if (in_array($definition->getComponentType(), [BuilderDefinition::COMPONENT_TYPE_CHECKBOX_LIST, BuilderDefinition::COMPONENT_TYPE_SELECT, BuilderDefinition::COMPONENT_TYPE_RADIO_LIST, BuilderDefinition::COMPONENT_TYPE_MULTI_SELECT])) { /** @var ChoiceControl $control */ if (count($definition->getValues()) > 0) { $control->setItems($definition->getValues()); } } // set value - or load it from entity if ($definition->getValue() !== NULL) { $control->setValue($definition->getValue()); } else { $this->entityFormMapper->mapValueToComponent($this->entity, $control); } }