source: spip-zone/_outils_/spip-cli/trunk/SpipCommand.php @ 81659

Last change on this file since 81659 was 81659, checked in by bystrano@…, 5 years ago

SpipCommand? fait les préparatifs nécessaires pour pouvoir utiliser des
fonctions de spip qui font appel à lire_meta ou ecrire_meta

Testé sur les commandes cache:inhibe et cache:reactive

File size: 3.3 KB
Line 
1<?php
2
3use Symfony\Component\Console\Command\Command;
4
5/**
6 * Cette classe s'utilise comme la classe Command du composant Console
7 * de Symphony, mais s'occupe aussi de :
8 *
9 *   - Trouver si la commande a été appelée depuis une installation SPIP
10 *   - Si c'est le cas, trouver le chemin vers la racine du SPIP
11 *   - Charger inc_version.php, et donc charger les fonctions
12 *     principales du core de SPIP.
13 *
14 */
15class SpipCommand extends Command {
16
17    /* Le chemin vers la racine de l'installation SPIP dans laquelle on
18       se trouve. */
19    protected $spip_dir = FALSE;
20
21    public function __construct($name = null) {
22
23        parent::__construct($name);
24        $this->spip_dir = $this->get_spip_dir();
25    }
26
27    /**
28     * Inclut ecrire/inc_version.php, ce qui permet ensuite d'utiliser
29     * toutes les fonctions de spip comme lors du chargement d'une
30     * page.
31     */
32    protected function load_spip($input, $output) {
33
34        if ( ! $this->spip_dir) {
35            $output->writeln('<error>Cette commande ne peux fonctionner que dans une installation SPIP.</error>');
36            return FALSE;
37        }
38
39        /* Pour que les include dans les fichiers php de SPIP
40           fonctionnent correctement, il faut être à la racine du
41           site. Du coup on change de répertoire courant le temps de
42           charger tout ça. */
43        $cwd = getcwd();
44        chdir($this->spip_dir);
45        include_once $this->prep_dir("$this->spip_dir/ecrire/inc_version.php");
46        /* On revient dans le répertoire dans lequel la commande a été
47           appellée, au cas où la commande voudrait utiliser cette
48           info. */
49        chdir($cwd);
50        /* On part du principe que si _ECRIRE_INC_VERSION existe,
51           inc_version.php a été chargé correctement. */
52        if (_ECRIRE_INC_VERSION) {
53            /* charger inc_version.php ne charge pas ce fichier, et
54               certaines fonctions du core l'utilisent sans
55               l'importer, il faut donc le charger ici. */
56            include_spip('base/abstract_sql');
57            /* Il faut initialiser cette globale pour éviter les
58               problèmes de connexion sql. */
59            $GLOBALS['mysql_rappel_connexion'] = true;
60
61            return TRUE;
62        }
63    }
64
65    /**
66     * Retourne le chemin absolu vers la racine du site SPIP dans
67     * lequel se trouve le répertoire courant. Retourne FALSE si l'on
68     * est pas dans l'arborescence d'un site SPIP.
69     */
70    private function get_spip_dir() {
71
72        $cwd = getcwd();
73
74        while ($cwd) {
75            if (file_exists($this->prep_dir("$cwd/ecrire/inc_version.php"))) {
76                return $cwd;
77            } else {
78                /* On remonte d'un dossier dans l'arborescence */
79                $cwd_array = explode(DIRECTORY_SEPARATOR, $cwd);
80                array_pop($cwd_array);
81                $cwd = implode(DIRECTORY_SEPARATOR, $cwd_array);
82            }
83        }
84        return FALSE;
85    }
86
87    /**
88     * Si on est sur un OS qui n'utilise pas des / comme séparateur de
89     * dossier dans les chemins, on remplace les / par le bon
90     * séparateur.
91     */
92    private function prep_dir($path) {
93
94        if (DIRECTORY_SEPARATOR !== '/') {
95            return str_replace('/', DIRECTORY_SEPARATOR, $path);
96        } else {
97            return $path;
98        }
99    }
100}
Note: See TracBrowser for help on using the repository browser.