2015-09-18 1 views
3

Dans une application Symfony2 en utilisant le faisceau d'administration Sonata, j'ai deux entités:champ sonata_type_collection fonctionne uniquement avec des objets existants avec les parents

  • CorporateAttributes
  • CorporateAttributesApi

connexes dans Doctrine comme ceci:

CorporateAttributes ← one-to-many → CorporateAttributesApi

Ma Sonata classe Admin CorporateAttributes contient les éléments suivants:

dans AppBundle/Administration/CorporateAttributesAdmin.php

// Fields to be shown on create/edit forms 
protected function configureFormFields(FormMapper $formMapper) { 
    $formMapper 
     ->add('apis', 'sonata_type_collection', 
      ['required' => false, 'label' => 'API Clients'], 
      ['edit'=>'inline','inline'=>'table'] 
     ) 
    ; 
} 

Cela ajoute un " Ajouter un nouveau bouton "au formulaire CorporateAttributes où je peux ajouter et modifier CorporateAttributesApi liés à l'objet CorporateAttributes pour lequel l'utilisateur est en train de modifier. Toutefois, cela ne fonctionne que pour un objet CorporateAttributes existant.

Si je suis en train d'ajouter une nouvelle CorporateAttributes, en cliquant sur « Ajouter un nouveau bouton » donne l'erreur suivante dans la console:

Failed to load resource: the server responded with a status of 500 (Internal Server Error) 
http://localhost/app_dev.php/admin/core/append-form-field-element?code=sonata.admin.corporateattributes&elementId=s55fc29157eeee_apis&uniqid=s55fc29157eeee 

Je soupçonne qu'il a quelque chose à voir avec le fait que les besoins CorporateAttributesApi un identifiant CorporateAttributes qu'il référence, mais je ne suis pas sûr de savoir comment le rendre agréable.

Voici l'autre code correspondant:

dans AppBundle/Administration/CorporateAttributesApiAdmin.php:

// Fields to be shown on create/edit forms 
protected function configureFormFields(FormMapper $formMapper) { 
    $formMapper 
     ->add('corporate_attributes', null, ['required' => true]) 
     ->add('group_name', 'choice', [ 
      'choices' => ['a', 'b', 'c'], 
      'required' => false, 
     ]) 
    ; 
} 

Et les entités avec annotations Doctrine2:

dans AppBundle/Entité/CorporateAttributes.php :

namespace AppBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* CorporateAttributes 
* 
* 
* @ORM\Entity 
* @ORM\Table("drupal_wiredb_corporate_attributes") 
*/ 
class CorporateAttributes 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="CorporateAttributesApi", mappedBy="corporate_attributes", cascade={"persist"}, orphanRemoval=true)) 
    */ 
    protected $apis; 

    public function getId() { 
     return $this->id; 
    } 

    /** 
    * Add apis 
    * 
    * @param \AppBundle\Entity\CorporateAttributesApi $apis 
    * @return CorporateAttributes 
    */ 
    public function addApi(\AppBundle\Entity\CorporateAttributesApi $api) 
    { 
     $this->apis[] = $api; 
     $api->setCorporateAttributes($this); 

     return $this; 
    } 

    /** 
    * Remove apis 
    * 
    * @param \AppBundle\Entity\CorporateAttributesApi $apis 
    */ 
    public function removeApi(\AppBundle\Entity\CorporateAttributesApi $api) 
    { 
     $this->apis->removeElement($api); 
     $api->setCorporateAttributes(null); 
    } 

    /** 
    * Get apis 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getApis() 
    { 
     return $this->apis; 
    } 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->apis = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
} 

dans AppBundle/Entities/Co rporateAttributesApi.php:

namespace AppBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* CorporateAttributesApi 
* 
* 
* @ORM\Entity 
* @ORM\Table("drupal_wiredb_corporate_attributes_api") 
*/ 
class CorporateAttributesApi 
{ 
    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="CorporateAttributes", inversedBy="apis") 
    * @ORM\JoinColumn(name="attribute_id", referencedColumnName="id") 
    */ 
    protected $corporate_attributes; 

    /** 
    * @ORM\Id 
    * @ORM\Column(name="group_name", type="string", length=128, options={"default":""}) 
    */ 
    protected $group_name = ''; 

    public function __toString() { 
     if (empty($this->corporate_attributes) && empty($this->api_user)) { 
      return 'New Corporate Attributes - API User Join'; 
     } 
     else { 
      return (string)$this->corporate_attributes . ' | ' . (string)$this->api_user . ' | ' . $this->group_name; 
     } 
    } 

    /** 
    * Set group_name 
    * 
    * @param string $groupName 
    * @return CorporateAttributesApi 
    */ 
    public function setGroupName($groupName) 
    { 
     $this->group_name = $groupName; 

     return $this; 
    } 

    /** 
    * Get group_name 
    * 
    * @return string 
    */ 
    public function getGroupName() 
    { 
     return $this->group_name; 
    } 

    /** 
    * Set corporate_attributes 
    * 
    * @param \AppBundle\Entity\CorporateAttributes $corporateAttributes 
    * @return CorporateAttributesApi 
    */ 
    public function setCorporateAttributes(\AppBundle\Entity\CorporateAttributes $corporateAttributes) 
    { 
     $this->corporate_attributes = $corporateAttributes; 

     return $this; 
    } 

    /** 
    * Get corporate_attributes 
    * 
    * @return \AppBundle\Entity\CorporateAttributes 
    */ 
    public function getCorporateAttributes() 
    { 
     return $this->corporate_attributes; 
    } 
} 
+0

Avec cette erreur 500, l'onglet 'Réseau' du panneau des développeurs de votre navigateur affiche-t-il une réponse html comme un message d'exception lancé? – Vasily802

Répondre

0

Je voudrais essayer de modifier votre fichier AppBundle/Administration/CorporateAttributesApiAdmin.php de manière suivante:

// Fields to be shown on create/edit forms 
protected function configureFormFields(FormMapper $formMapper) { 
    $formMapper 
     ->add('corporate_attributes', null, ['required' => true]) 
     ->add('group_name', 'choice', [ 
      'choices' => ['a', 'b', 'c'], 
      'required' => false, 
     ]) 
    ; 

    // If this is sonata_type_collection inside CorporateAttributes form, 
    // then we don't need 'corporate_attributes' field as it would be the parent entity 
    if ($this->getRoot() instanceof \AppBundle\Admin\CorporateAttributesAdmin) { 
     $formMapper->remove('corporate_attributes'); 
    } 
} 

public function getNewInstance() 
{ 
    $object = parent::getNewInstance(); 

    // Here we specify the 'corporate_attributes' 
    if ($this->getRoot()->getSubject() instanceof \AppBundle\Entity\CorporateAttributes) { 
     $object->setCorporateAttributes($this->getRoot()->getSubject()); 
    } 

    return $object; 
} 

Vous pouvez également essayer de modifier AppBundle/Administration/CorporateAttributesAdmin.php pour définir by_reference = false dans la définition du champ de formulaire:

// Fields to be shown on create/edit forms 
// AppBundle/Admin/CorporateAttributesAdmin.php 
protected function configureFormFields(FormMapper $formMapper) { 
    $formMapper 
     ->add('apis', 'sonata_type_collection', 
      ['required' => false, 'label' => 'API Clients', 'by_reference' => false], 
      ['edit'=>'inline','inline'=>'table'] 
     ) 
    ; 
} 

Voici la documentation pour l'option by_reference: http://symfony.com/doc/current/reference/forms/types/collection.html#by-reference