vendor/sulu/form-bundle/Content/Types/SingleFormSelection.php line 77

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of Sulu.
  4. *
  5. * (c) Sulu GmbH
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace Sulu\Bundle\FormBundle\Content\Types;
  11. use Sulu\Bundle\FormBundle\Form\BuilderInterface;
  12. use Sulu\Bundle\FormBundle\Repository\FormRepository;
  13. use Sulu\Bundle\WebsiteBundle\ReferenceStore\ReferenceStoreInterface;
  14. use Sulu\Component\Content\Compat\PropertyInterface;
  15. use Sulu\Component\Content\Compat\Structure\PageBridge;
  16. use Sulu\Component\Content\Compat\Structure\StructureBridge;
  17. use Sulu\Component\Content\SimpleContentType;
  18. use Symfony\Component\Form\FormInterface;
  19. use Symfony\Component\Form\FormView;
  20. use Symfony\Component\Validator\Exception\MissingOptionsException;
  21. /**
  22. * ContentType for selecting a form.
  23. */
  24. class SingleFormSelection extends SimpleContentType
  25. {
  26. /**
  27. * @var FormRepository
  28. */
  29. private $formRepository;
  30. /**
  31. * @var BuilderInterface
  32. */
  33. private $formBuilder;
  34. /**
  35. * @var ReferenceStoreInterface
  36. */
  37. private $referenceStore;
  38. public function __construct(
  39. FormRepository $formRepository,
  40. BuilderInterface $formBuilder,
  41. ReferenceStoreInterface $referenceStore
  42. ) {
  43. parent::__construct('SingleFormSelection', '');
  44. $this->formRepository = $formRepository;
  45. $this->formBuilder = $formBuilder;
  46. $this->referenceStore = $referenceStore;
  47. }
  48. /**
  49. * @return FormView|null
  50. */
  51. public function getContentData(PropertyInterface $property)
  52. {
  53. $id = (int) $property->getValue();
  54. if (!$id) {
  55. return null;
  56. }
  57. if (!isset($property->getParams()['resourceKey'])) {
  58. throw new MissingOptionsException('SuluFormBundle: The parameter "resourceKey" is missing on "single_form_selection" content-type.', []);
  59. }
  60. /** @var string $resourceKey */
  61. $resourceKey = $property->getParams()['resourceKey']->getValue();
  62. /** @var PageBridge $structure */
  63. $structure = $property->getStructure();
  64. $form = $this->formBuilder->build(
  65. $id,
  66. $resourceKey,
  67. (string) $structure->getUuid(),
  68. $structure->getLanguageCode(),
  69. $property->getName()
  70. );
  71. if (!$form) {
  72. $form = $this->loadShadowForm($property, $id, $resourceKey);
  73. if (!$form) {
  74. return null;
  75. }
  76. }
  77. $this->referenceStore->add($id);
  78. return $form->createView();
  79. }
  80. private function loadShadowForm(PropertyInterface $property, int $id, string $type): ?FormInterface
  81. {
  82. $structure = $property->getStructure();
  83. if (!$structure instanceof StructureBridge) {
  84. return null;
  85. }
  86. if (!$structure->getIsShadow()) {
  87. return null;
  88. }
  89. return $this->formBuilder->build(
  90. $id,
  91. $type,
  92. (string) $structure->getUuid(),
  93. $structure->getShadowBaseLanguage(),
  94. $property->getName()
  95. );
  96. }
  97. /**
  98. * @return mixed[]
  99. */
  100. public function getViewData(PropertyInterface $property)
  101. {
  102. $id = (int) $property->getValue();
  103. if (!$id) {
  104. return [];
  105. }
  106. $locale = $property->getStructure()->getLanguageCode();
  107. $formEntity = $this->formRepository->loadById($id, $locale);
  108. if (!$formEntity) {
  109. return [];
  110. }
  111. return [
  112. 'entity' => $formEntity->serializeForLocale($locale),
  113. ];
  114. }
  115. }