public function testWithFieldsCascadeTranslationDomain() { $this->contractor->expects($this->once())->method('getDefaultOptions')->will($this->returnValue(array())); $this->formMapper->with('foobar', array('translation_domain' => 'Foobar'))->add('foo', 'bar')->end(); $fieldDescription = $this->admin->getFormFieldDescription('foo'); $this->assertSame('foo', $fieldDescription->getName()); $this->assertSame('bar', $fieldDescription->getType()); $this->assertSame('Foobar', $fieldDescription->getTranslationDomain()); $this->assertTrue($this->formMapper->has('foo')); $this->assertSame(array('default' => array('collapsed' => false, 'class' => false, 'description' => false, 'translation_domain' => 'Foobar', 'name' => 'default', 'box_class' => 'box box-primary', 'auto_created' => true, 'groups' => array('foobar'), 'tab' => true)), $this->admin->getFormTabs()); $this->assertSame(array('foobar' => array('collapsed' => false, 'class' => false, 'description' => false, 'translation_domain' => 'Foobar', 'name' => 'foobar', 'box_class' => 'box box-primary', 'fields' => array('foo' => 'foo'))), $this->admin->getFormGroups()); }
/** * @param AdminInterface $admin * @param object $subject * @param string $elementId * @return array */ public function appendFormFieldElement(AdminInterface $admin, $subject, $elementId) { // retrieve the subject $formBuilder = $admin->getFormBuilder(); $form = $formBuilder->getForm(); $form->setData($subject); $form->submit($admin->getRequest()); // get the field element $childFormBuilder = $this->getChildFormBuilder($formBuilder, $elementId); // retrieve the FieldDescription $fieldDescription = $admin->getFormFieldDescription($childFormBuilder->getName()); try { $value = $fieldDescription->getValue($form->getData()); } catch (NoValueException $e) { $value = null; } // retrieve the posted data $data = $admin->getRequest()->get($formBuilder->getName()); if (!isset($data[$childFormBuilder->getName()])) { $data[$childFormBuilder->getName()] = array(); } $objectCount = count($value); $postCount = count($data[$childFormBuilder->getName()]); $fields = array_keys($fieldDescription->getAssociationAdmin()->getFormFieldDescriptions()); // for now, not sure how to do that $value = array(); foreach ($fields as $name) { $value[$name] = ''; } // add new elements to the subject while ($objectCount <= $postCount) { // append a new instance into the object $this->addNewInstance($form->getData(), $fieldDescription); $objectCount++; } $subject->orderLayoutBlocks(); $finalForm = $admin->getFormBuilder()->getForm(); $finalForm->setData($subject); // bind the data $finalForm->setData($form->getData()); return array($fieldDescription, $finalForm); }
/** * Retrieve the form field description given by field name. * * @param AdminInterface $admin * @param string $field * * @return FormInterface * * @throws \RuntimeException */ private function retrieveFormFieldDescription(AdminInterface $admin, $field) { $admin->getFormFieldDescriptions(); $fieldDescription = $admin->getFormFieldDescription($field); if (!$fieldDescription) { throw new \RuntimeException(sprintf('The field "%s" does not exist.', $field)); } if (null === $fieldDescription->getTargetEntity()) { throw new \RuntimeException(sprintf('No associated entity with field "%s".', $field)); } return $fieldDescription; }
protected function getClassInstance(AdminInterface $admin, $elements) { $element = array_shift($elements); $associationAdmin = $admin->getFormFieldDescription($element)->getAssociationAdmin(); if (count($elements) == 0) { return $associationAdmin->getNewInstance(); } else { return $this->getClassInstance($associationAdmin, $elements); } }
/** * Retrieve the field description given by field name. * * @param AdminInterface $admin * @param string $field * * @return \Symfony\Component\Form\FormInterface * * @throws \RuntimeException */ private function retrieveFieldDescription(AdminInterface $admin, $field) { $admin->getFormFieldDescriptions(); $fieldDescription = $admin->getFormFieldDescription($field); if (!$fieldDescription) { throw new \RuntimeException(sprintf('The field "%s" does not exist.', $field)); } if ($fieldDescription->getType() !== 'sonata_type_model_autocomplete') { throw new \RuntimeException(sprintf('Unsupported form type "%s" for field "%s".', $fieldDescription->getType(), $field)); } if (null === $fieldDescription->getTargetEntity()) { throw new \RuntimeException(sprintf('No associated entity with field "%s".', $field)); } return $fieldDescription; }
/** * Recursively find the class name of the admin responsible for the element at the end of an association chain. * * @param AdminInterface $admin * @param array $elements * * @return string */ protected function getEntityClassName(AdminInterface $admin, $elements) { $element = array_shift($elements); $associationAdmin = $admin->getFormFieldDescription($element)->getAssociationAdmin(); if (count($elements) == 0) { return $associationAdmin->getClass(); } return $this->getEntityClassName($associationAdmin, $elements); }