Overview
Comment:Modernisation de Plugin.php
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | dev
Files: files | file ages | folders
SHA1: 7fb77dba15c62957564c2d9943cedfa48fd84d29
User & Date: bohwaz on 2017-05-03 07:24:41
Other Links: branch diff | manifest | tags
Context
2017-05-04
07:37
Vérification de signature à l'import de DB check-in: 4066ce8971 user: bohwaz tags: dev
2017-05-03
07:24
Modernisation de Plugin.php check-in: 7fb77dba15 user: bohwaz tags: dev
07:24
Les méthodes de compatibilité antérieure doivent avoir le même comportement qu'avant et ne pas utiliser les générateurs check-in: 8a5e92420a user: bohwaz tags: dev
Changes

Modified src/include/lib/Garradin/Plugin.php from [9153e82c84] to [3815e1aa10].

    31     31   	 * Construire un objet Plugin pour un plugin
    32     32   	 * @param string $id Identifiant du plugin
    33     33   	 * @throws UserException Si le plugin n'est pas installé (n'existe pas en DB)
    34     34   	 */
    35     35   	public function __construct($id)
    36     36   	{
    37     37   		$db = DB::getInstance();
    38         -		$this->plugin = $db->simpleQuerySingle('SELECT * FROM plugins WHERE id = ?;', true, $id);
           38  +		$this->plugin = $db->first('SELECT * FROM plugins WHERE id = ?;', $id);
    39     39   
    40     40   		if (!$this->plugin)
    41     41   		{
    42     42   			throw new UserException('Ce plugin n\'existe pas ou n\'est pas installé correctement.');
    43     43   		}
    44     44   
    45         -		$this->plugin['config'] = json_decode($this->plugin['config'], true);
           45  +		$this->plugin->config = json_decode($this->plugin->config);
    46     46   		
    47         -		if (!is_array($this->plugin['config']))
           47  +		if (!is_array($this->plugin->config))
    48     48   		{
    49         -			$this->plugin['config'] = [];
           49  +			$this->plugin->config = [];
    50     50   		}
    51     51   
    52     52   		$this->id = $id;
    53     53   	}
    54     54   
    55     55   	/**
    56     56   	 * Enregistrer les changements dans la config
    57     57   	 */
    58     58   	public function __destruct()
    59     59   	{
    60     60   		if ($this->config_changed)
    61     61   		{
    62     62   			$db = DB::getInstance();
    63         -			$db->simpleUpdate('plugins', 
    64         -				['config' => json_encode($this->plugin['config'])],
           63  +			$db->update('plugins', 
           64  +				['config' => json_encode($this->plugin->config)],
    65     65   				'id = \'' . $this->id . '\'');
    66     66   		}
    67     67   	}
    68     68   
    69     69   	/**
    70     70   	 * Renvoie le chemin absolu vers l'archive du plugin
    71     71   	 * @return string Chemin PHAR vers l'archive
................................................................................
    81     81   	 * @return mixed       L'entrée demandée (mixed), ou l'intégralité de la config (array),
    82     82   	 * ou NULL si l'entrée demandée n'existe pas.
    83     83   	 */
    84     84   	public function getConfig($key = null)
    85     85   	{
    86     86   		if (is_null($key))
    87     87   		{
    88         -			return $this->plugin['config'];
           88  +			return $this->plugin->config;
    89     89   		}
    90     90   
    91         -		if (array_key_exists($key, $this->plugin['config']))
           91  +		if (property_exists($this->plugin->config, $key))
    92     92   		{
    93         -			return $this->plugin['config'][$key];
           93  +			return $this->plugin->config->$key;
    94     94   		}
    95     95   
    96     96   		return null;
    97     97   	}
    98     98   
    99     99   	/**
   100    100   	 * Enregistre une entrée dans la configuration du plugin
................................................................................
   102    102   	 * @param mixed  $value Valeur à enregistrer, choisir NULL pour effacer cette clé de la configuration
   103    103   	 * @return boolean 		TRUE si tout se passe bien
   104    104   	 */
   105    105   	public function setConfig($key, $value = null)
   106    106   	{
   107    107   		if (is_null($value))
   108    108   		{
   109         -			unset($this->plugin['config'][$key]);
          109  +			unset($this->plugin->config->$key);
   110    110   		}
   111    111   		else
   112    112   		{
   113         -			$this->plugin['config'][$key] = $value;
          113  +			$this->plugin->config->$key = $value;
   114    114   		}
   115    115   
   116    116   		$this->config_changed = true;
   117    117   
   118    118   		return true;
   119    119   	}
   120    120   
................................................................................
   126    126   	public function getInfos($key = null)
   127    127   	{
   128    128   		if (is_null($key))
   129    129   		{
   130    130   			return $this->plugin;
   131    131   		}
   132    132   
   133         -		if (array_key_exists($key, $this->plugin))
          133  +		if (property_exists($this->plugin, $key))
   134    134   		{
   135         -			return $this->plugin[$key];
          135  +			return $this->plugin->$key;
   136    136   		}
   137    137   
   138    138   		return null;
   139    139   	}
   140    140   
   141    141   	/**
   142    142   	 * Renvoie l'identifiant du plugin
................................................................................
   223    223   			$plugin = $this;
   224    224   			include $this->path() . '/uninstall.php';
   225    225   		}
   226    226   
   227    227   		unlink(PLUGINS_ROOT . '/' . $this->id . '.tar.gz');
   228    228   
   229    229   		$db = DB::getInstance();
   230         -		$db->simpleExec('DELETE FROM plugins_signaux WHERE plugin = ?;', $this->id);
   231         -		return $db->simpleExec('DELETE FROM plugins WHERE id = ?;', $this->id);
          230  +		$db->delete('plugins_signaux', 'plugin = ?', $this->id);
          231  +		return $db->delete('plugins', 'id = ?', $this->id);
   232    232   	}
   233    233   
   234    234   	/**
   235    235   	 * Renvoie TRUE si le plugin a besoin d'être mis à jour
   236    236   	 * (si la version notée dans la DB est différente de la version notée dans garradin_plugin.ini)
   237    237   	 * @return boolean TRUE si le plugin doit être mis à jour, FALSE sinon
   238    238   	 */
   239    239   	public function needUpgrade()
   240    240   	{
   241         -		$infos = parse_ini_file($this->path() . '/garradin_plugin.ini', false);
          241  +		$infos = (object) parse_ini_file($this->path() . '/garradin_plugin.ini', false);
   242    242   		
   243         -		if (version_compare($this->plugin['version'], $infos['version'], '!='))
          243  +		if (version_compare($this->plugin->version, $infos->version, '!='))
   244    244   			return true;
   245    245   
   246    246   		return false;
   247    247   	}
   248    248   
   249    249   	/**
   250    250   	 * Mettre à jour le plugin
................................................................................
   255    255   	{
   256    256   		if (file_exists($this->path() . '/upgrade.php'))
   257    257   		{
   258    258   			$plugin = $this;
   259    259   			include $this->path() . '/upgrade.php';
   260    260   		}
   261    261   
   262         -		$infos = parse_ini_file($this->path() . '/garradin_plugin.ini', false);
          262  +		$infos = (object) parse_ini_file($this->path() . '/garradin_plugin.ini', false);
   263    263   
   264         -		$db = DB::getInstance();
   265         -		return $db->simpleUpdate('plugins', 
   266         -			['version' => $infos['version']],
   267         -			'id = \''.$db->escapeString($this->id).'\'');
          264  +		return DB::getInstance()->update('plugins', 
          265  +			['version' => $infos->version],
          266  +			'id = :id',
          267  +			['id' => $this->id]
          268  +		);
   268    269   	}
   269    270   
   270    271   	/**
   271    272   	 * Associer un signal à un callback du plugin
   272    273   	 * @param  string $signal   Nom du signal (par exemple boucle.agenda pour la boucle de type AGENDA)
   273    274   	 * @param  mixed  $callback Callback, sous forme d'un nom de fonction ou de méthode statique
   274    275   	 * @return boolean TRUE
................................................................................
   305    306   	/**
   306    307   	 * Liste des plugins installés (en DB)
   307    308   	 * @return array Liste des plugins triés par nom
   308    309   	 */
   309    310   	static public function listInstalled()
   310    311   	{
   311    312   		$db = DB::getInstance();
   312         -		$plugins = $db->simpleStatementFetchAssocKey('SELECT id, * FROM plugins ORDER BY nom;');
          313  +		$plugins = $db->getAssocKey('SELECT id, * FROM plugins ORDER BY nom;');
   313    314   		$system = explode(',', PLUGINS_SYSTEM);
   314    315   
   315    316   		foreach ($plugins as &$row)
   316    317   		{
   317         -			$row['system'] = in_array($row['id'], $system);
          318  +			$row->system = in_array($row->id, $system);
   318    319   		}
   319    320   
   320    321   		return $plugins;
   321    322   	}
   322    323   
   323    324   	/**
   324    325   	 * Liste les plugins qui doivent être affichés dans le menu
   325    326   	 * @return array Tableau associatif id => nom (ou un tableau vide si aucun plugin ne doit être affiché)
   326    327   	 */
   327    328   	static public function listMenu()
   328    329   	{
   329    330   		$db = DB::getInstance();
   330         -		return $db->simpleStatementFetchAssoc('SELECT id, nom FROM plugins WHERE menu = 1 ORDER BY nom;');
          331  +		return $db->getAssoc('SELECT id, nom FROM plugins WHERE menu = 1 ORDER BY nom;');
   331    332   	}
   332    333   
   333    334   	/**
   334    335   	 * Liste les plugins téléchargés mais non installés
   335    336   	 * @return array Liste des plugins téléchargés
   336    337   	 */
   337    338   	static public function listDownloaded()
................................................................................
   348    349   
   349    350   			if (!preg_match('!^([a-z0-9_.-]+)\.tar\.gz$!', $file, $match))
   350    351   				continue;
   351    352   			
   352    353   			if (array_key_exists($match[1], $installed))
   353    354   				continue;
   354    355   
   355         -			$list[$match[1]] = parse_ini_file('phar://' . PLUGINS_ROOT . '/' . $match[1] . '.tar.gz/garradin_plugin.ini', false);
          356  +			$list[$match[1]] = (object) parse_ini_file('phar://' . PLUGINS_ROOT . '/' . $match[1] . '.tar.gz/garradin_plugin.ini', false);
   356    357   		}
   357    358   
   358    359   		$dir->close();
   359    360   
   360    361   		return $list;
   361    362   	}
   362    363   
