[script] update structure XML des fichiers articles.

10 juin modifié dans Entraide

Bonjour,

J'ai remarqué à plusieurs reprise que certains champs des fichiers XML des articles ne se mettait pas à jours en migrant d'une (trés) vielle version vers une version plus récentes.

Jusque là je m'en sortait généralement dans notepad++ en faisant une rechercher-> remplacer par
en mettant dans la portion recherche : ^.*(</document>).*$ et dans remplacer par

    <title_htmltag><![CDATA[]]></title_htmltag>
    <thumbnail><![CDATA[]]></thumbnail>
    <thumbnail_alt><![CDATA[]]></thumbnail_alt>
    <thumbnail_title><![CDATA[]]></thumbnail_title>
    <date_creation><![CDATA[]]></date_creation>
    <date_update><![CDATA[]]></date_update>
</document>

soit sans date, soit avec une date bidon et cela fait la manip sur touts les fichier dans le dossier avec une balise fermante </document> sans autres distinctions.

Cette fois-ci , j'ai trouver des articles datant de 2013 à 2023 dans un pluxml arrivé en version 5.5 ;) La manip notepad++ n'est pas terrible, les articles récents auront des doublons vides et comme il sont déjà en ligne et qu'une MAJ vers la 5.8.9 est envisagée, l'idée de faire une maj manuelle sur quelques centaines de dossiers est impensable.

Dans les fichier pour les mise à jour : update/update.x.x.x.php , le test if(!preg_match('/\]\]<\/title_htmltag>/', $data)) est bugué, il ajoute systématiquement la balise , qu'elle soit là ou pas :( .

Je vous propose alors ce script qui va ajouter ces balises seulement si elles sont manquantes:
Voir le script et lamethode corrigée par bazooka : https://forum.pluxml.org/discussion/comment/64833/#Comment_64833

Code édité corrigé selon les conseils du prochain post.
<?php
    include 'prepend.php';
    include 'top.php';
?>

<header class="action-bar"><h1>Mise à jours de structure XML des articles.</h1></header>
<p>Il y a <?= count(glob(PLX_ROOT . $plxAdmin->aConf['racine_articles'] .'*.xml')) ?> fichiers XML dans le dossier.</p>
<p>Ce script ajoute aux fichiers les balises suivantes si manquantes:</p>
<ol>
    <li>&lt;title_htmltag&gt;</li>
    <li>&lt;thumbnail&gt;</li>
    <li>&lt;thumbnail_alt&gt;</li>
    <li>&lt;thumbnail_title&gt;</li>
    <li>&lt;date_creation&gt;(reprend la date dans le nom de fichier.)</li>
    <li>&lt;date_update&gt; (reprend la date dans le nom de fichier.)</li>
</ol>
<?php
    $rewrite=false;
    $i=0;
    foreach(glob(PLX_ROOT . $plxAdmin->aConf['racine_articles'] .'*.xml', GLOB_NOSORT) as $file)   
    { 
        if(preg_match('#^(_?\d{4})\.((?:\d{3},|draft,)*(?:home|\d{3})(?:,\d{3})*)\.(\d{3})\.(\d{12})\.(.*)\.xml$#', basename($file), $capture)) {
            $date = $capture[4];
        }
        if(is_readable($file)) {
            $data = file_get_contents($file);
            if( strpos( $data, 'title_htmltag' ) == false) {
                $data = preg_replace("/<\/document>$/", "\t<title_htmltag><![CDATA[]]></title_htmltag>\n</document>", $data);
                $rewrite=true;
            }
            if(strpos( $data, 'thumbnail' ) == false) {
                $data = preg_replace("/<\/document>$/", "\t<thumbnail><![CDATA[]]></thumbnail>\n</document>", $data);
                $rewrite=true;
            }
            if(strpos( $data, 'thumbnail_alt' ) == false) {
                $data = preg_replace("/<\/document>$/", "\t<thumbnail_alt><![CDATA[]]></thumbnail_alt>\n</document>", $data);
            $rewrite=true;
            }
            if(strpos( $data, 'thumbnail_title' ) == false) {
                $data = preg_replace("/<\/document>$/", "\t<thumbnail_title><![CDATA[]]></thumbnail_title>\n</document>", $data);
                $rewrite=true;
            }
            if(strpos( $data, 'date_creation' ) == false) {
                $data = preg_replace("/<\/document>$/", "\t<date_creation><![CDATA[$date]]></date_creation>\n</document>", $data);
                $rewrite=true;
            }
            if(strpos( $data, 'date_update' ) == false) {
                $data = preg_replace("/<\/document>$/", "\t<date_update><![CDATA[$date]]></date_update>\n</document>", $data);
                $rewrite=true;
            }

            if($rewrite==true){
                ++$i;
                $file_handle = fopen($file, 'w'); 
                fwrite($file_handle, $data);
                fclose($file_handle);

            }
        }
    }  
    echo 'Mise à jour des structures XML de <b style="color:tomato">'.$i.'</b> fichier(s) effectuée(s).';

    include  'foot.php';
