developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Opened 13 years ago

Closed 13 years ago

Last modified 13 years ago

#392 closed new feature (fixed)

Passage en RC1 - le script qui change les selecteurs !

Reported by: Torgan Owned by:
Priority: normal Milestone: Jelix 1.0RC2
Component: jelix-scripts Version: 1.0RC1
Severity: normal Keywords: action selector
Cc: Blocked By:
Blocking: Documentation needed:
Hosting Provider: Php version:

Description

Bon alors sur le changelog (http://jelix.org/articles/changelog/1.0), on peut voir que les selecteur d'action changent légèrement de tête. Il est bien sur quasiment impossible de faire les modifications totalement automatiquement (en particulier à cause des actions 'dynamiques' faisant uintervenir des variables), mais pour la plupart des chaines en dur, on peut s'arranger (et à vrai dire, quand j'ai vu que j'avais plus de 2000 selecteurs à changer, j'ai fait un petit script).

c'est donc un script utilisable avec cmdLine.php, de la manière suivante :

php cmdline.php script~torc1_changeActionSelector

Si on veut l'exécuter sur un autre répertoire que le répertoire modules de l'application courante, on peut utiliser l'option --directory (mais j'ai pas testé)

php cmdline.php script~torc1_changeActionSelector --directory '/home/bidule'

