public static function enhanceFromEntity(Form $form, $entity, $filter = "", $fields = TRUE, Loops $loops = NULL) { if (!$loops) { $loops = Loops::getCurrentLoops(); } $classname = is_object($entity) ? get_class($entity) : $entity; $properties = $loops->getService("annotations")->get($classname)->properties; $metadata = $loops->getService("doctrine")->getMetadataFactory()->getMetadataFor($classname); //find elements $elements = $form->getFormElements(); //add missing fields that are requested and have metadata if ($fields === TRUE) { $missing_fields = array_diff(array_keys($metadata->fieldMappings), array_keys($elements)); } else { $missing_fields = array_intersect(array_diff((array) $fields, array_keys($elements)), array_keys($metadata->fieldMappings)); } foreach ($missing_fields as $name) { if (!empty($metadata->fieldMappings[$name]['id'])) { continue; } if (!$entity->offsetExists($name)) { $classname = get_class($entity); throw new Exception("Failed to create Element for Entity '{$classname}'. Property '{$name}' is not accessible."); } $elements[$name] = self::addMissingElement($form, $entity, $loops, $name, $metadata->fieldMappings[$name], $properties->{$name}, $filter, FALSE); if (!$form->value->offsetExists($name)) { $form->value->offsetSet($name, $elements[$name]->getValue()); } } //add missing accociations $missing_assoc = array_intersect(array_diff((array) $fields, array_keys($elements)), array_keys($metadata->associationMappings)); foreach ($missing_assoc as $name) { $elements[$name] = self::addMissingElement($form, $entity, $loops, $name, $metadata->associationMappings[$name], $properties->{$name}, $filter, TRUE); if (!$form->value->offsetExists($name)) { $form->value->offsetSet($name, $elements[$name]->getValue()); } } //enhance fields foreach ($elements as $name => $element) { self::enhanceLabelFromName($element, $name); if (array_key_exists($name, $metadata->fieldMappings)) { self::enhanceDescriptionFromComment($element, $metadata->fieldMappings[$name]); } } }
function testBack() { $app = new WebApplication(__DIR__ . "/app", "/"); $form = new Form(); $form->confirm([]); $this->assertTrue($form->confirmed); $form->back(); $this->assertFalse($form->confirmed); }