?>

À mettre dans un fichier **updateArticle.php** dans le repertoire **core/admin** , puis se connecter à l'admin et appeler le fichier `://votresite.com/core/admin/updateArticle.php`

Une fois vos articles reconstruit en mode 2024. Le script ne modifiera les fichiers qu'une seule fois et seulement au besoin

J’espère qu'il vous sera utile.

Par précaution, faites toujours un backup de vos fichiers avant de le lancer une routine qui va les modifier


Cordialement,
gcyrillus , simple membre du forum et utilisateur de pluxml

Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

Réponses

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Bonjour,
    Normalement les dernières versions de PluXml gèrent l'absence de ces balises.
    Attention avec l'utilisation de strpos() . Tu recherches d'abord thumbnail avant thumbnail_title.
    Avec la recherche de thumbnail, le remplacement se fera à la fois pour thumbnail et le thumbmail de thumbnail_title.. Il faut encadrer avec les caractères < et >
    Il est préférable, par sécurité, de mettre ce script dans le dossier core/admin et de vérifier l'authentification avec prepend.php
    Si le site est bien paramétré, l'exécution d'un script .php doit être impossible dans le dossier data et ses sous-dossiers, excepté pour data/statiques.
    Voici ton script corrigé à placer dans le dossier core/admin:

    <?php
    
    include 'prepend.php';
    
    const TAGS = array(
        'title_htmltag',
        'thumbnail_alt',
        'thumbnail',
        'thumbnail_title',
        'date_creation',
        'date_update',
    );
    
    $files = glob(PLX_ROOT . $plxAdmin->aConf['racine_articles'] . '*.xml');
    
    include 'top.php';
    ?>
        <h1>Mise à jours de structure XML des articles.</h1>
        <p>Il y a <?= count($files) ?> fichiers XML dans le dossier.</p>
        <p>Ce script ajoute aux fichiers les balises suivantes si manquantes:</p>
        <ol>
    <?php
        foreach(TAGS as $tag) {
    ?>
            <li>&lt;<?= $tag ?>&gt;</li>
    <?php
        }
    ?>
        </ol>
        <p>Les fichiers suivant ont été mis à jour :</p>
        <ol>
    <?php
        $motif = '#^(_?\d{4})\.((?:draft,|pin,|\d{3},)*(?:home|\d{3})(?:,\d{3})*)\.(\d{3})\.(\d{12})\.(.*)\.xml$#';
        foreach($files as $file) {
            if(preg_match($motif, basename($file), $capture) and is_writable($file)) {
                $date = $capture[4];
                $data = file_get_contents($file);
                $replaces = array();
                foreach(TAGS as $tag) {
                    $mf = '#<' . $tag . '>#';
                    if(!preg_match($mf, $data)) {
                        $text = in_array($tag, array('date_creation','date_update',)) ? $date : '';
                        ob_start();
    ?>
        <<?= $tag ?>><?= $text ?></<?= $tag ?>
    <?php
                        $replaces[] = ob_get_clean();
                    }
                }
                if(!empty($replaces)) {
                    $data = preg_replace('#</document>#', implode("\n", $replaces) . "\n</document>", $data);
                    file_put_contents($file, $data);
    ?>
            <li><?= basename($file) ?></li>
    <?php
                }
            }
        }
    ?>
        </ol>
        <p>Terminé !</p>
    </body></html>
    

    As-tu une archive de ces très vieilles versions de PluXml ?
    La plus vieille version sur github est la 5.1.7.
    Alors que dans le dossier update, on a

    • update_4.2.php
    • update_5.0.php
    • update_5.1.1.php
    • update_5.1.3.php
    • update_5.1.4.php
    • update_5.1.6.php
  • 10 juin modifié

    @bazooka07 Merci des conseils, script corrigé. =)

    Pour le pluxml en cause c'est actuellement un 5.5 qui à évolué depuis une ou plusieurs version antérieurs.

    Les articles plus anciens ont cette structures:

    <?xml version='1.0' encoding='UTF-8'?>
    <document>
        <title><![CDATA[]]></title>
        <allow_com></allow_com>
        <template><![CDATA[]]></template>
        <chapo><![CDATA[]]></chapo>
        <content><![CDATA[]]></content>
        <tags><![CDATA[]]></tags>
        <meta_description><![CDATA[]]></meta_description>
        <meta_keywords><![CDATA[]]></meta_keywords>
        <title_htmltag><![CDATA[]]></title_htmltag>
    </document>
    

    Aucune mise à jours depuis la 5.1.7 n'ajoutes les champs date et image d'accroche me semble t-il.

    Lorsque les champs dates sont manquant ou vides , il y a dans l'admin plusieurs lignes de warnings. Il suffit d'enregistrer l'article et tout rentre dans l'ordre ;) Je voulais éviter ses warnings (qui n'apparaissent qu'a l'édition d'un article dans le cas de champs manquant ou vide pour ceux des dates). Je réalise en écrivant cela, qu'il suffirait probablement de boucler sur les articles d'une période données et de les réenregistrer pour recréer les champs manquant :(

    Pour de vielles version de Pluxml, je dois avoir quelques unes des premières version jusqu'à la 4.11 , après je n'ai que celle encore dispos en ligne car j'avais décroché de 2011 à 2021 . Mais là, les structures des articles étaient du genre :

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <document>
    
        <infopost>
            <title></title>
            <author></author>
            <allow_com>1</allow_com>
        </infopost>
        <chapo>
            <![CDATA[]]>
        </chapo>
        <content>
            <![CDATA[]]>
        </content>
    
    </document>
    

    J'ai aussi retrouvé un script de migration de la 3 vers la 4 :)
    Je ne crois pas qu'il y est des versions de PluXml de cette époque encore actifs en ligne.


    edit


    j'ai retrouvé ces archives :

    1. pluxml_preview_0.1.1.zip
    2. pluxml_preview_0.1.2.zip
    3. pluxml_preview_0.1.3.zip
    4. pluxml_preview_0.1.4.zip
    5. pluxml_preview_0.2.0.zip
    6. blog-beta-02-07.zip
    7. pluxml0.3.1.zip
    8. pluxml-blog-beta2.zip
    9. pluxml-blog-beta3.zip
    10. pluxml-blog-beta3-1.zip
    11. migration-blog-beta3x-beta4.zip
    12. pluxml-blog-beta4.zip
    13. pluxml-blog-beta4-2.zip
    14. pluxml-beta4.zip
    15. pluxml-5.1.2.zip
    16. pluxml-5.1.6.zip


    Cordialement,
    gcyrillus , simple membre du forum et utilisateur de pluxml

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

Connectez-vous ou Inscrivez-vous pour répondre.