/**
  * @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);
 }
示例#2
0
 /**
  * Note:
  *   This code is ugly, but there is no better way of doing it.
  *   For now the append form element action used to add a new row works
  *   only for direct FieldDescription (not nested one)
  *
  * @throws \RuntimeException
  *
  * @param \Sonata\AdminBundle\Admin\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->handleRequest($admin->getRequest());
     $elementId = preg_replace('#.(\\d+)#', '[$1]', implode('.', $this->generateElementId($formBuilder, substr($elementId, strpos($elementId, '_') + 1))));
     // append a new instance into the object
     $this->addNewInstance($admin, $elementId);
     // return new form with empty row
     $finalForm = $admin->getFormBuilder()->getForm();
     $finalForm->setData($subject);
     $finalForm->setData($form->getData());
     return $finalForm;
 }
示例#3
0
 /**
  * Note:
  *   This code is ugly, but there is no better way of doing it.
  *   For now the append form element action used to add a new row works
  *   only for direct FieldDescription (not nested one).
  *
  * @throws \RuntimeException
  *
  * @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->handleRequest($admin->getRequest());
     // get the field element
     $childFormBuilder = $this->getChildFormBuilder($formBuilder, $elementId);
     //Child form not found (probably nested one)
     //if childFormBuilder was not found resulted in fatal error getName() method call on non object
     if (!$childFormBuilder) {
         $propertyAccessor = $this->pool->getPropertyAccessor();
         $entity = $admin->getSubject();
         $path = $this->getElementAccessPath($elementId, $entity);
         $collection = $propertyAccessor->getValue($entity, $path);
         if ($collection instanceof \Doctrine\ORM\PersistentCollection || $collection instanceof \Doctrine\ODM\MongoDB\PersistentCollection) {
             //since doctrine 2.4
             $entityClassName = $collection->getTypeClass()->getName();
         } elseif ($collection instanceof \Doctrine\Common\Collections\Collection) {
             $entityClassName = $this->getEntityClassName($admin, explode('.', preg_replace('#\\[\\d*?\\]#', '', $path)));
         } else {
             throw new \Exception('unknown collection class');
         }
         $collection->add(new $entityClassName());
         $propertyAccessor->setValue($entity, $path, $collection);
         $fieldDescription = null;
     } else {
         // 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;
         }
         $this->addNewInstance($form->getData(), $fieldDescription);
     }
     $finalForm = $admin->getFormBuilder()->getForm();
     $finalForm->setData($subject);
     // bind the data
     $finalForm->setData($form->getData());
     return array($fieldDescription, $finalForm);
 }