developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.
#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
comment:4 Changed 13 years ago by laurentj
Merci pour le script :-)
Script ajouté dans lib/jelix-scripts/modules/beta_migrating/.