Browse Source

- Pouvoir remettre le chemin de travail à la racine du SPIP facilement

(Spip Cli, remet le répertoire de travail sur le lieu d’exécution du script après avoir chargé SPIP, ce que je ne trouve pas très pratique)

- Lorsqu’on charge spip-cli depuis un répertoire de travail qui est dans une arborescence d’un site mutualisé,
 ie: si on est dans "sites/domaine.tld" ou "sites/domaine.tld/qqc", alors on tente de définir `$_SERVER['HTTP_HOST']`
avant de démarrer le SPIP, pour que celui-ci démarre la mutualisation sur le bon site.
Pour cela, on essaie de trouver un sites/domaine.tld/config/connect.php valide, on s’y connecte avec PDO pour trouver l’adresse du site,
qui sert alors à calculer le HOST.
On affiche le host utilisé (mais c’est pas très joli).
svn/root/trunk
marcimat@rezo.net 3 years ago
parent
commit
321d7cd3b2
  1. 2
      spip_completion.sh
  2. 3
      src/Application.php
  3. 1
      src/Command/TestSpipCommand.php
  4. 64
      src/Loader/Spip.php
  5. 10
      src/Loader/Sql.php

2
spip_completion.sh

@ -1,4 +1,4 @@
#!/bin/sh
# Deprecated : utiliser/lier bin/spip_console_autocomplete
$(dirname $0)/bin/spip_console_autocomplete
$(dirname $0)/bin/spip_console_autocomplete

3
src/Application.php

@ -36,6 +36,7 @@ class Application extends ConsoleApplication {
'spip.webmestre.login' => '',
'spip.webmestre.nom' => '',
'spip.webmestre.login.prefixe' => 'SpipCli-',
'cwd' => getcwd()
]);
// todo: config file
@ -70,7 +71,7 @@ class Application extends ConsoleApplication {
return $spip;
};
$app['spip.sql'] = function ($app) {
$connect = $app['spip.loader']->getPathconnect();
$connect = $app['spip.loader']->getPathConnect();
if (!is_file($connect)) {
throw new \Exception('SPIP database is not configured');
}

1
src/Command/TestSpipCommand.php

@ -67,6 +67,7 @@ class TestSpipCommand extends Command
/** @var Spip $spip */
$spip = $this->getApplication()->getService('spip.loader');
$spip->load();
$spip->chdir(); // grml
} catch (\Exception $e) {
$io->fail('Chargement de SPIP en erreur !');
$io->fail($e->getMessage());

64
src/Loader/Spip.php

@ -18,6 +18,9 @@ class Spip {
/** @var string Chemin du connecteur SQL */
protected $connect = 'config/connect.php';
/** @var string Nom du répertoire théorique des sites, si mutualisation */
protected $dir_sites = 'sites';
/** @var string */
private $directory;
@ -37,8 +40,13 @@ class Spip {
public function __construct($directory = null) {
if (is_null($directory)) {
$directory = $this->chercher_racine_spip();
if ($directory) {
$this->directory = rtrim(Files::formatPath($directory), DIRECTORY_SEPARATOR);
$this->trouver_host_si_mutualisation();
}
} else {
$this->directory = rtrim(Files::formatPath($directory), DIRECTORY_SEPARATOR);
}
$this->directory = rtrim(Files::formatPath($directory), DIRECTORY_SEPARATOR);
}
@ -68,6 +76,51 @@ class Spip {
return false;
}
/**
* Si le répertoire d’exécution de spip-cli est dans un site mutualisé,
* ie quelque part dans `sites/truc.tld/qqc`, alors, déclarer à SPIP l’adresse
* du site concerné (dans http_host), si on arrive à le calculer
* (en se connectant au sql du site via PDO)
*
* @return bool
*/
private function trouver_host_si_mutualisation() {
// si le host a déjà été défini, ne rien tenter.
if (!empty($_SERVER['HTTP_HOST'])) {
return false;
}
// Si pas de répertoire 'sites', pas la peine de chercher...
$cwd = explode(DIRECTORY_SEPARATOR, getcwd());
if (!in_array($this->dir_sites, $cwd)) {
return false;
}
// On suppose que les fichiers de travail d’un site mutualisé,
// est un répertoire enfant du répertoire 'sites' (ie: sites/domaine.tld).
// On cherche un connecteur SQL dedans (ie: sites/domaine.tld/config/connect.php)
// On l’utilise pour se connecter à la bdd et retrouver l’adresse du site.
$previous = null;
foreach (array_reverse($cwd) as $dir) {
if ($dir === $this->dir_sites and $previous) {
$connect_file = $this->getPathFile($this->dir_sites . DIRECTORY_SEPARATOR . $previous . DIRECTORY_SEPARATOR . $this->connect);
if (file_exists($connect_file)) {
try {
$adresse = (new Sql($connect_file))->getAdresseSite();
if ($adresse) {
$host = parse_url($adresse, PHP_URL_HOST);
$_SERVER['HTTP_HOST'] = $host;
echo "Host défini sur $host\n";
}
} catch (\Exception $e) {
// a améliorer
echo $e->getMessage() . "\n";
}
}
}
$previous = $dir;
}
return false;
}
/**
* Indique si on est à la racine d’un site SPIP
* @return bool;
@ -79,6 +132,13 @@ class Spip {
return $this->exists;
}
/**
* Place le dossier de travail au bon endroit
*/
public function chdir() {
chdir($this->getDirectory());
}
/**
* Démarre SPIP
*/
@ -205,7 +265,7 @@ class Spip {
}
$cwd = getcwd();
chdir($this->directory);
$this->chdir();
$this->preparerPourInstallation();
require_once $starter;
chdir($cwd);

10
src/Loader/Sql.php

@ -153,4 +153,14 @@ class Sql {
}
return $sqlite;
}
public function getAdresseSite() {
/** @var \PDO $pdo */
$pdo = $this->getPdo();
$query = $pdo->prepare('SELECT valeur FROM spip_meta WHERE nom=:nom');
$query->bindValue(':nom', 'adresse_site', \PDO::PARAM_STR);
$query->execute();
$adr = $query->fetchColumn();
return trim($adr);
}
}
Loading…
Cancel
Save