Bon on exécute donc le script, il va chercher dans tous les fichiers du répertoire concernés les choses suivantes :

  • jUrl::get(...
  • {jurl ... (pour les jurl dans les templates)
  • ->action = ... (pour les actions de redirection)

On lance le script, qui donne un ensemble de lignes du style :

...
/path/file1.php [6] -> [6]... OK
/path/file2.php [4] -> [4]... OK
/path/file3.php [3] -> [1]... NOK
...

Ca veut dire que les fichiers 1 et 2 ont été analysés et toutes les occurences ont pu être converties correctement, tout va bien. On retrouve le fichier dans le répertoire JELIX_APP_TEMP_PATH . 'changeActionSelector'.

Pour le fichier 3, on a fait une seule substitution alors qu'il y avait 3 occurence. Vraisemblablement il faudra s'occuper de ce fichier à la main plus tranquillement. Il est également dans le répertoire final.

Voilà, ça fait pas le café ni la vaisselle, mais dans mon cas, ça réduit le nombre de fichiers à gérer de 2000 à 34... Ca me va.

Et voilà donc le script (qui nécessite d'être sur un unix qeulconque je pense) :

<?php
/**
* @package script
* @version $Id:$
* @author  Yannick Le Guédart (yannick at over-blog dot com)
*/

class torc1Ctrl extends jControllerCmdLine 
{
    protected $allowed_options = 
                array 
                (
                        'changeActionSelector' => 
                                array 
                                (
                                        '--directory' => true
                                )
                );
                
    protected $allowed_parameters =
                array 
                (
                        'changeActionSelector' => array ()
                );

                
        private $_rep;
        private $_directory;
        private $_destDirectory;
                
        /**
        * changeActionSelector
        *
        * The paramaters : 
        * 
        *       --directory : the base directory in the Jelix app (modules by default)
        *
        * @access public
        * @author Yannick Le Guédart (yannick at over-blog dot com)
        * @version 1.0
        */
        
        public function changeActionSelector ()
        {
                $this->_rep = $this->getResponse('text');
                
                // ---------------------------------------------------------------------
                // Récupération des options
                // ---------------------------------------------------------------------

                $this->_directory = $this->option ('--directory');
                
                if (empty ($this->_directory))
                {
                        $this->_directory = 'modules';
                }
                
                $this->_rep->content .= "Directory : $this->_directory\n";
                
                // ---------------------------------------------------------------------
                // nettoyage du répertoire temporaire de destination
                // ---------------------------------------------------------------------

                $this->_destDirectory = JELIX_APP_TEMP_PATH . 'changeActionSelector';
                
                `rm -Rf  $this->_destDirectory`;
                
                $this->_rep->content .= 
                        "Creating destination directory : [$this->_destDirectory]\n";
                
                mkdir ($this->_destDirectory);
                
                // ---------------------------------------------------------------------
                // Modifications
                // ---------------------------------------------------------------------

                $this->_jUrlGet ();
                $this->_jUrlTemplate ();
                $this->_redirectAction ();
                
                return $this->_rep;
        }
        
        private function _jUrlGet ()
        {
                // ---------------------------------------------------------------------
                // Liste des fichiers
                // ---------------------------------------------------------------------

                $fileList = array ();
                
                $grepCmd = 
                        "grep -R 'jUrl::get' " . JELIX_APP_PATH . 
                        $this->_directory . " | grep -v svn";
                
                foreach (split ("\n", `$grepCmd`) as $line)
                {
                        $file = 
                                substr 
                                (
                                        $line, 
                                        0,
                                        strpos ($line, ':')
                                );
                
                        if (!empty ($file))
                        {
                                if (isset ($fileList[$file]))
                                {
                                        $fileList[$file] ++;
                                }
                                else
                                {
                                        $fileList[$file] = 1;
                                }
                        }
                }

                // ---------------------------------------------------------------------
                // Traitement des fichiers
                // ---------------------------------------------------------------------

                foreach ($fileList as $file => $nb)
                {
                        $this->_rep->content .= "$file [$nb] -> ";
                
                        $content = file_get_contents ($file);
                        $count = 0;
                        
                        $destPath = $this->_generatePath ($file);
                        
                        if (
                                preg_match_all (
                                        '/((jUrl::get\s*\(\s*)(\'|")([\w~_]+)\\3)/',
                                        $content, 
                                        $match,
                                        PREG_SET_ORDER))
                        {                       
                                foreach ($match as $m)
                                {
                                        $originalJUrl   = $m[1];
                                        $newJUrl                = 
                                                $m[2] . $m[3] . str_replace ('_', ':', $m[4]) . $m[3];
                                        
                                        $content = 
                                                preg_replace (
                                                        '/((jUrl::get\s*\(\s*)(\'|")([\w~_]+)\\3)/',
                                                        $m[2] . $m[3] . str_replace ('_', ':', $m[4]) . $m[3], 
                                                        $content, 
                                                        1);
                                                
                                        $count ++;
                                }
                        }

                        $this->_rep->content .= "[$count]";
                        
                        if ($count != $nb)
                        {
                                $this->_rep->content .= "... NOK\n";
                        }
                        else
                        {
                                $this->_rep->content .= "... OK\n";
                        }
                        
                        file_put_contents (
                                $destPath,
                                $content);
                }
        }

        private function _jUrlTemplate ()
        {
                // ---------------------------------------------------------------------
                // Liste des fichiers
                // ---------------------------------------------------------------------

                $fileList = array ();
                
                $grepCmd =  
                        "grep -R '{jurl' " . JELIX_APP_PATH . 
                        $this->_directory . " | grep -v svn";
                
                foreach (split ("\n", `$grepCmd`) as $line)
                {
                        $file = 
                                substr 
                                (
                                        $line, 
                                        0,
                                        strpos ($line, ':')
                                );
                
                        if (!empty ($file))
                        {
                                if (isset ($fileList[$file]))
                                {
                                        $fileList[$file] ++;
                                }
                                else
                                {
                                        $fileList[$file] = 1;
                                }
                        }
                }

                // ---------------------------------------------------------------------
                // Traitement des fichiers
                // ---------------------------------------------------------------------

                foreach ($fileList as $file => $nb)
                {
                        $this->_rep->content .= "$file [$nb] -> ";
                
                        $content = file_get_contents ($file);
                        $count = 0;
                        
                        $destPath = $this->_generatePath ($file);
                        
                        if (
                                preg_match_all (
                                        '/(({\s*jurl\s*)(\'|")([\w~_]+)\\3)/',
                                        $content, 
                                        $match,
                                        PREG_SET_ORDER))
                        {                       
                                foreach ($match as $m)
                                {
                                        $originalJUrl   = $m[1];
                                        $newJUrl                = 
                                                $m[2] . $m[3] . str_replace ('_', ':', $m[4]) . $m[3];
                                        
                                        $content = 
                                                preg_replace (
                                                        '/(({\s*jurl\s*)(\'|")([\w~_]+)\\3)/',
                                                        $m[2] . $m[3] . str_replace ('_', ':', $m[4]) . $m[3], 
                                                        $content, 
                                                        1);
                                                
                                        $count ++;
                                }
                        }

                        $this->_rep->content .= "[$count]";
                        
                        if ($count != $nb)
                        {
                                $this->_rep->content .= "... NOK\n";
                        }
                        else
                        {
                                $this->_rep->content .= "... OK\n";
                        }
                        
                        file_put_contents (
                                $destPath,
                                $content);
                }
        }

        private function _redirectAction ()
        {
                // ---------------------------------------------------------------------
                // Liste des fichiers
                // ---------------------------------------------------------------------

                $fileList = array ();
                
                $grepCmd = 
                        "grep -R '\->action' " . JELIX_APP_PATH . 
                        $this->_directory . " | grep -v svn";
                
                foreach (split ("\n", `$grepCmd`) as $line)
                {
                        $file = 
                                substr 
                                (
                                        $line, 
                                        0,
                                        strpos ($line, ':')
                                );
                
                        if (!empty ($file))
                        {
                                if (isset ($fileList[$file]))
                                {
                                        $fileList[$file] ++;
                                }
                                else
                                {
                                        $fileList[$file] = 1;
                                }
                        }
                }

                // ---------------------------------------------------------------------
                // Traitement des fichiers
                // ---------------------------------------------------------------------

                foreach ($fileList as $file => $nb)
                {
                        $this->_rep->content .= "$file [$nb] -> ";
                
                        $content = file_get_contents ($file);
                        $count = 0;
                        
                        $destPath = $this->_generatePath ($file);
                
                        if (
                                preg_match_all (
                                        '/((\->action\s*=\s*)(\'|")([\w~_]+)\\3)/',
                                        $content, 
                                        $match,
                                        PREG_SET_ORDER))
                        {                       
                                foreach ($match as $m)
                                {
                                        $originalJUrl   = $m[1];
                                        $newJUrl                = 
                                                $m[2] . $m[3] . str_replace ('_', ':', $m[4]) . $m[3];
                                        
                                        $content = 
                                                preg_replace (
                                                        '/((\->action\s*=\s*)(\'|")([\w~_]+)\\3)/',
                                                        $m[2] . $m[3] . str_replace ('_', ':', $m[4]) . $m[3], 
                                                        $content, 
                                                        1);
                                                
                                        $count ++;
                                }
                        }

                        $this->_rep->content .= "[$count]";
                        
                        if ($count != $nb)
                        {
                                $this->_rep->content .= "... NOK\n";
                        }
                        else
                        {
                                $this->_rep->content .= "... OK\n";
                        }
                        
                        file_put_contents (
                                $destPath,
                                $content);
                }
        }       
        
        private function _generatePath ($filePath)
        {
                $newPath = 
                        str_replace 
                        (
                                JELIX_APP_PATH . $this->_directory . '/',
                                '',
                                $filePath
                        );
                
                $basePath = $this->_destDirectory;
                        
                $directories = split ('/', $newPath);
                        
                $fileName = array_pop ($directories);
                
                foreach ($directories as $dir)
                {
                        if (! file_exists ($basePath . '/' . $dir))
                        {
                                mkdir ($basePath . '/' . $dir);
                        }
                        
                        $basePath = $basePath . '/' . $dir;
                }
                        
                return                  
                        str_replace
                        (
                                JELIX_APP_PATH . $this->_directory . '/',
                                $this->_destDirectory . '/',
                                $filePath
                        );
        }
}

Change History (4)

comment:1 Changed 13 years ago by laurentj

  • Milestone set to Jelix 1.0
  • Resolution set to fixed
  • Status changed from new to closed

comment:2 Changed 13 years ago by laurentj

  • Resolution fixed deleted
  • Status changed from closed to reopened

comment:3 Changed 13 years ago by laurentj

  • Resolution set to fixed
  • Status changed from reopened to closed

Script ajouté dans lib/jelix-scripts/modules/beta_migrating/.

comment:4 Changed 13 years ago by laurentj

Merci pour le script :-)

Note: See TracTickets for help on using tickets.