Modifica massiva delle opzioni flexform dei plugin di TYPO3 con SQL Replace

A volte è necessario modificare alcune opzioni dei plugin di TYPO3 disposti su centinaia di pagine.

TYPO3 plugin flexform example

Ecco come fare per agire contemporaneamente su alcune centinaia di record con una Query SQL.

Prima di tutto è necessario trovare un contenuto di tipo plugin dentro le pagine, uno di quelli da modificare, segnatevi l'id, servirà dopo.

Installare phpmyadmin o un altro strumento per accedere al db

La tabella interessata è la tt_content, Il campo è pi_flexform, che contiene tutte le configurazioni in formato XML, poiché molti plugin usano il campo pi_flexform per le configurazioni è possibile raffinare la select con il campo list_type.

Eseguire una SELECT per identificare il contenuto al punto uno:

[sql light="true"]
SELECT * FROM `tt_content` WHERE `uid` = <strong>590</strong>
[/sql]

Modificare il risultato in phpmyadmin e trovate nel campo pi_flexform il valore che vi interessa, ad esempio:

[xml light="true"]
<field index="accordionClosed">
<value index="vDEF">0</value>
</field>
[/xml]

Che per esempio sarà da cambiare in

[xml light="true"]
<field index="accordionClosed">
<value index="vDEF">1</value>
</field>
[/xml]

Ora è necessario scrivere la query per l'update, un buon consiglio è scrivere prima una select, in quanto con i vari a capo, spazi e tab non è detto che funzioni al primo colpo.

[sql light="true"]
SELECT * FROM `tt_content` WHERE `pi_flexform` LIKE '%<field index="accordionClosed">
<value index="vDEF">0</value>
</field>%'
[/sql]

Se la query SELECT ha trovato i risultati attesi si può procedere con la UPDATE, altrimenti è necessario controllare i tab, spazi e a capo della condizione WHERE.

Nel mio esempio ho tolto l'ultima riga perché falliva:

[sql light="true"]
SELECT * FROM `tt_content` WHERE `pi_flexform` LIKE '%<field index="accordionClosed">
<value index="vDEF">0</value>%'
[/sql]

e ho aggiunto la condizione sul campo list_type per ottimizzare la select

[sql light="true"]
SELECT * FROM `tt_content` WHERE `pi_flexform` LIKE '%<field index="accordionClosed">
<value index="vDEF">0</value>%'
AND `list_type` LIKE 'jfmulticontent_pi1'
[/sql]

Ed ecco l'UPDATE con REPLACE

[sql light="true"]
UPDATE `tt_content` SET `pi_flexform` = REPLACE(`pi_flexform`, '
<field index="accordionClosed">
<value index="vDEF">0</value>
</field>', '<field index="accordionClosed">
<value index="vDEF">1</value>
</field>') WHERE `list_type` LIKE 'jfmulticontent_pi1'
[/sql]