Magento 1

Riordinare le voci nell’area clienti ed i js e css: the right way

Prima di sviluppare qualsiasi funzionalità è bene verificare che qualcuno non ci abbia già pensato, un dogma piuttosto consolidato per chi si occupa di sviluppo software, noto come “non reinventare la ruota”.

La competenza è quindi, spesso, discernere tra le soluzioni trovate, quelle ritenute più corrette.

Nei casi più sfortunati non ne troviamo nessuna che ci convinca o che ci fornisca anche solo una traccia da cui partire.

È il caso dell’ordinamento delle voci di menù nell’account cliente e dell’ordine di caricamento dei javascript e css nei layout xml.

Qualora volessi aggiungere un mio javascript e accertarmi che venga eseguito prima di altri script di sistema oppure volessi mettere una voce subito dopo Account nell’area cliente, la soluzione che si trova in rete è la seguente ed è comune ai 2 scenari:

  1. effettuare una serie di action remove di tutti gli elementi che devono venire dopo quello che voglio aggiungere

  2. una action addLink con il link/item che voglio aggiungere

  3. una nuova action di aggiunta per tutti gli elementi che avevo precedentemente rimosso

Una soluzione sicuramente poco elegante.

L’alternativa

Di seguito i file relativi a un modulo che propone un metodo alternativo con relativa spiegazione dei passaggi:

/app/etc/modules/Bitbull_SimpleOrder.xml

Essenzialmente dichiariamo l’esistenza del modulo con le dipendenze dei moduli che andremo ad estendere

app/code/local/Bitbull/SimpleOrder/etc/config.xml

Non essendoci observer adatti per il comportamento che dobbiamo sovrascrivere vengono effettuati direttamente il rewrite dei moduli base. L’observer dichiarato è stato aggiunto a seguito della scrittura dell’articolo, e ne spiego il funzionamento in coda all’articolo.

app/code/local/Bitbull/SimpleOrder/Block/Customer/Account/Navigation.php

Ed eccoci alla parte interessante del modulo. L’idea prende spunto dalla dichiarazione e gestione dell’ordinamento delle configurazioni del control panel (il sort_order nei system.xml).

Il metodo getLinks non fa altro che richiamare un metodo dell’helper che si occupa di riordinare gli elementi in base all’attributo o chiave “position”.

Il metodo addLink come avrete già dedotto si occupa di aggiungere ai links l’attributo position che dichiareremo nell’xml per il nostro link. Ma non solo: gli elementi già esistenti non hanno una position quindi non funzionerebbe, per questo il primo if serve ad assegnargliene una se non viene passata tramite il parametro position (ovvero tutti gli elementi tranne quelli che dichiareremo noi o sovrascriveremo).

app/code/local/Bitbull/SimpleOrder/Helper/Data.php

l’helper essenzialmente si occupa di ordinare tramite una callback interna allo stesso gli elementi che siano array o oggetti per “position”.

app/code/local/Bitbull/SimpleOrder/Block/Page/Html/Head.php

In realtà il modulo è già praticamente finito, in quanto qui viene proposto il blocco con la medesima logica per ordinare js e css al momento del load, mentre prima erano le voci relative all’account del customer.

Unica nota rilevante per quanto riguarda gli items rispetto ai links è che Magento li dividerà comunque per tipo secondo queste tipologie, che si basano su dove vengono trovati i file:

  • ‘js’: // js/*.js

  • ‘skin_js’: // skin/*/*.js

  • ‘js_css’: // js/*.css

  • ‘skin_css’: // skin/*/*.css

Di fatto quinti potrete ordinare il caricamento di file solo tra loro per tipologia.

l’xml che manca infatti altro non è che la messa in pratica della logica qui implementata

/var/www/html/magento/app/design/frontend/{TEMA}/default/layout/bitbull_simpleorder.xml

in viene aggiunto un css che verrà inserito dopo il primo elemento tra js e css caricato da Magento

in viene aggiunta una nuova voce “I miei preventivi” anche qui verosimilmente dopo la voce account.

In particolare per il primo notiamo che nonostante non vengano valorizzati vengono dichiarati (o urlParams nel caso di customer_account) il motivo è che l’instanziazione degli argomenti di addItem e AddLink è posizionale, se venissero omessi quindi il valore di position andrebbe in params.

Finito l’articolo però, mi hanno fatto notare che non è comodo supporre quale siano le posizioni assegnate, e bisognerebbe andare “a tentativi”.

Ho realizzato quest’altra parte di codice utile più che a livello di funzionalità nell’aiuto a livello di sviluppo.

app/code/local/Bitbull/SimpleOrder/Model/Observer.php

Sostanzialmente agganciandomi a controller_action_postdispatch tramite observer verifico che ci sia un parametro GET showLayout che se valorizzato a itemsOrder mi farà vedere gli items relativi all’head, nel caso invece sia valorizzato a linksOrder stamperà gli oggetti links con relativa position all’interno.

Ad esempio per vedere i links nella dashboard del customer basterà chiamare: [MYSITE]/customer/account/?showLayout=linksOrder

In questo modo posso vedere qual’è la reale position che viene assegnata e decidere quella che voglio assegnare a quell oche voglio aggiungere io di conseguenza.

Qui link di git, ho omesso la parte relativa a bitbull_simpleorder.xml perchè contestuale all’esempio.Sicuramente è migliorabile perchè ad esmepio l’ordinamento riguarda soltanto i blocchi che abbiamo esteso, ma è un buon inizio ed è facilmente customizzabile se mi avete seguito fino a qui.

In conclusione se non trovate una soluzione in rete che vi convinca può essere una buona idea, controllare se già in Magento esista qualcosa di analogo o come base da cui partire, come in questo caso. Se infine neanche qui trovate qualcosa di valido, l’ultima risorsa, e probabilmente la più preziosa di uno sviluppatore, sta nella sua creatività che nella disperazione trova, di solito, terreno fertile.

Alla prossima

☝ Ti piace quello che facciamo?  Unisciti a noi!