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);
 }