ShowBuilder.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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\FieldDescriptionInterface;
  12. use Sonata\AdminBundle\Model\ModelManagerInterface;
  13. use Sonata\AdminBundle\Admin\AdminInterface;
  14. use Sonata\AdminBundle\Admin\FieldDescriptionCollection;
  15. use Sonata\AdminBundle\Builder\ShowBuilderInterface;
  16. use Sonata\AdminBundle\Guesser\TypeGuesserInterface;
  17. use Doctrine\ORM\Mapping\ClassMetadataInfo;
  18. class ShowBuilder implements ShowBuilderInterface
  19. {
  20. protected $guesser;
  21. public function __construct(TypeGuesserInterface $guesser)
  22. {
  23. $this->guesser = $guesser;
  24. }
  25. public function getBaseList(array $options = array())
  26. {
  27. return new FieldDescriptionCollection;
  28. }
  29. public function addField(FieldDescriptionCollection $list, $type = null, FieldDescriptionInterface $fieldDescription, AdminInterface $admin)
  30. {
  31. if ($type == null) {
  32. $guessType = $this->guesser->guessType($admin->getClass(), $fieldDescription->getName());
  33. $fieldDescription->setType($guessType->getType());
  34. } else {
  35. $fieldDescription->setType($type);
  36. }
  37. $this->fixFieldDescription($admin, $fieldDescription);
  38. $admin->addShowFieldDescription($fieldDescription->getName(), $fieldDescription);
  39. switch($fieldDescription->getMappingType()) {
  40. case ClassMetadataInfo::MANY_TO_ONE:
  41. case ClassMetadataInfo::MANY_TO_MANY:
  42. case ClassMetadataInfo::ONE_TO_MANY:
  43. case ClassMetadataInfo::ONE_TO_ONE:
  44. // todo
  45. return;
  46. default:
  47. $list->add($fieldDescription);
  48. }
  49. }
  50. /**
  51. * The method defines the correct default settings for the provided FieldDescription
  52. *
  53. * @param \Sonata\AdminBundle\Admin\AdminInterface $admin
  54. * @param \Sonata\AdminBundle\Admin\FieldDescriptionInterface $fieldDescription
  55. * @return void
  56. */
  57. public function fixFieldDescription(AdminInterface $admin, FieldDescriptionInterface $fieldDescription)
  58. {
  59. $fieldDescription->setAdmin($admin);
  60. if ($admin->getModelManager()->hasMetadata($admin->getClass())) {
  61. $metadata = $admin->getModelManager()->getMetadata($admin->getClass());
  62. // set the default field mapping
  63. if (isset($metadata->fieldMappings[$fieldDescription->getName()])) {
  64. $fieldDescription->setFieldMapping($metadata->fieldMappings[$fieldDescription->getName()]);
  65. }
  66. // set the default association mapping
  67. if (isset($metadata->associationMappings[$fieldDescription->getName()])) {
  68. $fieldDescription->setAssociationMapping($metadata->associationMappings[$fieldDescription->getName()]);
  69. }
  70. }
  71. if (!$fieldDescription->getType()) {
  72. throw new \RuntimeException(sprintf('Please define a type for field `%s` in `%s`', $fieldDescription->getName(), get_class($admin)));
  73. }
  74. $fieldDescription->setOption('code', $fieldDescription->getOption('code', $fieldDescription->getName()));
  75. $fieldDescription->setOption('label', $fieldDescription->getOption('label', $fieldDescription->getName()));
  76. if (!$fieldDescription->getTemplate()) {
  77. $fieldDescription->setTemplate(sprintf('SonataAdminBundle:CRUD:show_%s.html.twig', $fieldDescription->getType()));
  78. if ($fieldDescription->getMappingType() == ClassMetadataInfo::MANY_TO_ONE) {
  79. $fieldDescription->setTemplate('SonataAdminBundle:CRUD:show_orm_many_to_one.html.twig');
  80. }
  81. if ($fieldDescription->getMappingType() == ClassMetadataInfo::ONE_TO_ONE) {
  82. $fieldDescription->setTemplate('SonataAdminBundle:CRUD:show_orm_one_to_one.html.twig');
  83. }
  84. if ($fieldDescription->getMappingType() == ClassMetadataInfo::ONE_TO_MANY) {
  85. $fieldDescription->setTemplate('SonataAdminBundle:CRUD:show_orm_one_to_many.html.twig');
  86. }
  87. if ($fieldDescription->getMappingType() == ClassMetadataInfo::MANY_TO_MANY) {
  88. $fieldDescription->setTemplate('SonataAdminBundle:CRUD:show_orm_many_to_many.html.twig');
  89. }
  90. }
  91. if ($fieldDescription->getMappingType() == ClassMetadataInfo::MANY_TO_ONE) {
  92. $admin->attachAdminClass($fieldDescription);
  93. }
  94. if ($fieldDescription->getMappingType() == ClassMetadataInfo::ONE_TO_ONE) {
  95. $admin->attachAdminClass($fieldDescription);
  96. }
  97. if ($fieldDescription->getMappingType() == ClassMetadataInfo::ONE_TO_MANY) {
  98. $admin->attachAdminClass($fieldDescription);
  99. }
  100. if ($fieldDescription->getMappingType() == ClassMetadataInfo::MANY_TO_MANY) {
  101. $admin->attachAdminClass($fieldDescription);
  102. }
  103. }
  104. }