22
33namespace Loki \AdminComponents \Component \Form ;
44
5+ use Loki \AdminComponents \Form \Field \Field ;
6+ use Loki \AdminComponents \Form \Field \FieldFactory ;
7+ use Loki \AdminComponents \Form \FieldResolver ;
8+ use Loki \AdminComponents \Form \Fieldset \Fieldset ;
9+ use Loki \AdminComponents \Form \Fieldset \FieldsetFactory ;
510use Loki \AdminComponents \Form \ItemConvertorInterface ;
11+ use Loki \AdminComponents \Ui \Button ;
12+ use Loki \AdminComponents \Ui \ButtonFactory ;
13+ use Loki \Components \Component \ComponentViewModel ;
614use Magento \Framework \App \RequestInterface ;
715use Magento \Framework \DataObject ;
816use Magento \Framework \Exception \LocalizedException ;
917use Magento \Framework \ObjectManagerInterface ;
1018use Magento \Framework \UrlFactory ;
11- use Magento \Framework \View \Element \Template ;
12- use Loki \AdminComponents \Form \Field \Field ;
13- use Loki \AdminComponents \Form \Field \FieldFactory ;
14- use Loki \AdminComponents \Ui \Button ;
15- use Loki \AdminComponents \Ui \ButtonFactory ;
16- use Loki \Components \Component \ComponentViewModel ;
1719
1820/**
1921 * @method FormRepository getRepository()
@@ -25,7 +27,9 @@ public function __construct(
2527 protected ButtonFactory $ buttonFactory ,
2628 protected ObjectManagerInterface $ objectManager ,
2729 protected FieldFactory $ fieldFactory ,
30+ protected FieldsetFactory $ fieldsetFactory ,
2831 protected RequestInterface $ request ,
32+ protected FieldResolver $ fieldResolver ,
2933 protected array $ itemFilters = [],
3034 ) {
3135 }
@@ -89,93 +93,60 @@ public function getButtons(): array
8993 }
9094
9195 /**
92- * @return Field[]
93- * @throws LocalizedException
94- * @todo Move this to Form
96+ * @return Fieldset[]
9597 */
96- public function getFields (): array
98+ public function getFieldsets (): array
9799 {
98- $ resourceModel = $ this ->getRepository ()->getResourceModel ();
99- if (!$ resourceModel ) {
100- return [];
101- }
102-
103- $ fieldDefinitions = (array )$ this ->getBlock ()->getFields ();
100+ $ fieldsets = [];
101+ $ fieldsets ['base ' ] = $ this ->fieldsetFactory ->create ('base ' );
104102
105- $ fields = [];
106- $ tableColumns = $ resourceModel ->getConnection ()->describeTable ($ resourceModel ->getMainTable ());
107-
108- foreach ($ tableColumns as $ tableColumn ) {
109- $ columnName = $ tableColumn ['COLUMN_NAME ' ];
110- $ fieldType = $ this ->getFieldTypeCodeFromColumn ($ tableColumn );
111- if ($ columnName === $ resourceModel ->getIdFieldName ()) {
112- $ fieldType = 'view ' ;
103+ $ fieldsetDefinitions = (array )$ this ->getBlock ()->getFieldsets ();
104+ foreach ($ fieldsetDefinitions as $ fieldsetCode => $ fieldsetDefinition ) {
105+ if (empty ($ fieldsetCode )) {
106+ $ fieldsetCode = 'base ' ;
113107 }
114108
115- $ fieldLabel = $ this ->getLabelByColumn ($ tableColumn ['COLUMN_NAME ' ]);
116- $ code = $ tableColumn ['COLUMN_NAME ' ];
117-
118- if (empty ($ fieldType )) {
119- // @todo: echo 'Unknown field type: '.$tableColumn['DATA_TYPE'];
109+ if (array_key_exists ($ fieldsetCode , $ fieldsets )) {
120110 continue ;
121111 }
122112
123- $ block = $ this ->getBlock ()->getLayout ()->createBlock (Template::class);
124- $ fieldData = [
125- 'field_type ' => $ fieldType ,
126- 'code ' => $ code ,
127- 'label ' => $ fieldLabel ,
128- 'required ' => false ,
129- 'sort_order ' => 0 ,
130- 'field_attributes ' => [],
131- 'label_attributes ' => [],
132- ];
133-
134- if (array_key_exists ($ columnName , $ fieldDefinitions )) {
135- $ fieldDefinition = (array )$ fieldDefinitions [$ columnName ];
136- $ fieldData = array_merge ($ fieldData , $ fieldDefinition );
137- }
138-
139- $ fields [] = $ this ->fieldFactory ->create (
140- $ block ,
141- $ fieldData ,
142- );
113+ $ fieldsets [$ fieldsetCode ] = $ this ->fieldsetFactory ->create ($ fieldsetCode , $ fieldsetDefinition ['label ' ]);
143114 }
144115
145- usort ($ fields , function (Field $ field1 , Field $ field2 ) {
146- return $ field1 ->getSortOrder () <=> $ field2 ->getSortOrder ();
147- });
148-
149- return $ fields ;
150- }
116+ $ fieldDefinitions = (array )$ this ->getBlock ()->getFields ();
117+ $ fields = $ this ->fieldResolver ->resolve ($ this ->getRepository (), $ fieldDefinitions );
151118
152- private function getFieldTypeCodeFromColumn (array $ tableColumn ): false |string
153- {
154- if ($ tableColumn ['COLUMN_NAME ' ] === $ this ->getRepository ()->getPrimaryKey ()) {
155- return 'view ' ;
156- }
119+ foreach ($ fields as $ field ) {
120+ $ fieldsetCode = (string )$ field ->getFieldset ();
157121
158- if (in_array ($ tableColumn ['DATA_TYPE ' ], ['datetime ' ])) {
159- return 'datetime ' ;
160- }
122+ if (!empty ($ fieldsetCode ) && array_key_exists ($ fieldsetCode , $ fieldsets )) {
123+ $ fieldsets [$ fieldsetCode ]->addField ($ field );
124+ continue ;
125+ }
161126
162- if (in_array ($ tableColumn ['DATA_TYPE ' ], ['date ' ])) {
163- return 'date ' ;
127+ $ fieldsets ['base ' ]->addField ($ field );
164128 }
165129
166- if (in_array ($ tableColumn ['DATA_TYPE ' ], ['tinyint ' ])) {
167- return 'switch ' ;
168- }
130+ return $ fieldsets ;
131+ }
169132
170- if (in_array ($ tableColumn ['DATA_TYPE ' ], ['int ' ])) {
171- return 'number ' ;
172- }
133+ /**
134+ * @return Field[]
135+ * @throws LocalizedException
136+ * @deprecated Use getFieldsets() instead
137+ */
138+ public function getFields (): array
139+ {
140+ $ fields = $ this ->fieldResolver ->resolve (
141+ $ this ->getRepository (),
142+ (array )$ this ->getBlock ()->getFields (),
143+ );
173144
174- if (in_array ( $ tableColumn [ ' DATA_TYPE ' ], [ ' varchar ' , ' text ' , ' smalltext ' , ' mediumtext ' ] )) {
175- return ' input ' ;
145+ if (empty ( $ fields )) {
146+ return $ fields ;
176147 }
177148
178- return false ;
149+ return $ fields ;
179150 }
180151
181152 private function getIndexUri (): string
@@ -195,14 +166,4 @@ private function getIndexUri(): string
195166
196167 return '*/*/index ' ;
197168 }
198-
199- private function getLabelByColumn (string $ columnName ): string
200- {
201- $ label = (string )__ ($ columnName );
202- if ($ label !== $ columnName ) {
203- return $ label ;
204- }
205-
206- return ucfirst (str_replace ('_ ' , ' ' , $ label ));
207- }
208169}
0 commit comments