2013-08-26 2 views
2

J'ai un problème pour construire un formulaire avec de nombreuses relations entre les tables. La structure des relations que vous pouvez voir sur image ci-dessous: relations between tablesforme de construction pour les tables avec de nombreuses relations

Mes relations dans YML:

######### Products.orm.yml ######### 

    type: entity 
    table: products 
    fields: 
    ... 
    lifecycleCallbacks: { } 
    oneToMany: 
    productCombinations: 
     targetEntity: ProductsCombinations 
     mappedBy: product 

######### ProductsCombinations.orm.yml ######### 

    type: entity 
    table: products_combinations 
    fields: 
    ... 
    lifecycleCallbacks: { } 
    oneToMany: 
     productAttributes: 
     targetEntity: ProductsAttributesJoin 
     mappedBy: productCombinations 
    manyToOne: 
     product: 
     targetEntity: Products 
     inversedBy: productCombinations 
     joinColumn: 
      name: product_id 
      referencedColumnName: id 

######### ProductsAttributesJoin.orm.yml ######## 

type: entity 
table: null 
fields: 
    combinationID: 
     type: bigint 
     column: combination_id 
     id: true 
     generator: 
      strategy: NONE 
    attributeID: 
     type: bigint 
     id: true 
     generator: 
      strategy: NONE 
     column: attribute_id 
lifecycleCallbacks: { } 
manyToOne: 
    productCombinations: 
     targetEntity: ProductsCombinations 
     inversedBy: productAttributes 
     joinColumn: 
     name: combination_id 
     referencedColumnName: combination_id 
    attributes: 
     targetEntity: Attributes 
     inversedBy: productAttributesJoin 
     joinColumn: 
     name: attribute_id 
     referencedColumnName: id 

######### Attributes.orm.yml ######### 

    type: entity 
    table: products_attributes 
    fields: 
    ... 
    lifecycleCallbacks: { } 
    oneToMany: 
     productAttributesJoin: 
     targetEntity: ProductsAttributesJoin 
     mappedBy: attributes 
    manyToOne: 
     productAttributesDefinitions: 
     targetEntity: AttributesDefinitions 
     inversedBy: productAttributes 
     joinColumn: 
      name: attribute_id 
      referencedColumnName: id 

######### AttributesDefinitions.orm.yml ######### 

    type: entity 
    table: products_attributes_definitions 
    fields: 
    ... 
    lifecycleCallbacks: { } 
    oneToMany: 
     productAttributes: 
     targetEntity: Attributes 
     mappedBy: productAttributesDefinitions 
    manyToOne: 
     productAttributesDefinitions: 
     targetEntity: AttributesDefinitions 
     inversedBy: productAttributes 
     joinColumn: 
      name: attribute_id 
      referencedColumnName: id 

Ce que j'ai savoir est que: epos_wrong

Ce qui ne fonctionne pas comme quand je vais Cliquez sur Ajouter une nouvelle, puis j'ai une fenêtre contextuelle avec des champs de ProductsCombinations mais quand je les remplirai et que j'appuierai sur Sauvegarder, alors il affichera l'erreur que product_id est null (mais il devrait le prendre dans Products).

aussi ce que je voudrais faire est quelque chose comme ça: enter image description here

également un peu de code de répertoire Admin:

###### ProductsView.php ###### 

$formMapper->with('Attributes') 
      ->add('productCombinations', 'sonata_type_collection') 
     ->end() 

###### ProductsCombinations.php ###### 

    $formMapper 
     ->with('General') 
      ->(some main fields from productCombinations) 
      ->add('productAttributes', 'sonata_type_collection', array(), array(
      'edit' => 'inline', 
      'inline' => 'table', 
      'sortable' => 'position' 
     )) 

###### ProductsAttributesJoin.php ###### 

    $formMapper 
     ->with('General') 
      ->add('attributes', 'sonata_type_model') 
     ->end() 
    ; 

Répondre

1

Pour la première partie, en vous entité Product, vous avez addProductCombinations méthode. Faites-le comme:

public function addProductCombinations($object) 
{ 
    $this->productCombinations[] = $object; 
    $object->setProduct($this); // This line is important. 
} 

Cela devrait vous aider à bouger. Vous pouvez également définir le produit à l'intérieur des actions prePersist/preUpdate dans votre administrateur.

La deuxième partie de la question est un peu floue. Voulez-vous avoir des attributs de types différents comme le texte/le choix/le choix multiple? Si c'est le cas, vous devrez modifier dynamiquement le formulaire en utilisant How to Dynamically Modify Forms Using Form Events. Mais bon, peut-être vous pouvez réutiliser des paquets existants, comme packagist: assortment.

Questions connexes