44
55use Doctrine \Common \Util \ClassUtils ;
66use 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 ;
711use Oro \Bundle \EntityConfigBundle \Provider \ConfigProvider ;
812use Oro \Bundle \EntityExtendBundle \Event \ValueRenderEvent ;
913use 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 );
0 commit comments