Skip to content

Commit cf94df7

Browse files
authored
BB-22832: Multifile attribute is shown on product visibility page in back-office - 5.1 (#36428)
1 parent fb940cc commit cf94df7

File tree

6 files changed

+85
-11
lines changed

6 files changed

+85
-11
lines changed

Diff for: src/Oro/Bundle/AttachmentBundle/EventListener/MultiFileBlockListener.php

+43-9
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55
use Doctrine\Common\Util\ClassUtils;
66
use Oro\Bundle\AttachmentBundle\Helper\FieldConfigHelper;
7+
use Oro\Bundle\EntityConfigBundle\Attribute\Entity\AttributeFamilyAwareInterface;
8+
use Oro\Bundle\EntityConfigBundle\Config\Id\FieldConfigId;
9+
use Oro\Bundle\EntityConfigBundle\Entity\FieldConfigModel;
10+
use Oro\Bundle\EntityConfigBundle\Manager\AttributeManager;
711
use Oro\Bundle\EntityConfigBundle\Provider\ConfigProvider;
812
use Oro\Bundle\EntityExtendBundle\Event\ValueRenderEvent;
913
use Oro\Bundle\UIBundle\Event\BeforeFormRenderEvent;
@@ -20,6 +24,9 @@ class MultiFileBlockListener
2024
// default priority for view pages
2125
const ADDITIONAL_SECTION_PRIORITY = 1200;
2226

27+
/** @var AttributeManager */
28+
private $attributeManager;
29+
2330
/** @var ConfigProvider */
2431
private $entityConfigProvider;
2532

@@ -32,6 +39,11 @@ public function __construct(ConfigProvider $configProvider, TranslatorInterface
3239
$this->translator = $translator;
3340
}
3441

42+
public function setAttributeManager(AttributeManager $attributeManager): void
43+
{
44+
$this->attributeManager = $attributeManager;
45+
}
46+
3547
public function onBeforeValueRender(ValueRenderEvent $event)
3648
{
3749
if (FieldConfigHelper::isMultiField($event->getFieldConfigId())) {
@@ -53,8 +65,7 @@ public function onBeforeViewRender(BeforeViewRenderEvent $event)
5365
}
5466

5567
$className = ClassUtils::getClass($event->getEntity());
56-
57-
$fieldConfigs = $this->entityConfigProvider->getIds($className);
68+
$fieldConfigs = $this->getConfigs($event->getEntity());
5869
if (!$fieldConfigs) {
5970
return;
6071
}
@@ -66,9 +77,6 @@ public function onBeforeViewRender(BeforeViewRenderEvent $event)
6677

6778
foreach ($fieldConfigs as $fieldConfig) {
6879
$fieldName = $fieldConfig->getFieldName();
69-
if (!FieldConfigHelper::isMultiField($fieldConfig)) {
70-
continue;
71-
}
7280
$config = $this->entityConfigProvider->getConfig($className, $fieldName);
7381

7482
$blockKey = $fieldName . '_block_section';
@@ -103,7 +111,7 @@ public function onBeforeFormRender(BeforeFormRenderEvent $event)
103111

104112
$className = ClassUtils::getClass($event->getEntity());
105113

106-
$fieldConfigs = $this->entityConfigProvider->getIds($className);
114+
$fieldConfigs = $this->getConfigs($event->getEntity());
107115
if (!$fieldConfigs) {
108116
return;
109117
}
@@ -115,9 +123,6 @@ public function onBeforeFormRender(BeforeFormRenderEvent $event)
115123

116124
foreach ($fieldConfigs as $fieldConfig) {
117125
$fieldName = $fieldConfig->getFieldName();
118-
if (!FieldConfigHelper::isMultiField($fieldConfig)) {
119-
continue;
120-
}
121126
$config = $this->entityConfigProvider->getConfig($className, $fieldName);
122127
$newBlockKey = $fieldName . '_block_section';
123128

@@ -139,6 +144,35 @@ public function onBeforeFormRender(BeforeFormRenderEvent $event)
139144
$event->setFormData($scrollData->getData());
140145
}
141146

147+
/**
148+
* @param object $entity
149+
*
150+
* @return FieldConfigModel[]
151+
*/
152+
private function getConfigs(object $entity): array
153+
{
154+
$configManager = $this->entityConfigProvider->getConfigManager();
155+
$className = ClassUtils::getClass($entity);
156+
157+
$ids = $this->entityConfigProvider->getIds($className);
158+
$multiIds = array_filter($ids, fn (FieldConfigId $id) => FieldConfigHelper::isMultiField($id));
159+
160+
if ($entity instanceof AttributeFamilyAwareInterface && $entity->getAttributeFamily()) {
161+
$family = $entity->getAttributeFamily();
162+
$familyFilter = function (FieldConfigId $id) use ($configManager, $family, $className) {
163+
$config = $configManager->getFieldConfig('attribute', $className, $id->getFieldName());
164+
165+
return $config->get('is_attribute')
166+
? $this->attributeManager->getAttributeByFamilyAndName($family, $id->getFieldName())
167+
: true;
168+
};
169+
170+
$multiIds = array_filter($multiIds, $familyFilter);
171+
}
172+
173+
return $multiIds;
174+
}
175+
142176
private function isFileOrImageField(string $type): bool
143177
{
144178
return in_array($type, [FieldConfigHelper::FILE_TYPE, FieldConfigHelper::IMAGE_TYPE], true);

Diff for: src/Oro/Bundle/AttachmentBundle/Resources/config/services.yml

+2
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ services:
171171
arguments:
172172
- '@oro_entity_config.provider.entity'
173173
- '@translator'
174+
calls:
175+
- ['setAttributeManager', ['@oro_entity_config.manager.attribute_manager']]
174176
tags:
175177
- { name: kernel.event_listener, event: entity_form.render.before, method: onBeforeFormRender, priority: -260 }
176178
- { name: kernel.event_listener, event: entity_view.render.before, method: onBeforeViewRender, priority: -260 }

Diff for: src/Oro/Bundle/AttachmentBundle/Tests/Unit/EventListener/MultiFileBlockListenerTest.php

+10-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Oro\Bundle\AttachmentBundle\Tests\Unit\Stub\Entity\TestEntity1;
77
use Oro\Bundle\EntityConfigBundle\Config\Config;
88
use Oro\Bundle\EntityConfigBundle\Config\Id\FieldConfigId;
9+
use Oro\Bundle\EntityConfigBundle\Manager\AttributeManager;
910
use Oro\Bundle\EntityConfigBundle\Provider\ConfigProvider;
1011
use Oro\Bundle\EntityExtendBundle\Event\ValueRenderEvent;
1112
use Oro\Bundle\UIBundle\Event\BeforeFormRenderEvent;
@@ -26,15 +27,23 @@ class MultiFileBlockListenerTest extends \PHPUnit\Framework\TestCase
2627
/** @var ConfigProvider|\PHPUnit\Framework\MockObject\MockObject */
2728
private $configProvider;
2829

30+
/** @var AttributeManager|\PHPUnit\Framework\MockObject\MockObject */
31+
private $attributeManager;
32+
2933
/** @var MultiFileBlockListener */
3034
private $listener;
3135

3236
protected function setUp(): void
3337
{
3438
$this->configProvider = $this->createMock(ConfigProvider::class);
3539
$this->translator = $this->createMock(TranslatorInterface::class);
40+
$this->attributeManager = $this->createMock(AttributeManager::class);
3641

37-
$this->listener = new MultiFileBlockListener($this->configProvider, $this->translator);
42+
$this->listener = new MultiFileBlockListener(
43+
$this->configProvider,
44+
$this->translator,
45+
);
46+
$this->listener->setAttributeManager($this->attributeManager);
3847
}
3948

4049
public function testOnBeforeValueRender()

Diff for: src/Oro/Bundle/UIBundle/Event/BeforeFormRenderEvent.php

+12
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ class BeforeFormRenderEvent extends Event
3434
*/
3535
protected $twigEnvironment;
3636

37+
protected ?string $pageId = null;
38+
3739
/**
3840
* @param FormView $form
3941
* @param array $formData
@@ -48,6 +50,11 @@ public function __construct(FormView $form, array $formData, Environment $twigEn
4850
$this->entity = $entity;
4951
}
5052

53+
public function setPageId(?string $pageId = null): void
54+
{
55+
$this->pageId = $pageId;
56+
}
57+
5158
/**
5259
* @return FormView
5360
*/
@@ -84,4 +91,9 @@ public function getEntity()
8491
{
8592
return $this->entity;
8693
}
94+
95+
public function getPageId(): ?string
96+
{
97+
return $this->pageId;
98+
}
8799
}

Diff for: src/Oro/Bundle/UIBundle/Resources/views/actions/update.html.twig

+1-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
{% endif %}
178178
<div class="layout-content">
179179
{% block content_data %}
180-
{% set data = oro_form_process(data, form, entity) %}
180+
{% set data = oro_form_process_with_page_identifier(data, form, entity, id) %}
181181

182182
{% if entity and data is defined and data.dataBlocks is defined %}
183183
{% set dataBlocks = data.dataBlocks %}

Diff for: src/Oro/Bundle/UIBundle/Twig/UiExtension.php

+17
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,11 @@ public function getFunctions()
135135
[$this, 'processForm'],
136136
['needs_environment' => true]
137137
),
138+
new TwigFunction(
139+
'oro_form_process_with_page_identifier',
140+
[$this, 'processFormWithPageIdentifier'],
141+
['needs_environment' => true]
142+
),
138143
new TwigFunction(
139144
'oro_form_additional_data',
140145
[$this, 'renderAdditionalData'],
@@ -213,7 +218,19 @@ public function processForm(TwigEnvironment $environment, array $data, FormView
213218
{
214219
$event = new BeforeFormRenderEvent($form, $data, $environment, $entity);
215220
$this->getEventDispatcher()->dispatch($event, Events::BEFORE_UPDATE_FORM_RENDER);
221+
return $event->getFormData();
222+
}
216223

224+
public function processFormWithPageIdentifier(
225+
TwigEnvironment $environment,
226+
array $data,
227+
FormView $form,
228+
?object $entity = null,
229+
?string $pageId = null
230+
): array {
231+
$event = new BeforeFormRenderEvent($form, $data, $environment, $entity);
232+
$event->setPageId($pageId);
233+
$this->getEventDispatcher()->dispatch($event, Events::BEFORE_UPDATE_FORM_RENDER);
217234
return $event->getFormData();
218235
}
219236

0 commit comments

Comments
 (0)