Valider 818ad96e rédigé par bystrano@gmx.ch's avatar bystrano@gmx.ch
Parcourir les fichiers

Crée une sous-classe de Command qui offre des facilités pour gérer une

installation SPIP existante.

Cette classe s'utilise comme la classe Command du composant Console de
Symphony, mais s'occupe aussi de :

 - Trouver si la commande a été appelée depuis une installation SPIP
 - Si c'est le cas, trouver le chemin vers la racine du SPIP
 - Charger `inc_version.php`, et donc charger les fonctions principales
   du core de SPIP.

La propriété `spip_dir` contient le chemin vers la racine de SPIP. Elle
est calculée lors de l'instanciation de la classe. Les commandes peuvent
donc l'utiliser directement.

La méthode `load_spip` s'occupe de charger le core de l'installation
SPIP courante. Elle n'est pas appelée à l'instanciation de la classe,
chaque commande est responsable d'appeler ou non cette méthode.
parent f7ec1e9d
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
* text=auto !eol
/SpipCommand.php -text
/composer.json -text
/composer.lock -text
spip-cli/CoreTelecharger.php -text

SpipCommand.php

0 → 100644
+92 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php

use Symfony\Component\Console\Command\Command;

/**
 * Cette classe s'utilise comme la classe Command du composant Console
 * de Symphony, mais s'occupe aussi de :
 *
 *   - Trouver si la commande a été appelée depuis une installation SPIP
 *   - Si c'est le cas, trouver le chemin vers la racine du SPIP
 *   - Charger inc_version.php, et donc charger les fonctions
 *     principales du core de SPIP.
 *
 */
class SpipCommand extends Command {

    /* Le chemin vers la racine de l'installation SPIP dans laquelle on
       se trouve. */
    protected $spip_dir = FALSE;

    public function __construct($name = null) {

        parent::__construct($name);
        $this->spip_dir = $this->get_spip_dir();
    }

    /**
     * Inclut ecrire/inc_version.php, ce qui permet ensuite d'utiliser
     * toutes les fonctions de spip comme lors du chargement d'une
     * page.
     */
    protected function load_spip($input, $output) {

        if ( ! $this->spip_dir) {
            $output->writeln('<error>Cette commande ne peux fonctionner que dans une installation SPIP.</error>');
            return FALSE;
        }

        /* Pour que les include dans les fichiers php de SPIP
           fonctionnent correctement, il faut être à la racine du
           site. Du coup on change de répertoire courant le temps de
           charger tout ça. */
        $cwd = getcwd();
        chdir($this->spip_dir);
        include_once $this->prep_dir("$this->spip_dir/ecrire/inc_version.php");
        /* On revient dans le répertoire dans lequel la commande a été
           appellée, au cas où la commande voudrait utiliser cette
           info. */
        chdir($cwd);
        /* On part du principe que si _ECRIRE_INC_VERSION existe,
           inc_version.php a été chargé correctement. */
        if (_ECRIRE_INC_VERSION) {
            return TRUE;
        }
    }

    /**
     * Retourne le chemin absolu vers la racine du site SPIP dans
     * lequel se trouve le répertoire courant. Retourne FALSE si l'on
     * est pas dans l'arborescence d'un site SPIP.
     */
    private function get_spip_dir() {

        $cwd = getcwd();

        while ($cwd) {
            if (file_exists($this->prep_dir("$cwd/ecrire/inc_version.php"))) {
                return $cwd;
            } else {
                /* On remonte d'un dossier dans l'arborescence */
                $cwd_array = explode(DIRECTORY_SEPARATOR, $cwd);
                array_pop($cwd_array);
                $cwd = implode(DIRECTORY_SEPARATOR, $cwd_array);
            }
        }
        return FALSE;
    }

    /**
     * Si on est sur un OS qui n'utilise pas des / comme séparateur de
     * dossier dans les chemins, on remplace les / par le bon
     * séparateur.
     */
    private function prep_dir($path) {

        if (DIRECTORY_SEPARATOR !== '/') {
            return str_replace('/', DIRECTORY_SEPARATOR, $path);
        } else {
            return $path;
        }
    }
}
 No newline at end of file
+2 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -6,7 +6,6 @@ $dossier_cli = dirname(__FILE__);

include_once "$dossier_cli/vendor/autoload.php";
use Symfony\Component\Console\Application;
use SPIP\Cli\Core\CoreInstall;

// Pouvoir trouver les sous-classes d'une classe
function getSubclassesOf($parent) {
@@ -28,6 +27,7 @@ foreach (glob("$dossier_cli/spip-cli/*.php") as $commande_fichier) {

if ($commandes = getSubclassesOf('Symfony\Component\Console\Command\Command')){
	foreach ($commandes as $class){
        if ($class !== 'SpipCommand')
            $spip->add(new $class);
	}
}