@@ -117,6 +117,7 @@ public function addTab($tabId, $tab)
117
117
if (empty ($ tabId )) {
118
118
throw new \Exception (__ ('Please correct the tab configuration and try again. Tab Id should be not empty ' ));
119
119
}
120
+
120
121
if (is_array ($ tab )) {
121
122
$ this ->_tabs [$ tabId ] = new \Magento \Framework \DataObject ($ tab );
122
123
} elseif ($ tab instanceof \Magento \Framework \DataObject) {
@@ -126,13 +127,15 @@ public function addTab($tabId, $tab)
126
127
}
127
128
} elseif (is_string ($ tab )) {
128
129
$ this ->_addTabByName ($ tab , $ tabId );
130
+
129
131
if (!$ this ->_tabs [$ tabId ] instanceof TabInterface) {
130
132
unset($ this ->_tabs [$ tabId ]);
131
133
return $ this ;
132
134
}
133
135
} else {
134
136
throw new \Exception (__ ('Please correct the tab configuration and try again. ' ));
135
137
}
138
+
136
139
if ($ this ->_tabs [$ tabId ]->getUrl () === null ) {
137
140
$ this ->_tabs [$ tabId ]->setUrl ('# ' );
138
141
}
@@ -143,10 +146,7 @@ public function addTab($tabId, $tab)
143
146
144
147
$ this ->_tabs [$ tabId ]->setId ($ tabId );
145
148
$ this ->_tabs [$ tabId ]->setTabId ($ tabId );
146
-
147
- if ($ this ->_activeTab === null ) {
148
- $ this ->_activeTab = $ tabId ;
149
- }
149
+
150
150
if (true === $ this ->_tabs [$ tabId ]->getActive ()) {
151
151
$ this ->setActiveTab ($ tabId );
152
152
}
@@ -235,32 +235,79 @@ protected function _setActiveTab($tabId)
235
235
*/
236
236
protected function _beforeToHtml ()
237
237
{
238
+ $ this ->_tabs = $ this ->reorderTabs ();
239
+
240
+ if ($ this ->_activeTab === null ) {
241
+ foreach ($ this ->_tabs as $ tab ) {
242
+ $ this ->_activeTab = $ tab ->getId ();
243
+ break ;
244
+ }
245
+ }
246
+
238
247
if ($ activeTab = $ this ->getRequest ()->getParam ('active_tab ' )) {
239
248
$ this ->setActiveTab ($ activeTab );
240
249
} elseif ($ activeTabId = $ this ->_authSession ->getActiveTabId ()) {
241
250
$ this ->_setActiveTab ($ activeTabId );
242
251
}
243
-
244
- $ _new = [];
252
+
253
+ $ this ->assign ('tabs ' , $ this ->_tabs );
254
+ return parent ::_beforeToHtml ();
255
+ }
256
+
257
+
258
+ /**
259
+ * @return array
260
+ */
261
+ protected function reorderTabs ()
262
+ {
263
+ $ orderByIdentity = [];
264
+ $ orderByPosition = [];
265
+
266
+ $ position = 100 ;
267
+
268
+ /**
269
+ * @var string $key
270
+ * @var \Magento\Backend\Block\Widget\Tab\TabInterface $tab
271
+ */
245
272
foreach ($ this ->_tabs as $ key => $ tab ) {
246
- foreach ($ this ->_tabs as $ k => $ t ) {
247
- if ($ t ->getAfter () == $ key ) {
248
- $ _new [$ key ] = $ tab ;
249
- $ _new [$ k ] = $ t ;
250
- } else {
251
- if (!$ tab ->getAfter () || !in_array ($ tab ->getAfter (), array_keys ($ this ->_tabs ))) {
252
- $ _new [$ key ] = $ tab ;
253
- }
254
- }
273
+ $ tab ->setPosition ($ position );
274
+
275
+ $ orderByIdentity [$ key ] = $ tab ;
276
+ $ orderByPosition [$ position ] = $ tab ;
277
+
278
+ $ position += 100 ;
279
+ }
280
+
281
+ $ positionFactor = 1 ;
282
+
283
+ foreach ($ orderByPosition as $ position => $ tab ) {
284
+ if (!$ tab ->getAfter () || !in_array ($ tab ->getAfter (), array_keys ($ orderByIdentity ))) {
285
+ $ positionFactor = 1 ;
286
+ continue ;
255
287
}
288
+
289
+ $ grandPosition = $ orderByIdentity [$ tab ->getAfter ()]->getPosition ();
290
+ $ newPosition = $ grandPosition + $ positionFactor ;
291
+
292
+ unset($ orderByPosition [$ position ]);
293
+ $ orderByPosition [$ newPosition ] = $ tab ;
294
+ $ tab ->setPosition ($ newPosition );
295
+
296
+ $ positionFactor ++;
256
297
}
257
-
258
- $ this ->_tabs = $ _new ;
259
- unset($ _new );
260
-
261
- $ this ->assign ('tabs ' , $ this ->_tabs );
262
- return parent ::_beforeToHtml ();
298
+
299
+ ksort ($ orderByPosition );
300
+
301
+ $ ordered = [];
302
+
303
+ /** @var $tab */
304
+ foreach ($ orderByPosition as $ tab ) {
305
+ $ ordered [$ tab ->getId ()] = $ tab ;
306
+ }
307
+
308
+ return $ ordered ;
263
309
}
310
+
264
311
265
312
/**
266
313
* @return string
0 commit comments