Unternehmens-id der Eltern ist nicht gespeichert in einer OneToMany-Beziehung in SonataAdmin
Ich bin mit SonataAdmin (und Symfony2) zur Verwaltung der Entitäten. Ich habe eine oneToMany Beziehung zwischen einem Schritt und viele Aufgaben. Seit einem Schritt enthalten kann, die viele Aufgaben, wenn ich einen Schritt, ich möchte in der Lage zu schaffen, viele Aufgaben und ich will diese Aufgaben werden verknüpft, um dieses Schritt. So zu tun, ich habe all die richtigen admin-Klassen (eine für die Aufgabe und eine für Schritt).
Hier ist, was ich Tue, dass mein problem. Wenn ich versuche, einen Schritt, ich kann es schaffen, die Aufgaben und auch neu anordnen, die ist toll und alles geschieht automatisch durch SonataAdminBundle. Wenn ich auf speichern ist alles in der Datenbank gespeichert, mit der Ausnahme, dass in der Datenbank die id der Schritt ist nicht in die Zeile der Aufgabe. Deshalb werden die Aufgaben nicht mit den Schritt...
Hier ist meine Schritt in der admin-Klasse:
<?php
//src/Acme/DemoBundle/Admin/PostAdmin.php
namespace IMA\ProcessManagementBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
class StepAdmin extends Admin
{
//Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', 'text', array('label' => 'Nom de l\'étape'))
->add('tasks', 'sonata_type_collection', array(), array(
'edit' => 'inline',
'inline' => 'table',
'sortable' => 'positionNumber'
))
->add('positionNumber', 'integer', array('label' => 'Position'))
;
}
//Fields to be shown on filter forms
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('name')
;
}
//Fields to be shown on lists
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('name')
->add('slug')
;
}
}
Hier ist auch meine Aufgabe-admin-class:
<?php
//src/Acme/DemoBundle/Admin/PostAdmin.php
namespace IMA\ProcessManagementBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
class TaskAdmin extends Admin
{
//Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', 'text', array('label' => 'Tâche'))
->add('positionNumber', 'integer', array('label' => 'Position'))
;
}
//Fields to be shown on filter forms
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('name')
;
}
//Fields to be shown on lists
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('name')
->add('slug')
;
}
}
Auch hier sind die Beschreibung der Entitäten
IMA\ProcessManagementBundle\Entity\Step:
type: entity
table: null
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
name:
type: string
length: 255
positionNumber:
type: integer
oneToMany:
tasks:
targetEntity: Task
mappedBy: step
cascade: ["persist", "merge"]
lifecycleCallbacks: { }
IMA\ProcessManagementBundle\Entity\Task:
type: entity
table: null
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
name:
type: string
length: 255
positionNumber:
type: integer
manyToOne:
step:
targetEntity: Step
inversedBy: tasks
lifecycleCallbacks: { }
Frage ich mich, warum die id der Schritt ist nicht in der Task-Zeile...
- Was bedeutet
app/console doctrine:schema:validate
sagen Sie? - Mögliche Duplikate von oneToMany-relation Entität nicht speichern id-Feld
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie manuell fügen Sie den Schritt, um die Aufgaben zu tun, so müssen Sie die prePersist und preUpdate Methoden in der Schritt-admin-class...
Der Grund dafür ist, dass die Entwickler der SonataAdminBundle sagen, es ist die Lehre von der Besorgnis, dies zu behandeln und die Lehre Entwickler sagen, es ist das Bündel von Verantwortung... So, jetzt müssen wir es tun für uns.
Wäre dies Ihre neue stepAdmin Klasse:
Steps
zu einemTask
, aber nicht für das entfernen Schritt! Und in der Tat diepreUpdate()
Funktion muss nicht wissen, welcher Schritt zu entfernen, weil die bisherige situation in unbekannte gibt, als die$object->getTasks()
gibt die validierte-Formulars situation. Wie löst man das?@ORM\OneToMany()
optionorphanRemoval=true
. Dass gelöst verbundene Einrichtung zum entfernen Problem für mich.In Ihrem
Step
Person, die Sie hinzufügen müssen, um in die Methode addTask :Als Sie noch nicht auf Ihre
Step.php
sollte man vermutlich anpassen dieses Codes.