ListBuilder.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. /*
  3. * This file is part of the Sonata package.
  4. *
  5. * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Sonata\AdminBundle\Builder\ORM;
  11. use Sonata\AdminBundle\Admin\FieldDescription;
  12. use Sonata\AdminBundle\Admin\Admin;
  13. use Sonata\AdminBundle\Datagrid\ListCollection;
  14. use Sonata\AdminBundle\Builder\ListBuilderInterface;
  15. use Doctrine\ORM\Mapping\ClassMetadataInfo;
  16. class ListBuilder implements ListBuilderInterface
  17. {
  18. public function getBaseList(array $options = array())
  19. {
  20. return new ListCollection;
  21. }
  22. public function addField(ListCollection $list, FieldDescription $fieldDescription)
  23. {
  24. return $list->add($fieldDescription);
  25. }
  26. /**
  27. * The method define the correct default settings for the provided FieldDescription
  28. *
  29. * @param FieldDescription $fieldDescription
  30. * @return void
  31. */
  32. public function fixFieldDescription(Admin $admin, FieldDescription $fieldDescription, array $options = array())
  33. {
  34. if ($fieldDescription->getName() == '_action')
  35. {
  36. $this->buildActionFieldDescription($fieldDescription);
  37. }
  38. $fieldDescription->mergeOptions($options);
  39. $fieldDescription->setAdmin($admin);
  40. // set the default field mapping
  41. if (isset($admin->getClassMetaData()->fieldMappings[$fieldDescription->getName()])) {
  42. $fieldDescription->setFieldMapping($admin->getClassMetaData()->fieldMappings[$fieldDescription->getName()]);
  43. }
  44. // set the default association mapping
  45. if (isset($admin->getClassMetaData()->associationMappings[$fieldDescription->getName()])) {
  46. $fieldDescription->setAssociationMapping($admin->getClassMetaData()->associationMappings[$fieldDescription->getName()]);
  47. }
  48. if (!$fieldDescription->getType()) {
  49. throw new \RuntimeException(sprintf('Please define a type for field `%s` in `%s`', $fieldDescription->getName(), get_class($admin)));
  50. }
  51. $fieldDescription->setOption('code', $fieldDescription->getOption('code', $fieldDescription->getName()));
  52. $fieldDescription->setOption('label', $fieldDescription->getOption('label', $fieldDescription->getName()));
  53. if (!$fieldDescription->getTemplate()) {
  54. $fieldDescription->setTemplate(sprintf('SonataAdminBundle:CRUD:list_%s.html.twig', $fieldDescription->getType()));
  55. if ($fieldDescription->getType() == ClassMetadataInfo::MANY_TO_ONE) {
  56. $fieldDescription->setTemplate('SonataAdminBundle:CRUD:list_orm_many_to_one.html.twig');
  57. }
  58. if ($fieldDescription->getType() == ClassMetadataInfo::ONE_TO_ONE) {
  59. $fieldDescription->setTemplate('SonataAdminBundle:CRUD:list_orm_one_to_one.html.twig');
  60. }
  61. if ($fieldDescription->getType() == ClassMetadataInfo::ONE_TO_MANY) {
  62. $fieldDescription->setTemplate('SonataAdminBundle:CRUD:list_orm_one_to_many.html.twig');
  63. }
  64. if ($fieldDescription->getType() == ClassMetadataInfo::MANY_TO_MANY) {
  65. $fieldDescription->setTemplate('SonataAdminBundle:CRUD:list_orm_many_to_many.html.twig');
  66. }
  67. }
  68. if ($fieldDescription->getType() == ClassMetadataInfo::MANY_TO_ONE) {
  69. $admin->attachAdminClass($fieldDescription);
  70. }
  71. if ($fieldDescription->getType() == ClassMetadataInfo::ONE_TO_ONE) {
  72. $admin->attachAdminClass($fieldDescription);
  73. }
  74. if ($fieldDescription->getType() == ClassMetadataInfo::ONE_TO_MANY) {
  75. $admin->attachAdminClass($fieldDescription);
  76. }
  77. if ($fieldDescription->getType() == ClassMetadataInfo::MANY_TO_MANY) {
  78. $admin->attachAdminClass($fieldDescription);
  79. }
  80. }
  81. public function buildActionFieldDescription(FieldDescription $fieldDescription)
  82. {
  83. if (null === $fieldDescription->getTemplate()) {
  84. $fieldDescription->setTemplate('SonataAdminBundle:CRUD:list__action.html.twig');
  85. }
  86. if (null === $fieldDescription->getType()) {
  87. $fieldDescription->setType('action');
  88. }
  89. if (null === $fieldDescription->getOption('name')) {
  90. $fieldDescription->setOption('name', 'Action');
  91. }
  92. if (null === $fieldDescription->getOption('code')) {
  93. $fieldDescription->setOption('code', 'Action');
  94. }
  95. if (null !== $fieldDescription->getOption('actions')) {
  96. $actions = $fieldDescription->getOption('actions');
  97. foreach ($actions as $k => $action) {
  98. if (!isset($action['template'])) {
  99. $actions[$k]['template'] = sprintf('SonataAdminBundle:CRUD:list__action%s.html.twig', $k);
  100. }
  101. }
  102. $fieldDescription->setOption('actions', $actions);
  103. }
  104. return $fieldDescription;
  105. }
  106. }