phpDocumentor lodeladmin
[ class tree: lodeladmin ] [ index: lodeladmin ] [ all elements ]

Source for file class.siteManage.php

Documentation is available at class.siteManage.php

  1. <?php
  2. /**
  3.  * Classe siteManage - Gère un site
  4.  *
  5.  * PHP versions 4 et 5
  6.  *
  7.  * LODEL - Logiciel d'Edition ELectronique.
  8.  *
  9.  * Copyright (c) 2001-2002, Ghislain Picard, Marin Dacos
  10.  * Copyright (c) 2003, Ghislain Picard, Marin Dacos, Luc Santeramo, Nicolas Nutten, Anne Gentil-Beccot
  11.  * Copyright (c) 2004, Ghislain Picard, Marin Dacos, Luc Santeramo, Anne Gentil-Beccot, Bruno Cénou
  12.  * Copyright (c) 2005, Ghislain Picard, Marin Dacos, Luc Santeramo, Gautier Poupeau, Jean Lamy, Bruno Cénou
  13.  * Copyright (c) 2006, Marin Dacos, Luc Santeramo, Bruno Cénou, Jean Lamy, Mikaël Cixous, Sophie Malafosse
  14.  * Copyright (c) 2007, Marin Dacos, Bruno Cénou, Sophie Malafosse, Pierre-Alain Mignot
  15.  *
  16.  * Home page: http://www.lodel.org
  17.  *
  18.  * E-Mail: lodel@lodel.org
  19.  *
  20.  * All Rights Reserved
  21.  *
  22.  * This program is free software; you can redistribute it and/or modify
  23.  * it under the terms of the GNU General Public License as published by
  24.  * the Free Software Foundation; either version 2 of the License, or
  25.  * (at your option) any later version.
  26.  *
  27.  * This program is distributed in the hope that it will be useful,
  28.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  29.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  30.  * GNU General Public License for more details.
  31.  *
  32.  * You should have received a copy of the GNU General Public License
  33.  * along with this program; if not, write to the Free Software
  34.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  35.  *
  36.  * @author Ghislain Picard
  37.  * @author Jean Lamy
  38.  * @author Pierre-Alain Mignot
  39.  * @copyright 2005, Ghislain Picard, Marin Dacos, Luc Santeramo, Gautier Poupeau, Jean Lamy, Bruno Cénou
  40.  * @copyright 2006, Marin Dacos, Luc Santeramo, Bruno Cénou, Jean Lamy, Mikaël Cixous, Sophie Malafosse
  41.  * @copyright 2007, Marin Dacos, Bruno Cénou, Sophie Malafosse, Pierre-Alain Mignot
  42.  * @licence http://www.gnu.org/copyleft/gpl.html
  43.  * @version CVS:$this->id:
  44.  * @package lodeladmin
  45.  */
  46.  
  47. class siteManage {
  48.     /**
  49.      * Version lodel du site en cours de traitement
  50.      * @var int 
  51.      */
  52.     var $version;
  53.  
  54.     /**
  55.      * Répertoire de la version lodel utilisée
  56.      * @var string 
  57.      */    
  58.     var $versiondir;
  59.  
  60.     /**
  61.      * Variable contenant les différentes versions de lodel installées
  62.      * @var string 
  63.      */        
  64.     var $versions;
  65.  
  66.     /**
  67.      * Identifiant du site
  68.      * @var int 
  69.      */
  70.     var $id;
  71.  
  72.     /**
  73.      * Critere de sélection du site requete SQL ("id=$id")
  74.      * @var string 
  75.      */
  76.     var $critere;
  77.  
  78.     /**
  79.      * Regex permettant de trouver s'il existe plusieurs versions de lodel installées
  80.      * @var string 
  81.      */    
  82.     var $lodelhomere;
  83.  
  84.     /**
  85.      * Réinstallation ?
  86.      * @var string 
  87.      */
  88.     var $reinstall;
  89.  
  90.     /**
  91.      * Base de donnée unique ?
  92.      * @var bool 
  93.      */
  94.     var $singledatabase;
  95.  
  96.     /**
  97.      * Nom de la base de données principale
  98.      * @var string 
  99.      */
  100.     var $database;
  101.  
  102.     /**
  103.      * Un seul site ?
  104.      * @var bool 
  105.      */
  106.     var $maindefault;
  107.  
  108.     /**
  109.      * Informations du site
  110.      * @var array 
  111.      */
  112.     var $context;
  113.  
  114.     /**
  115.      * Téléchargement du fichier siteconfig.php ?
  116.      * @var int 
  117.      */
  118.     var $downloadsiteconfig;
  119.  
  120.  
  121.     /**
  122.      * Constructeur
  123.      *
  124.      * Instancie un objet de la classe
  125.      *
  126.      * @param int $id identifiant du site
  127.      * @param array $context le contexte passé par référence
  128.      */
  129.     function siteManage($id&$context)
  130.     {
  131.         $this->context['id'$context['id'$context['id'$id;
  132.         $this->id = intval($id);
  133.         $this->critere = "id='$id'";
  134.         $this->lodelhomere = "/^lodel(-[\w.]+)$/";
  135.         $this->context = $context;
  136.     }
  137.  
  138.     /**
  139.      * Accesseur
  140.      *
  141.      * Cette fonction renvoit la variable $_v passée en paramètre
  142.      *
  143.      * @param var $_v variable à renvoyer
  144.      */
  145.         function get$_v )
  146.     {
  147.         return $this->$_v;
  148.     }
  149.  
  150.     /**
  151.      * Accesseur
  152.      *
  153.      * Cette fonction alloue la valeur $_a à la variable $_v
  154.      *
  155.      * @param var $_v variable à modifier
  156.      * @param var $_a valeur à allouer
  157.      */
  158.         function set$_v$_a )
  159.     {
  160.         $this->$_v $_a;
  161.         }
  162.  
  163.     /**
  164.      * Restoration d'un site supprimé
  165.      *
  166.      * Cette fonction restaure un site préalablement supprimé
  167.      */
  168.     function restore()
  169.     {
  170.         mysql_query(lq("UPDATE #_TP_sites SET status=abs(status) WHERE ".$this->critere)) or dberror();
  171.         update();
  172.         require_once 'view.php';
  173.         $view &View::getView();
  174.         $view->back()// on revient
  175.     }
  176.  
  177.     /**
  178.      * Suppression d'un site
  179.      *
  180.      * Cette fonction supprime un site
  181.      */
  182.     function remove()
  183.     {
  184.         mysql_query(lq("UPDATE #_TP_sites SET status=-abs(status) WHERE ".$this->critere)) or dberror();
  185.         update();
  186.         require_once 'view.php';
  187.         $view &View::getView();
  188.         $view->back()// on revient
  189.     }
  190.  
  191.     /**
  192.      * Version du site
  193.      *
  194.      * Cette fonction retourne la version de lodel du site en cours de traitement
  195.      *
  196.      * @param var $dir répertoire à traiter
  197.      */    
  198.     function getsiteversion($dir)
  199.     
  200.         if (!file_exists($dir'siteconfig.php')) {
  201.             die("ERRORinternal error while reinstalling every sitedir is $dir");
  202.         }
  203.         include ($dir'siteconfig.php');
  204.         return $version;
  205.     }
  206.  
  207.     /**
  208.      * Réinstallation d'un site
  209.      *
  210.      * Cette fonction lance la procédure de réinstallation d'un site
  211.      *
  212.      * @param var $dir répertoire à traiter
  213.      */    
  214.     function reinstall($dir)
  215.     {
  216.         require_once 'connect.php';
  217.     
  218.         $result $db->execute(lq("SELECT path,name FROM #_MTP_sites WHERE status>0")) or dberror();
  219.         
  220.         while(!$result->EOF{
  221.             $row $result->fields;
  222.             // on peut installer les fichiers
  223.             if (!$row['path']{
  224.                 $row['path''/'$row['name'];
  225.             }
  226.             $root    str_replace('//''/'LODELROOT$row['path'])'/';
  227.             $this->version = $this->getsiteversion($root);
  228.             if ($row['path'== '/'// c'est un peu sale ca.
  229.                 $this->install_file($root"lodel-".$this->version."/src"'');
  230.             else {
  231.                 $this->install_file($root"../lodel-".$this->version."/src"LODELROOT);
  232.             }
  233.     
  234.             // clear the CACHEs
  235.             require_once 'cachefunc.php';
  236.             removefilesincache(LODELROOT$root$root'lodel/edition'$root'lodel/admin');
  237.     
  238.             $result->MoveNext();
  239.         }
  240.     
  241.         header('location: 'LODELROOT'index.php');
  242.         exit;
  243.     }
  244.  
  245.     /**
  246.      * Edition d'un site
  247.      *
  248.      * Cette fonction permet d'éditer les informations d'un site
  249.      */    
  250.     function manageSite()
  251.     {
  252.         //on extrait les variables contenues dans $_POST
  253.         extract_post();
  254.         //on les alloue à notre contexte
  255.         $this->context = $GLOBALS['context'];
  256.         if ($this->maindefault// site par defaut ?
  257.             $this->context['title']  'Site principal';
  258.             $this->context['name']   'principal';
  259.             $this->context['atroot'true;
  260.         }
  261.         
  262.         // validation
  263.         do {
  264.  
  265.             if (!$this->context['title']{
  266.                 $this->context['error_title'$err 1;
  267.             }
  268.             if (!$this->id && (!$this->context['name'|| !preg_match("/^[a-z0-9\-]+$/",$this->context['name']))) $this->context['error_name'$err 1;
  269.             }
  270.             if ($err{
  271.                 break;
  272.             }
  273.             require_once 'connect.php';
  274.     
  275.             // verifie qu'on a qu'un site si on est en singledatabase
  276.             if (!$this->id && $this->singledatabase == 'on'{
  277.                 $result mysql_query ("SELECT COUNT(*) FROM `$GLOBALS[tp]sitesWHERE status>-32 AND name!='"$this->context['name']"'"or die (mysql_error());
  278.                 list($numsitemysql_fetch_row($result);
  279.                 if ($numsite >= 1{
  280.                     die("ERROR<br />\nIl n'est pas possible actuellement d'avoir plusieurs sites sur une unique base de données : il faut utiliser plusieurs bases de données.");
  281.                 }
  282.             }
  283.     
  284.             // édition d'un site : lit les informations options, status, etc.
  285.             if ($this->id{
  286.                 $result mysql_query ("SELECT status,name,path FROM `$GLOBALS[tp]sitesWHERE id='".$this->id."'"or die (mysql_error());
  287.                 list($status,$name,$this->context['path']mysql_fetch_row($result);
  288.                 $this->context['name'$name;
  289.             else // création d'un site
  290.                 // vérifie que le nom (base de données + répertoire du site) n'est pas déjà utilisé
  291.                 $result mysql_query ("SELECT name FROM `$GLOBALS[tp]sites`"or die (mysql_error());
  292.                 while ($row mysql_fetch_array($result)) {
  293.                     $sites[$row['name'];
  294.                 }
  295.                 if(is_array($sites)) {
  296.                     if(in_array($this->context['name']$sites)) {
  297.                         $this->context['error_unique_name'$err 1;
  298.                         break;
  299.                     }
  300.                 }
  301.     
  302.                 $options '';
  303.                 $status  = -32// -32 signifie en creation
  304.                 if ($this->context['atroot']{
  305.                     $this->context['path''/';
  306.                 }
  307.                 if (!$this->context['path']{
  308.                     $this->context['path''/'$this->context['name'];
  309.                 }
  310.             }
  311.             if (!$this->context['url']{
  312.                 $this->context['url''http://'$_SERVER['SERVER_NAME']($_SERVER['SERVER_PORT'':'$_SERVER['SERVER_PORT'"")preg_replace("/\blodeladmin-?\d*(\.\d*)?\/.*/"''$_SERVER['REQUEST_URI'])substr($this->context['path']1);
  313.             }
  314.             
  315.             if ($this->reinstall{
  316.                 $status = -32;
  317.             }
  318.     
  319.             //suppression de l'eventuel / a la fin de l'url
  320.             $this->context['url'preg_replace("/\/$/"''$this->context[url]);
  321.  
  322.             // Ajout de slashes pour autoriser les guillemets dans le titre et le sous-titre du site
  323.             $this->context['title'magic_addslashes($this->context['title']);
  324.             $this->context['subtitle'magic_addslashes($this->context['subtitle']);
  325.     
  326.             mysql_query("REPLACE INTO `$GLOBALS[tp]sites` (id,title,name,path,url,subtitle,statusVALUES ('".$this->id."','".$this->context['title']."','".$this->context['name']."','".$this->context['path']."','".$this->context['url']."','".$this->context['subtitle']."','".$status."')"or die (mysql_error());
  327.     
  328.             update();
  329.  
  330.             if ($status>-32{
  331.                 require_once 'view.php';
  332.                 $view &View::getView();
  333.                 $view->back()// on revient, le site n'est pas en creation
  334.             }
  335.     
  336.             if (!$this->id{
  337.                 $this->context['id'$this->id = mysql_insert_id();
  338.             }
  339.             return true;
  340.         while (0);        
  341.     }
  342.  
  343.     /**
  344.      * Versions installées sur le serveur web
  345.      *
  346.      * Cette fonction cherche et alloue à la variable $versions les différentes versions installées sur le serveur web
  347.      */    
  348.     function cherche_version (
  349.     {
  350.         $dir opendir(LODELROOT);
  351.         if (!$dir{
  352.             die ("impossible d'acceder en ecriture sur le repertoire racine");
  353.         }
  354.         $this->versions = array();
  355.         while ($file readdir($dir)) {
  356.             if ($file[0=== '.'{
  357.                 continue;
  358.             }
  359.             if (is_dir(LODELROOT.$file&& preg_match($this->lodelhomere,$file&& is_dir(LODELROOT$file'/src')) {
  360.                 if (!(@include(LODELROOT"$file/src/siteconfig.php"))) {
  361.                     echo "ERRORUnable to open the file$file/src/siteconfig.php<br />";
  362.                 else {
  363.                     $this->versions[$file]=$this->version ? $this->version : "devel";
  364.                 }
  365.             }
  366.         }
  367.     }
  368.  
  369.     /**
  370.      * Sélection de la version de lodel à installer
  371.      *
  372.      * Cette fonction affiche les différentes versions installées sur le serveur web
  373.      * Et permet de choisir celle que l'on veut installer
  374.      */    
  375.     function makeselectversion()
  376.     {
  377.         foreach ($this->versions as $dir => $ver{
  378.             $selected $this->versiondir == $dir "selected=\"selected\"" '';
  379.             echo "<option value=\"$dir\"$selected>$dir  ($ver)</option>\n";
  380.         }
  381.     }
  382.  
  383.     /**
  384.      * Sélection de notre version de lodel
  385.      *
  386.      * Cette fonction sélectionne la version de lodel du site que l'on veut installer
  387.      */    
  388.     function selectVersion()
  389.     {
  390.         if  (!$this->versiondir{
  391.             $this->cherche_version();
  392.             
  393.             // ok, maintenant on connait les versions
  394.             $this->context['countversions'count($this->versions);
  395.             if ($this->context['countversions'== 1{// ok, une seule version, on la choisit
  396.                 list($this->versiondirarray_keys($this->versions);
  397.             elseif ($this->context['countversions'== 0// aie, aucune version on crach
  398.                 die ("Verifiez le package que vous avez, il manque le repertoire lodel/src. L'installation ne peut etre poursuivie !");
  399.             else // il y en a plusieurs, faut choisir
  400.                 $this->context['count'count($this->versions);
  401.                 $this->makeselectversion();
  402.                 require_once 'view.php';
  403.                 $view &View::getView();
  404.                 $view->render($this->context'site-version');
  405.                 return false;
  406.             }
  407.         }
  408.         $this->context['versiondir'=  $this->versiondir;
  409.         return true;
  410.     }
  411.  
  412.     /**
  413.      * Installation de lodel
  414.      *
  415.      * Cette fonction installe lodel
  416.      *
  417.      * @param var $root chemin de la racine du serveur web
  418.      * @param var $homesite chemin du répertoire du site
  419.      * @param var $homelodel chemin du répertoire de lodel
  420.      */    
  421.     function install_file($root$homesite$homelodel)
  422.     {
  423.         @include 'lodelconfig.php';
  424.         $file "$root$homesite/../install/install-fichier.dat"// homelodel est necessaire pour choper le bon fichier d'install
  425.         if (!file_exists($file)) {
  426.             die("Fichier $file introuvableVerifiez votre pactage");
  427.         }
  428.         $lines file($file);
  429.         $dirsource '.';
  430.         $dirdest   '.';
  431.     
  432.         $search array("/\#.*$/"'/\$homesite/''/\$homelodel/');
  433.         $rpl    array (''$homesite$homelodel);
  434.         foreach ($lines as $line{
  435.             $line rtrim(preg_replace($search$rpl$line));
  436.             if (!$line{
  437.                 continue;
  438.             }
  439.             list ($cmd$arg1$arg2preg_split ("/\s+/"$line);
  440.             $dest1 "$root$dirdest/$arg1";
  441.             # quelle commande ?
  442.             if ($cmd == 'dirsource'{
  443.                 $dirsource $arg1;
  444.             elseif ($cmd == 'dirdestination'{
  445.                 $dirdest $arg1;
  446.             elseif ($cmd == 'mkdir'{
  447.                 $arg1 $root$arg1;
  448.                 if (!file_exists($arg1)) {
  449.                     if(!@mkdir($arg10777 octdec($GLOBALS['filemask']))) {
  450.                         $this->context['error_mkdir'$arg1;
  451.                         require_once 'view.php';
  452.                         $view &View::getView();
  453.                         $view->render($this->context'site-createdir');
  454.                         exit;    
  455.                     }
  456.                 }
  457.                 @chmod($arg10777 octdec($GLOBALS['filemask']));
  458.             elseif ($cmd == 'ln' && $usesymlink && $usesymlink != 'non'{
  459.                 if ($dirdest == '.' && $extensionscripts == 'html' && $arg1 != 'lodelconfig.php'{
  460.                     $dest1 preg_replace("/\.php$/"'.html'$dest1);
  461.                 }
  462.                 if (!file_exists($dest1)) {
  463.                     $toroot preg_replace(