php – Entity的父项ID不会保存在SonataAdmin中的OneToMany关系中

前端之家收集整理的这篇文章主要介绍了php – Entity的父项ID不会保存在SonataAdmin中的OneToMany关系中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用SonataAdmin(和Symfony2)来管理我的实体.我在一个步骤和许多任务之间有一个多关系.由于一步可以包含许多任务,当我创建一个步骤时,我想要能够创建许多任务,我希望这些任务链接到此步骤.为此,我创建了所有正确的管理类(一个用于Task,一个用于Step).

这是我做的,导致我的问题.当我尝试创建一个步骤时,我可以创建任务,甚至重新排序,这是非常好的,并且都由SonataAdminBundle自动完成.当我点击保存时,所有内容都保存在数据库中,除了在数据库中,步骤的ID不会在任务的行中设置.因此,任务没有与步骤…相关联

这是我的Step的管理类:

  1. <?PHP
  2. // src/Acme/DemoBundle/Admin/PostAdmin.PHP
  3.  
  4. namespace IMA\ProcessManagementBundle\Admin;
  5.  
  6. use Sonata\AdminBundle\Admin\Admin;
  7. use Sonata\AdminBundle\Datagrid\ListMapper;
  8. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  9. use Sonata\AdminBundle\Form\FormMapper;
  10.  
  11. class StepAdmin extends Admin
  12. {
  13. // Fields to be shown on create/edit forms
  14. protected function configureFormFields(FormMapper $formMapper)
  15. {
  16. $formMapper
  17. ->add('name','text',array('label' => 'Nom de l\'étape'))
  18.  
  19. ->add('tasks','sonata_type_collection',array(),array(
  20. 'edit' => 'inline','inline' => 'table','sortable' => 'positionNumber'
  21. ))
  22. ->add('positionNumber','integer',array('label' => 'Position'))
  23. ;
  24. }
  25.  
  26. // Fields to be shown on filter forms
  27. protected function configureDatagridFilters(DatagridMapper $datagridMapper)
  28. {
  29. $datagridMapper
  30. ->add('name')
  31.  
  32. ;
  33. }
  34.  
  35. // Fields to be shown on lists
  36. protected function configureListFields(ListMapper $listMapper)
  37. {
  38. $listMapper
  39. ->addIdentifier('name')
  40. ->add('slug')
  41. ;
  42. }
  43. }

这也是我的任务管理类:

  1. <?PHP
  2. // src/Acme/DemoBundle/Admin/PostAdmin.PHP
  3.  
  4. namespace IMA\ProcessManagementBundle\Admin;
  5.  
  6. use Sonata\AdminBundle\Admin\Admin;
  7. use Sonata\AdminBundle\Datagrid\ListMapper;
  8. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  9. use Sonata\AdminBundle\Form\FormMapper;
  10.  
  11. class TaskAdmin extends Admin
  12. {
  13. // Fields to be shown on create/edit forms
  14. protected function configureFormFields(FormMapper $formMapper)
  15. {
  16. $formMapper
  17. ->add('name',array('label' => 'Tâche'))
  18. ->add('positionNumber',array('label' => 'Position'))
  19.  
  20. ;
  21. }
  22.  
  23. // Fields to be shown on filter forms
  24. protected function configureDatagridFilters(DatagridMapper $datagridMapper)
  25. {
  26. $datagridMapper
  27. ->add('name')
  28.  
  29. ;
  30. }
  31.  
  32. // Fields to be shown on lists
  33. protected function configureListFields(ListMapper $listMapper)
  34. {
  35. $listMapper
  36. ->addIdentifier('name')
  37. ->add('slug')
  38. ;
  39. }
  40. }

另外,这里是我的实体的描述

  1. IMA\ProcessManagementBundle\Entity\Step:
  2. type: entity
  3. table: null
  4. fields:
  5. id:
  6. type: integer
  7. id: true
  8. generator:
  9. strategy: AUTO
  10. name:
  11. type: string
  12. length: 255
  13. positionNumber:
  14. type: integer
  15.  
  16.  
  17. oneToMany:
  18. tasks:
  19. targetEntity: Task
  20. mappedBy: step
  21. cascade: ["persist","merge"]
  22.  
  23. lifecycleCallbacks: { }
  24.  
  25.  
  26. IMA\ProcessManagementBundle\Entity\Task:
  27. type: entity
  28. table: null
  29. fields:
  30. id:
  31. type: integer
  32. id: true
  33. generator:
  34. strategy: AUTO
  35. name:
  36. type: string
  37. length: 255
  38. positionNumber:
  39. type: integer
  40.  
  41.  
  42. manyToOne:
  43. step:
  44. targetEntity: Step
  45. inversedBy: tasks
  46.  
  47.  
  48. lifecycleCallbacks: { }

我想知道为什么步骤的id不在任务行中设置…

您需要手动将步骤附加到任务中,为此您需要在步骤admin类中使用prePersist和preUpdate方法

这样做的原因是SonataAdminBundle的开发人员说,这是理论的关注,要处理这个问题,而这个原则开发者说这是捆绑的责任.所以现在我们需要为自己做.

这将是你新的stepAdmin类:

  1. <?PHP
  2. namespace IMA\ProcessManagementBundle\Admin;
  3.  
  4. use Sonata\AdminBundle\Admin\Admin;
  5. use Sonata\AdminBundle\Datagrid\ListMapper;
  6. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  7. use Sonata\AdminBundle\Form\FormMapper;
  8.  
  9. class StepAdmin extends Admin
  10. {
  11. // Fields to be shown on create/edit forms
  12. protected function configureFormFields(FormMapper $formMapper)
  13. {
  14. $formMapper
  15. ->add('name',array('label' => 'Position'))
  16. ;
  17. }
  18.  
  19. // Fields to be shown on filter forms
  20. protected function configureDatagridFilters(DatagridMapper $datagridMapper)
  21. {
  22. $datagridMapper
  23. ->add('name')
  24.  
  25. ;
  26. }
  27.  
  28. // Fields to be shown on lists
  29. protected function configureListFields(ListMapper $listMapper)
  30. {
  31. $listMapper
  32. ->addIdentifier('name')
  33. ->add('slug')
  34. ;
  35. }
  36.  
  37.  
  38. public function prePersist($object)
  39. {
  40. foreach ($object->getTasks() as $task) {
  41. $task->setStep($object);
  42. }
  43. }
  44.  
  45. public function preUpdate($object)
  46. {
  47. foreach ($object->getTasks() as $task) {
  48. $task->setStep($object);
  49. }
  50. }
  51.  
  52.  
  53. }

猜你在找的PHP相关文章