24/03/24

Odoo: Facciamo chiarezza sulle XPath - Parte 2

Continuiamo la prima parte dell'articolo riguardo le XPath. Nella prima parte abbiamo visto la tecnologia generale che ci sta alla base del funzionamento delle XPATH.
Ricordo che potete trovare il codice sorgente usato in questo tutorial su questo repository.
Prima di iniziare, riporto un link della documentazione ufficiale di Odoo dove trovare ulteriori informazioni sul funzionamento di XPath su Odoo.


Odoo Xpath Documentation.

Odoo XPath: Struttura generale di una XPATH

Per capire come funziona una Xpath su Odoo è importante prima di tutto capirne la struttura. Di base una Xpath è fatta da:

  • Attributo expr - Contiene il selettore che permette di individuare l'elemento su cui operare
  • Attributo position - Indica la posizione (o l'azione) che si vuole intraprendere
  • Corpo (o contenuto) - Di fatto, contiene le specifiche, con i valori di position [attributes,move], o il contenuto che si vuole iniettare, con i valori di position [inside,after,before,replace].
Di seguito la struttura generale di una Xpath che trovate su Odoo
<xpath expr="..." position="...">
    <!-- Corpo (o contenuto) della XPATH -->
</xpath>
            

Odoo XPath Position: dove mi posiziono?

Nel precedente articolo, abbiamo visto che con l'attributo expr è possibile individuare uno specifico elemento all'interno di una struttura XML.
In aggiunta a questo, è presente l'attributo position che permette di specificare - letteralmente - la posizione dove andare ad iniettare il nostro codice XML.
I valori che abbiamo a disposizione sono:

  • attributes - il corpo della XPATH contiene le regole per modificare gli attributi del tag individuato da expr
  • replace - sostituisce completamente quello che viene individuato dell'espressione expr con il corpo presente nella XPATH
  • inside - inserisce il corpo della XPATH all'interno dell'elemento individuato dall'espressione expr
  • before - inserisce il corpo della XPATH appena prima del tag individuato dall'espressione expr
  • after - inserisce il corpo della XPATH appena dopo del tag individuato dall'espressione expr
  • move - serve a spostare il tag individuato dall'espressione in un altra posizione

Abbiamo già visto nella prima parte come utilizzare il valore attributes.
Di seguito, proveremmo a realizzare quello che è rappresentato in figura con Odoo per capire meglio come funzionano le varie posizioni .
Ho preparato uno schema che ci supporta nel capire meglio il funzionamento delle posizioni.

Odoo XPath Position: Replace

Partendo dall'esempio di modulo presentato nella prima parte, se vogliamo sostituire il titolo allora possiamo usare il selettore che ci permette di prendere il tag del titolo (//h1) e scrivere come contenuto il nuovo titolo che vogliamo sostituire. Diventa semplice a questo punto scrivere la nostra XPath in questo modo:

<xpath expr="//h1" position="replace">
    <h1>Hello, Odoo with Xpath</h1>
</xpath>
In questo caso è importate sottolineare che verrà sostituito TUTTO il contenuto di H1 compreso se stesso.
Questo è il motivo per cui viene specificato nuovamente il tag H1 come contenuto della XPATH.

Odoo XPath Position: Inside

Se vogliamo inserire del contenuto all'interno di un altro elemento, allora bisogna prima costruire il selettore e poi utilizzare il valore inside per l'attributo position.
Nel nostro caso, se vogliamo andare a inserire un DIV dentro un elemento che ha id="mybox", il selettore sarà //div[@id='mybox']" mentre il valore di position sarà inside. Diventa semplice a questo punto scrivere la nostra XPath in questo modo:

<xpath expr="//div[@id='mybox']" position="inside">
    <div style="width: 300px; height:25px; border:1px solid lightgreen;margin-left:10px;">
      INSIDE
    </div>
</xpath>
        

Odoo XPath Position: Before

Se vogliamo inserire un tag DIV prima un elemento che ha id="mybox", allora il selettore da utilizzare sarà //div[@id='mybox']" mentre il valore di position sarà before. Diventa semplice a questo punto scrivere la nostra XPath in questo modo:

<xpath expr="//div[@id='mybox']" position="before">
    <div style="width: 300px; height:25px; border:1px solid orange;">
        BEFORE
    </div>
</xpath>
        

Odoo XPath Position: After

Se vogliamo inserire un tag DIV dopo un elemento che ha id="mybox", allora il selettore da utilizzare sarà //div[@id='mybox']" mentre il valore di position sarà after. Diventa semplice a questo punto scrivere la nostra XPath in questo modo:

<xpath expr="//div[@id='mybox']" position="after">
    <div style="width: 300px; height:25px; border:1px solid purple;">
        AFTER
    </div>
</xpath>
        

Conclusione

Il risultato finale dell'esercizio sarà questo

Abbiamo visto in questo articolo i valori possibili per l'attributo position. Rimane da vedere il valore speciale move che permette si muovere gli elementi all'interno dell'XML.
Nella prossima parte di questa serie di articoli sulle XPath vedremmo di approfondire questo e altri aspetti interessanti sulle Xpath con Odoo.

A presto!