Overview
Comment:Début d'intégration des plugins
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: d239c2525ecda70ae75a5109be58e0f1674b27c8
User & Date: bohwaz on 2014-03-20 18:30:54
Other Links: manifest | tags
Context
2014-03-20
19:39
Suppression de plugin + vérifications check-in: 1cb7db96ca user: bohwaz tags: trunk
18:30
Début d'intégration des plugins check-in: d239c2525e user: bohwaz tags: trunk
18:29
Petit outil rapide pour packager une extension check-in: d59b16e23e user: bohwaz tags: trunk
Changes

Modified src/.htaccess from [c2c5e60ea8] to [a73862be8a].

     1      1   <IfModule mod_alias.c>
     2         -    RedirectMatch 403 /include
     3         -    RedirectMatch 403 /cache
     4         -    RedirectMatch 403 /plugins
     5         -    RedirectMatch 403 /templates
            2  +    RedirectMatch 403 /include/
            3  +    RedirectMatch 403 /cache/
            4  +    RedirectMatch 403 /plugins/
            5  +    RedirectMatch 403 /templates/
     6      6       RedirectMatch 403 /*.sqlite
     7      7   </IfModule>

Modified src/include/class.plugin.php from [fc8588c2e1] to [b491bcdea6].

     1      1   <?php
     2      2   
     3      3   namespace Garradin;
     4      4   
     5      5   class Plugin
     6      6   {
     7      7   	protected $id = null;
     8         -	protected $config = null;
            8  +	protected $plugin = null;
     9      9   
    10     10   	public function __construct($id)
    11     11   	{
    12         -		$this->id = null;
           12  +		$db = DB::getInstance();
           13  +		$this->plugin = $db->simpleQuerySingle('SELECT * FROM plugins WHERE id = ?;', true, $id);
           14  +
           15  +		if (!$this->plugin)
           16  +		{
           17  +			throw new UserException('Ce plugin n\'existe pas ou n\'est pas installé correctement.');
           18  +		}
           19  +
           20  +		$this->plugin['config'] = json_decode($this->plugin['config'], true);
           21  +		
           22  +		if (!is_array($this->plugin['config']))
           23  +		{
           24  +			$this->plugin['config'] = [];
           25  +		}
           26  +
           27  +		$this->id = $id;
    13     28   	}
    14     29   
    15     30   	public function getConfig($key = null)
    16     31   	{
    17         -		if (is_null($this->config))
           32  +		if (is_null($key))
    18     33   		{
    19         -			$db = DB::getInstance();
    20         -			$this->config = $db->simpleQuerySingle('SELECT config FROM plugins WHERE id = ?;', false, $this->id);
    21         -			$this->config = json_decode($this->config, true);
    22         -
    23         -			if (!is_array($this->config))
    24         -			{
    25         -				$this->config = [];
    26         -			}
           34  +			return $this->plugin['config'];
    27     35   		}
    28     36   
    29         -		if (array_key_exists($key, $this->config))
           37  +		if (array_key_exists($key, $this->plugin['config']))
    30     38   		{
    31         -			return $this->config[$key];
           39  +			return $this->plugin['config'][$key];
    32     40   		}
    33     41   
    34     42   		return null;
    35     43   	}
    36     44   
    37     45   	public function setConfig($key, $value = null)
    38     46   	{
    39         -		$this->getConfig();
    40         -
    41     47   		if (is_null($value))
    42     48   		{
    43         -			unset($this->config[$key]);
           49  +			unset($this->plugin['config'][$key]);
    44     50   		}
    45     51   		else
    46     52   		{
    47         -			$this->config[$key] = $value;
           53  +			$this->plugin['config'][$key] = $value;
    48     54   		}
    49     55   
    50     56   		$db = DB::getInstance();
    51         -		$db->simpleUpdate('plugins', 'id = \'' . $this->id . '\'', ['config' => json_encode($this->config)]);
           57  +		$db->simpleUpdate('plugins', 
           58  +			['config' => json_encode($this->plugin['config'])],
           59  +			'id = \'' . $this->id . '\'');
    52     60   
    53     61   		return true;
    54     62   	}
    55     63   
    56         -	public function getInfos()
           64  +	public function getInfos($key = null)
           65  +	{
           66  +		if (is_null($key))
           67  +		{
           68  +			return $this->plugin;
           69  +		}
           70  +
           71  +		if (array_key_exists($key, $this->plugin))
           72  +		{
           73  +			return $this->plugin[$key];
           74  +		}
           75  +
           76  +		return null;
           77  +	}
           78  +
           79  +	public function id()
           80  +	{
           81  +		return $this->id;
           82  +	}
           83  +
           84  +	public function call($file)
           85  +	{
           86  +		$forbidden = ['install.php', 'infos.ini', 'upgrade.php', 'uninstall.php', 'signals.php'];
           87  +
           88  +		if (in_array($file, $forbidden))
           89  +		{
           90  +			throw new UserException('Le fichier ' . $file . ' ne peut être appelé par cette méthode.');
           91  +		}
           92  +
           93  +		if (!file_exists('phar://' . PLUGINS_PATH . '/' . $this->id . '.phar/' . $file))
           94  +		{
           95  +			throw new UserException('Le fichier ' . $file . ' n\'existe pas dans le plugin ' . $this->id);
           96  +		}
           97  +
           98  +		$plugin = $this;
           99  +		global $tpl, $config, $user, $membres;
          100  +
          101  +		include 'phar://' . PLUGINS_PATH . '/' . $this->id . '.phar/' . $file;
          102  +	}
          103  +
          104  +	public function uninstall()
          105  +	{
          106  +		if (file_exists('phar://' . PLUGINS_PATH . '/' . $this->id . '.phar/uninstall.php'))
          107  +		{
          108  +			include 'phar://' . PLUGINS_PATH . '/' . $this->id . '.phar/uninstall.php';
          109  +		}
          110  +		
          111  +		unlink(PLUGINS_PATH . '/' . $this->id . '.phar');
          112  +
          113  +		$db = DB::getInstance();
          114  +		return $db->simpleExec('DELETE FROM plugins WHERE id = ?;', $this->id);
          115  +	}
          116  +
          117  +	public function needUpgrade()
          118  +	{
          119  +		$infos = parse_ini_file('phar://' . PLUGINS_PATH . '/' . $this->id . '.phar/infos.ini', false);
          120  +		
          121  +		if (version_compare($this->plugin['version'], $infos['version'], '!='))
          122  +			return true;
          123  +
          124  +		return false;
          125  +	}
          126  +
          127  +	public function upgrade()
    57    128   	{
          129  +		if (file_exists('phar://' . PLUGINS_PATH . '/' . $this->id . '.phar/upgrade.php'))
          130  +		{
          131  +			include 'phar://' . PLUGINS_PATH . '/' . $this->id . '.phar/upgrade.php';
          132  +		}
          133  +
    58    134   		$db = DB::getInstance();
    59         -		return $db->simpleStatementFetch('SELECT * FROM plugins WHERE id = ?;', $this->id);
          135  +		return $db->simpleUpdate('plugins', 
          136  +			'id = \''.$db->escapeString($this->id).'\'', 
          137  +			['version' => $infos['version']]);
    60    138   	}
    61    139   
    62    140   	static public function listInstalled()
    63    141   	{
    64    142   		$db = DB::getInstance();
    65    143   		return $db->simpleStatementFetchAssocKey('SELECT id, * FROM plugins ORDER BY nom;');
    66    144   	}
          145  +
          146  +	static public function listMenu()
          147  +	{
          148  +		$db = DB::getInstance();
          149  +		return $db->simpleStatementFetchAssoc('SELECT id, nom FROM plugins WHERE menu = 1 ORDER BY nom;');
          150  +	}
    67    151   
    68    152   	static public function listDownloaded()
    69    153   	{
    70    154   		$installed = self::listInstalled();
    71    155   
    72    156   		$list = [];
    73    157   		$dir = dir(PLUGINS_PATH);
................................................................................
   109    193   			$context = stream_context_create($context_options);
   110    194   
   111    195   			try {
   112    196   				$result = file_get_contents(PLUGINS_URL, NULL, $context);
   113    197   			}
   114    198   			catch (\Exception $e)
   115    199   			{
   116         -				throw new UserException('Le téléchargement de la liste des plugins a échoué : ' . $e->getMessage())
          200  +				throw new UserException('Le téléchargement de la liste des plugins a échoué : ' . $e->getMessage());
   117    201   			}
   118    202   
   119    203   			Static_Cache::store('plugins_list', $result);
   120    204   		}
   121    205   		else
   122    206   		{
   123    207   			$result = Static_Cache::get('plugins_list');
................................................................................
   173    257   		$context = stream_context_create($context_options);
   174    258   
   175    259   		try {
   176    260   			copy($list[$id]['phar'], PLUGINS_PATH . '/' . $id . '.phar', $context);
   177    261   		}
   178    262   		catch (\Exception $e)
   179    263   		{
   180         -			throw new \RuntimeException('Le téléchargement du plugin '.$id.' a échoué : ' . $e->getMessage())
          264  +			throw new \RuntimeException('Le téléchargement du plugin '.$id.' a échoué : ' . $e->getMessage());
   181    265   		}
   182    266   
   183    267   		if (!self::checkHash($id))
   184    268   		{
   185    269   			unlink(PLUGINS_PATH . '/' . $id . '.phar');
   186    270   			throw new \RuntimeException('L\'archive du plugin '.$id.' est corrompue (le hash SHA1 ne correspond pas).');
   187    271   		}
................................................................................
   189    273   		self::install($id, true);
   190    274   
   191    275   		return true;
   192    276   	}
   193    277   
   194    278   	static public function install($id, $official = true)
   195    279   	{
          280  +		if (!file_exists('phar://' . PLUGINS_PATH . '/' . $id . '.phar'))
          281  +		{
          282  +			throw new \RuntimeException('Le plugin ' . $id . ' ne semble pas exister et ne peut donc être installé.');
          283  +		}
          284  +
   196    285   		if ($official && !self::checkHash($id))
   197    286   		{
   198    287   			throw new \RuntimeException('L\'archive du plugin '.$id.' est corrompue (le hash SHA1 ne correspond pas).');
   199    288   		}
   200    289   
   201         -		if (file_exists('phar://' . PLUGINS_PATH . '/' . $id . '.phar/install.php'))
          290  +		if (!file_exists('phar://' . PLUGINS_PATH . '/' . $id . '.phar/infos.ini'))
          291  +		{
          292  +			throw new \RuntimeException('L\'archive '.$id.'.phar ne comporte pas de fichier infos.ini : est-ce un plugin Garradin ?');
          293  +		}
          294  +
          295  +		if (!file_exists('phar://' . PLUGINS_PATH . '/' . $id . '.phar/index.php'))
   202    296   		{
   203         -			include 'phar://' . PLUGINS_PATH . '/' . $id . '.phar/install.php';
          297  +			throw new \RuntimeException('L\'archive '.$id.'.phar ne comporte pas de fichier index.php : est-ce un plugin Garradin ?');
   204    298   		}
   205    299   
   206    300   		$infos = parse_ini_file('phar://' . PLUGINS_PATH . '/' . $id . '.phar/infos.ini', false);
          301  +
          302  +		if ((bool)$infos['config'])
          303  +		{
          304  +			if (!file_exists('phar://' . PLUGINS_PATH . '/' . $id . '.phar/config.json'))
          305  +			{
          306  +				throw new \RuntimeException('L\'archive '.$id.'.phar ne comporte pas de fichier config.json 
          307  +					alors que le plugin nécessite le stockage d\'une configuration.');
          308  +			}
          309  +
          310  +			if (!file_exists('phar://' . PLUGINS_PATH . '/' . $id . '.phar/config.php'))
          311  +			{
          312  +				throw new \RuntimeException('L\'archive '.$id.'.phar ne comporte pas de fichier config.php 
          313  +					alors que le plugin nécessite le stockage d\'une configuration.');
          314  +			}
          315  +		}
   207    316   
   208    317   		$db = DB::getInstance();
   209    318   		$db->simpleInsert('plugins', [
   210    319   			'id' 		=> 	$id,
   211    320   			'officiel' 	=> 	(int)(bool)$official,
   212    321   			'nom'		=>	$infos['nom'],
   213    322   			'description'=>	$infos['description'],
   214    323   			'auteur'	=>	$infos['auteur'],
   215    324   			'url'		=>	$infos['url'],
   216    325   			'version'	=>	$infos['version'],
   217    326   			'menu'		=>	(int)(bool)$infos['menu'],
   218         -			'config'	=>	'',
          327  +			'config'	=>	$config,
   219    328   		]);
   220         -	}
   221         -	
   222         -	static public function uninstall($id)
   223         -	{
   224         -		if (file_exists('phar://' . PLUGINS_PATH . '/' . $id . '.phar/uninstall.php'))
          329  +
          330  +		if (file_exists('phar://' . PLUGINS_PATH . '/' . $id . '.phar/install.php'))
   225    331   		{
   226         -			include 'phar://' . PLUGINS_PATH . '/' . $id . '.phar/uninstall.php';
   227         -		}
   228         -		
   229         -		$db = DB::getInstance();
   230         -		return $db->simpleExec('DELETE FROM plugins WHERE id = ?;', $id);
   231         -	}
   232         -
   233         -	static public function needUpgrade($id)
   234         -	{
   235         -		$infos = parse_ini_file('phar://' . PLUGINS_PATH . '/' . $id . '.phar/infos.ini', false);
   236         -		$version = $db->simpleQuerySingle('SELECT version FROM plugins WHERE id = ?;', false, $id);
   237         -
   238         -		if (version_compare($version, $infos['version'], '!='))
   239         -			return true;
   240         -
   241         -		return false;
   242         -	}
   243         -
   244         -	static public function upgrade($id)
   245         -	{
   246         -		if (file_exists('phar://' . PLUGINS_PATH . '/' . $id . '.phar/upgrade.php'))
   247         -		{
   248         -			include 'phar://' . PLUGINS_PATH . '/' . $id . '.phar/upgrade.php';
          332  +			include 'phar://' . PLUGINS_PATH . '/' . $id . '.phar/install.php';
   249    333   		}
   250    334   
   251         -		$db = DB::getInstance();
   252         -		return $db->simpleUpdate('plugins', 'id = \''.$db->escapeString($id).'\'', ['version' => $infos['version']]);
          335  +		return true;
   253    336   	}
   254    337   }

Modified src/include/data/0.6.0.sql from [911a09f791] to [4df7c58a86].

    53     53       id INTEGER NOT NULL PRIMARY KEY,
    54     54   
    55     55       id_membre INTEGER NOT NULL REFERENCES membres (id),
    56     56       id_rappel INTEGER NULL REFERENCES rappels (id),
    57     57       date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
    58     58       media INTEGER NOT NULL -- Média utilisé pour le rappel : 1 = email, 2 = courrier, 3 = autre
    59     59   );
           60  +
           61  +CREATE TABLE plugins
           62  +-- Plugins / extensions
           63  +(
           64  +    id TEXT PRIMARY KEY,
           65  +    officiel INTEGER NOT NULL DEFAULT 0,
           66  +    nom TEXT NOT NULL,
           67  +    description TEXT,
           68  +    auteur TEXT,
           69  +    url TEXT,
           70  +    version TEXT NOT NULL,
           71  +    menu INTEGER NOT NULL DEFAULT 0,
           72  +    config TEXT
           73  +);
    60     74   
    61     75   -- Mise à jour des catégories
    62     76   
    63     77   CREATE TABLE membres_categories_tmp
    64     78   -- Catégories de membres
    65     79   (
    66     80       id INTEGER PRIMARY KEY,

Modified src/include/lib.utils.php from [180cd8e498] to [e9a05b7ff3].

   563    563           {
   564    564               case 'G': case 'g': return (int)$size_str * pow(1024, 3);
   565    565               case 'M': case 'm': return (int)$size_str * pow(1024, 2);
   566    566               case 'K': case 'k': return (int)$size_str * 1024;
   567    567               default: return $size_str;
   568    568           }
   569    569       }
   570         -}
          570  +
          571  +    static public function deleteRecursive($path, $delete_target = false)
          572  +    {
          573  +        if (!file_exists($path))
          574  +            return false;
          575  +
          576  +        $dir = dir($path);
          577  +        if (!$dir) return false;
          578  +
          579  +        while ($file = $dir->read())
          580  +        {
          581  +            if ($file == '.' || $file == '..')
          582  +                continue;
          583  +
          584  +            if (is_dir($path . '/' . $file))
          585  +            {
          586  +                if (!self::deleteRecursive($path . '/' . $file, true))
          587  +                    return false;
          588  +            }
          589  +            else
          590  +            {
          591  +                unlink($path . '/' . $file);
          592  +            }
          593  +        }
          594  +
          595  +        $dir->close();
          596  +        rmdir($path);
   571    597   
   572         -?>
          598  +        return true;
          599  +    }
          600  +}

Modified src/templates/admin/_head.tpl from [632fab4ba7] to [5c08b599fa].

    70     70                   {*<li class="wiki follow{if $current == 'wiki/suivi'} current{/if}"><a href="{$admin_url}wiki/suivi.php">Mes pages suivies</a>*}
    71     71                   {*<li class="wiki follow{if $current == 'wiki/contribution'} current{/if}"><a href="{$admin_url}wiki/contributions.php">Mes contributions</a>*}
    72     72               </ul>
    73     73               </li>
    74     74           {/if}
    75     75           {if $user.droits.config >= Garradin\Membres::DROIT_ADMIN}
    76     76               <li class="main config{if $current == 'config'} current{/if}"><a href="{$admin_url}config/">Configuration</a>
           77  +        {/if}
           78  +        {if !empty($plugins_menu)}
           79  +            <li class="plugins">
           80  +                <ul>
           81  +                {foreach from=$plugins_menu key="id" item="name"}
           82  +                    <li class="plugins {$id|escape}{if $current == 'plugin_`$id`'} current{/if}"><a href="{$admin_url}plugin.php?id={$id|escape}">{$name|escape}</a></li>
           83  +                {/foreach}
           84  +                </ul>
           85  +            </li>
    77     86           {/if}
    78     87           <li class="my config{if $current == 'mes_infos'} current{/if}"><a href="{$admin_url}mes_infos.php">Mes infos personnelles</a>
    79     88               <ul>
    80     89                   <li class="my cotisations{if $current == 'mes_cotisations'} current{/if}"><a href="{$admin_url}mes_cotisations.php">Mes cotisations</a></li>
    81     90               </ul>
    82     91           </li>
    83     92           {if !defined('Garradin\LOCAL_LOGIN')}

Modified src/templates/admin/config/_menu.tpl from [52ebd9d657] to [bf691bf8f5].

     1      1   <ul class="actions">
     2      2       <li{if $current == 'index'} class="current"{/if}><a href="{$www_url}admin/config/">Général</a></li>
     3      3       <li{if $current == 'membres'} class="current"{/if}><a href="{$www_url}admin/config/membres.php">Fiche des membres</a></li>
     4      4       <li{if $current == 'site'} class="current"{/if}><a href="{$www_url}admin/config/site.php">Site public</a></li>
     5      5       <li{if $current == 'donnees'} class="current"{/if}><a href="{$www_url}admin/config/donnees.php">Données&nbsp;: sauvegarde et restauration</a></li>
     6      6       <li{if $current == 'import'} class="current"{/if}><a href="{$www_url}admin/config/import.php">Import &amp; export</a></li>
            7  +    <li{if $current == 'plugins'} class="current"{/if}><a href="{$www_url}admin/config/plugins.php">Extensions</a></li>
     7      8   </ul>

Modified src/templates/admin/config/index.tpl from [ebebaaf514] to [f1469a8682].

    16     16   
    17     17   <form method="post" action="{$self_url|escape}">
    18     18   
    19     19       <fieldset>
    20     20           <legend>Garradin</legend>
    21     21           <dl>
    22     22               <dt>Version installée</dt>
    23         -            <dd class="help">{$garradin_version|escape} <a href="http://dev.kd2.org/garradin/">[Vérifier la disponibilité d'une nouvelle version]</a></dd>
           23  +            <dd class="help">{$garradin_version|escape} <a href="{Garradin\WEBSITE}">[Vérifier la disponibilité d'une nouvelle version]</a></dd>
    24     24               <dt>Informations système</dt>
    25     25               <dd class="help">PHP version {$php_version|escape} — SQLite version {$sqlite_version|escape}</dd>
    26     26           </dl>
    27     27       </fieldset>
    28     28   
    29     29       <fieldset>
    30     30           <legend>Informations sur l'association</legend>

Added src/templates/admin/config/plugins.tpl version [0d772933a3].

            1  +{include file="admin/_head.tpl" title="Extensions" current="config"}
            2  +
            3  +{include file="admin/config/_menu.tpl" current="plugins"}
            4  +
            5  +{if $error}
            6  +    <p class="error">
            7  +        {$error|escape}
            8  +    </p>
            9  +{/if}
           10  +
           11  +{if !empty($liste_installes)}
           12  +    <table class="list">
           13  +        <thead>
           14  +            <tr>
           15  +                <th>Extension</th>
           16  +                <td>Auteur</td>
           17  +                <td>Version installée</td>
           18  +                <td></td>
           19  +            </tr>
           20  +        </thead>
           21  +        <tbody>
           22  +            {foreach from=$liste_installes item="plugin"}
           23  +            <tr>
           24  +                <th>
           25  +                    <h4>{$plugin.nom|escape}</h4>
           26  +                    <small>{$plugin.description|escape}</small>
           27  +                </th>
           28  +                <td>
           29  +                    <a href="{$plugin.url|escape}" onclick="return !window.open(this.href);">{$plugin.auteur|escape}</a>
           30  +                </td>
           31  +                <td>
           32  +                    {$plugin.version|escape}
           33  +                </td>
           34  +                <td class="actions">
           35  +                    <a href="{$admin_url}config/plugins.php?delete={$plugin.id|escape}">Désinstaller</a>
           36  +                    {if !empty($plugin.config)}
           37  +                        | <a href="{$admin_url}plugin.php?id={$plugin.id|escape}&amp;page=config.php">Configurer</a>
           38  +                    {/if}
           39  +                </td>
           40  +            </tr>
           41  +            {/foreach}
           42  +        </tbody>
           43  +    </table>
           44  +{else}
           45  +    <p class="help">
           46  +        Aucune extension n'est installée.
           47  +        Vous pouvez consulter <a href="{Garradin\WEBSITE}">le site de Garradin</a> pour obtenir
           48  +        des extensions à télécharger.
           49  +    </p>
           50  +{/if}
           51  +
           52  +{if !empty($liste_telecharges)}
           53  +<form method="post" action="{$self_url|escape}">
           54  +
           55  +    <fieldset>
           56  +        <legend>Extensions téléchargées</legend>
           57  +        <dl>
           58  +            {foreach from=$liste_telecharges item="plugin" key="id"}
           59  +            <dt>
           60  +                <label>
           61  +                    <input type="radio" name="to_install" value="{$id|escape}" />
           62  +                    {$plugin.nom|escape}
           63  +                </label>
           64  +                (version {$plugin.version|escape})
           65  +            </dt>
           66  +            <dd>[<a href="{$plugin.url|escape}" onclick="return !window.open(this.href);">{$plugin.auteur|escape}</a>] {$plugin.description|escape}</dd>
           67  +            {/foreach}
           68  +        </dl>
           69  +    </fieldset>
           70  +
           71  +    <p class="help">
           72  +        Attention : installer une extension non officielle peut présenter des risques de sécurité
           73  +        et de stabilité.
           74  +    </p>
           75  +
           76  +    <p class="submit">
           77  +        {csrf_field key="install"}
           78  +        <input type="submit" name="install" value="Installer &rarr;" />
           79  +    </p>
           80  +</form>
           81  +{/if}
           82  +
           83  +{include file="admin/_foot.tpl"}

Modified src/www/admin/_inc.php from [50cf88ffa0] to [c0e06fcc72].

    23     23   
    24     24       $tpl->assign('current', '');
    25     25   
    26     26       if ($user['droits']['membres'] >= Membres::DROIT_ACCES)
    27     27       {
    28     28           $tpl->assign('nb_membres', $membres->countAllButHidden());
    29     29       }
           30  +
           31  +    $tpl->assign('plugins_menu', Plugin::listMenu());
    30     32   }
    31     33   
    32     34   ?>

Added src/www/admin/config/plugins.php version [7c4827277c].

            1  +<?php
            2  +
            3  +namespace Garradin;
            4  +
            5  +require_once __DIR__ . '/_inc.php';
            6  +
            7  +$error = false;
            8  +
            9  +if (!empty($_POST['install']))
           10  +{
           11  +    if (!utils::CSRF_check('install'))
           12  +    {
           13  +        $error = 'Une erreur est survenue, merci de renvoyer le formulaire.';
           14  +    }
           15  +    else
           16  +    {
           17  +        try {
           18  +            Plugin::install(utils::post('to_install'), false);
           19  +            
           20  +            utils::redirect('/admin/config/plugins.php');
           21  +        }
           22  +        catch (\Exception $e)
           23  +        {
           24  +            $error = $e->getMessage();
           25  +        }
           26  +    }
           27  +}
           28  +
           29  +$tpl->assign('error', $error);
           30  +
           31  +$tpl->assign('liste_telecharges', Plugin::listDownloaded());
           32  +$tpl->assign('liste_installes', Plugin::listInstalled());
           33  +
           34  +$tpl->display('admin/config/plugins.tpl');
           35  +
           36  +?>

Added src/www/admin/plugin.php version [c92532ef54].

            1  +<?php
            2  +
            3  +namespace Garradin;
            4  +
            5  +require_once __DIR__ . '/_inc.php';
            6  +
            7  +$page = utils::get('page') ?: 'index.php';
            8  +
            9  +$plugin = new Plugin(utils::get('id'));
           10  +
           11  +$tpl->assign('plugin', $plugin->getInfos());
           12  +
           13  +$plugin->call($page);
           14  +
           15  +?>