................................................................................
   370    371   		if (Static_Cache::expired('plugins_list', 3600 * 24))
   371    372   		{
   372    373   			$url = parse_url(PLUGINS_URL);
   373    374   
   374    375   			$context_options = [
   375    376   				'ssl' => [
   376    377   					'verify_peer'   => TRUE,
   377         -					// On vérifie en utilisant le certificat maître de CACert
   378         -					'cafile'        => ROOT . '/include/data/cacert.pem',
   379    378   					'verify_depth'  => 5,
   380    379   					'CN_match'      => $url['host'],
   381    380   					'SNI_enabled'	=> true,
   382    381   					'SNI_server_name'		=>	$url['host'],
   383    382   					'disable_compression'	=>	true,
   384    383   				]
   385    384   			];
................................................................................
   504    503   		}
   505    504   
   506    505   		if (!file_exists('phar://' . PLUGINS_ROOT . '/' . $id . '.tar.gz/garradin_plugin.ini'))
   507    506   		{
   508    507   			throw new UserException('L\'archive '.$id.'.tar.gz n\'est pas une extension Garradin : fichier garradin_plugin.ini manquant.');
   509    508   		}
   510    509   
   511         -		$infos = parse_ini_file('phar://' . PLUGINS_ROOT . '/' . $id . '.tar.gz/garradin_plugin.ini', false);
          510  +		$infos = (object) parse_ini_file('phar://' . PLUGINS_ROOT . '/' . $id . '.tar.gz/garradin_plugin.ini', false);
   512    511   
   513    512   		$required = ['nom', 'description', 'auteur', 'url', 'version', 'menu', 'config'];
   514    513   
   515    514   		foreach ($required as $key)
   516    515   		{
   517         -			if (!array_key_exists($key, $infos))
          516  +			if (!property_exists($infos, $key))
   518    517   			{
   519    518   				throw new \RuntimeException('Le fichier garradin_plugin.ini ne contient pas d\'entrée "'.$key.'".');
   520    519   			}
   521    520   		}
   522    521   
   523         -		if (!empty($infos['min_version']) && !version_compare(garradin_version(), $infos['min_version'], '>='))
          522  +		if (!empty($infos->min_version) && !version_compare(garradin_version(), $infos->min_version, '>='))
   524    523   		{
   525         -			throw new \RuntimeException('Le plugin '.$id.' nécessite Garradin version '.$infos['min_version'].' ou supérieure.');
          524  +			throw new \RuntimeException('Le plugin '.$id.' nécessite Garradin version '.$infos->min_version.' ou supérieure.');
   526    525   		}
   527    526   
   528         -		if (!empty($infos['menu']) && !file_exists('phar://' . PLUGINS_ROOT . '/' . $id . '.tar.gz/www/admin/index.php'))
          527  +		if (!empty($infos->menu) && !file_exists('phar://' . PLUGINS_ROOT . '/' . $id . '.tar.gz/www/admin/index.php'))
   529    528   		{
   530    529   			throw new \RuntimeException('Le plugin '.$id.' ne comporte pas de fichier www/admin/index.php alors qu\'il demande à figurer au menu.');
   531    530   		}
   532    531   
   533    532   		$config = '';
   534    533   
   535         -		if ((bool)$infos['config'])
          534  +		if ((bool)$infos->config)
   536    535   		{
   537    536   			if (!file_exists('phar://' . PLUGINS_ROOT . '/' . $id . '.tar.gz/config.json'))
   538    537   			{
   539    538   				throw new \RuntimeException('L\'archive '.$id.'.tar.gz ne comporte pas de fichier config.json 
   540    539   					alors que le plugin nécessite le stockage d\'une configuration.');
   541    540   			}
   542    541   
   543    542   			if (!file_exists('phar://' . PLUGINS_ROOT . '/' . $id . '.tar.gz/www/admin/config.php'))
   544    543   			{
   545    544   				throw new \RuntimeException('L\'archive '.$id.'.tar.gz ne comporte pas de fichier www/admin/config.php 
   546    545   					alors que le plugin nécessite le stockage d\'une configuration.');
   547    546   			}
   548    547   
   549         -			$config = json_decode(file_get_contents('phar://' . PLUGINS_ROOT . '/' . $id . '.tar.gz/config.json'), true);
          548  +			$config = json_decode(file_get_contents('phar://' . PLUGINS_ROOT . '/' . $id . '.tar.gz/config.json'));
   550    549   
   551    550   			if (is_null($config))
   552    551   			{
   553    552   				throw new \RuntimeException('config.json invalide. Code erreur JSON: ' . json_last_error());
   554    553   			}
   555    554   
   556    555   			$config = json_encode($config);
   557    556   		}
   558    557   
   559    558   		$db = DB::getInstance();
   560         -		$db->simpleInsert('plugins', [
          559  +		$db->insert('plugins', [
   561    560   			'id' 		=> 	$id,
   562    561   			'officiel' 	=> 	(int)(bool)$official,
   563         -			'nom'		=>	$infos['nom'],
   564         -			'description'=>	$infos['description'],
   565         -			'auteur'	=>	$infos['auteur'],
   566         -			'url'		=>	$infos['url'],
   567         -			'version'	=>	$infos['version'],
   568         -			'menu'		=>	(int)(bool)$infos['menu'],
          562  +			'nom'		=>	$infos->nom,
          563  +			'description'=>	$infos->description,
          564  +			'auteur'	=>	$infos->auteur,
          565  +			'url'		=>	$infos->url,
          566  +			'version'	=>	$infos->version,
          567  +			'menu'		=>	(int)(bool)$infos->menu,
   569    568   			'config'	=>	$config,
   570    569   		]);
   571    570   
   572    571   		if (file_exists('phar://' . PLUGINS_ROOT . '/' . $id . '.tar.gz/install.php'))
   573    572   		{
   574    573   			$plugin = new Plugin($id);
   575    574   
................................................................................
   582    581   	/**
   583    582   	 * Renvoie la version installée d'un plugin ou FALSE s'il n'est pas installé
   584    583   	 * @param  string $id Identifiant du plugin
   585    584   	 * @return mixed      Numéro de version du plugin ou FALSE
   586    585   	 */
   587    586   	static public function getInstalledVersion($id)
   588    587   	{
   589         -		return DB::getInstance()->simpleQuerySingle('SELECT version FROM plugins WHERE id = ?;');
          588  +		return DB::getInstance()->first('SELECT version FROM plugins WHERE id = ?;', $id);
   590    589   	}
   591    590   
   592    591   	/**
   593    592   	 * Déclenche le signal donné auprès des plugins enregistrés
   594    593   	 * @param  string $signal Nom du signal
   595    594   	 * @param  array  $params Paramètres du callback (array ou null)
   596    595   	 * @return NULL 		  NULL si aucun plugin n'a été appelé, true sinon
   597    596   	 */
   598    597   	static public function fireSignal($signal, $params = null, &$return = null)
   599    598   	{
   600         -		$list = DB::getInstance()->simpleStatementFetch('SELECT * FROM plugins_signaux WHERE signal = ?;', SQLITE3_ASSOC, $signal);
          599  +		$list = DB::getInstance()->get('SELECT * FROM plugins_signaux WHERE signal = ?;', $signal);
   601    600   
   602    601   		foreach ($list as $row)
   603    602   		{
   604    603   			if (!in_array($row['plugin'], self::$signal_files))
   605    604   			{
   606    605   				require_once 'phar://' . PLUGINS_ROOT . '/' . $row['plugin'] . '.tar.gz/signals.php';
   607    606   			}