Valider ca7e960d rédigé par Eric Lupinacci's avatar Eric Lupinacci
Parcourir les fichiers

Mettre en place un paramètre type_reponse pour limiter le contenu des...

Mettre en place un paramètre type_reponse pour limiter le contenu des collections plugins et paquets aux seuls données utiles pour SVP.
parent 00d7a535
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+36 −22
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -85,15 +85,12 @@ function svpapi_reponse_informer_plugin($contenu) {
 *
 * @uses plugin_normaliser_champs()
 *
 * @param array $conditions
 *      Tableau des conditions SQL à appliquer au select et correspondant aux filtres passés dans la requête.
 * @param array $filtres
 *      Tableau des critères de filtrage additionnels à appliquer au select.
 * @param array $configuration
 *      Configuration de la collection plugins utile pour savoir quelle fonction appeler pour construire chaque filtre.
 * @param array $conditions    Tableau des conditions SQL à appliquer au select et correspondant aux filtres
 *                             passés dans la requête et impliquant une condition.
 * @param array $filtres       Tableau des critères de filtrage additionnels à appliquer au select.
 * @param array $configuration Configuration de la collection plugins.
 *
 * @return array
 *      Tableau des plugins dont l'index est le préfixe du plugin.
 * @return array Tableau des plugins dont l'index est le préfixe du plugin.
 *               Les champs de type id ou maj ne sont pas renvoyés.
 */
function plugins_collectionner($conditions, $filtres, $configuration) {
@@ -108,15 +105,23 @@ function plugins_collectionner($conditions, $filtres, $configuration) {
	$group_by = array('spip_plugins.id_plugin');
	// -- Tous le champs sauf id_plugin et id_depot.
	include_spip('inc/svpapi_plugin');
	$select = array_keys(_SVPAPI_CONFIG_CHAMPS['plugin']);
	$options = [
		'pour_svp'  => isset($filtres['type_reponse']) and ($filtres['type_reponse'] === 'svp'),
		'avec_type' => false
	];
	$select = plugin_lister_champs('plugin', $options);

	// -- Initialisation du where avec les conditions sur la table des dépots.
	$where = array('spip_depots_plugins.id_depot>0', 'spip_depots_plugins.id_plugin=spip_plugins.id_plugin');
	$where = array(
		'spip_depots_plugins.id_depot>0',
		'spip_depots_plugins.id_plugin=spip_plugins.id_plugin'
	);
	// -- Si il y a des critères additionnels on complète le where en conséquence en fonction de la configuration.
	if ($conditions) {
		$where = array_merge($where, $conditions);
	}

	// Chargement de la collection demandée
	$collection = sql_allfetsel($select, $from, $where, $group_by);

	// On refactore le tableau de sortie du allfetsel en un tableau associatif indexé par les préfixes.
@@ -135,31 +140,36 @@ function plugins_collectionner($conditions, $filtres, $configuration) {
/**
 * Retourne la description complète d'un plugin et de ses paquets.
 *
 * @param string $prefixe
 *        La valeur du préfixe du plugin.
 * @param string $prefixe La valeur du préfixe du plugin.
 * @param array  $filtres       Tableau des critères de filtrage additionnels à appliquer au select.
 * @param array  $configuration Configuration de la collection plugins.
 *
 * @return array
 *         La description du plugin et de ses paquets, les champs étant tous normalisés (désérialisés).
 * @return array La description du plugin et de ses paquets, les champs étant tous normalisés (désérialisés).
 */
function plugins_ressourcer($prefixe) {
function plugins_ressourcer($prefixe, $filtres, $configuration) {

	// Initialisation du tableau de la ressource
	$ressource = array();

	// On recherche d'abord le plugin par son préfixe dans la table spip_plugins.
	// -- Liste des champs utiles
	include_spip('inc/svpapi_plugin');
	$options = [
		'pour_svp'  => isset($filtres['type_reponse']) and ($filtres['type_reponse'] === 'svp'),
		'avec_type' => false
	];
	$select = plugin_lister_champs('plugin', $options);
	// -- Acquisition du plugin (on est sur qu'il est en base) et suppression de l'id qui est inutile.
	include_spip('inc/svp_plugin');
	$plugin = plugin_lire($prefixe);
	unset($plugin['id_plugin']);
	$plugin = plugin_lire($prefixe, $select);
	// -- Normalisation des champs.
	include_spip('inc/svpapi_plugin');
	$ressource['plugin'] = plugin_normaliser_champs('plugin', $plugin);

	// On recherche maintenant les paquets du plugin.
	$from = array('spip_paquets');

	// -- Tous le champs sauf id_plugin et id_depot.
	$select = array_keys(_SVPAPI_CONFIG_CHAMPS['paquet']);
	// -- Tous le champs sauf id_plugin et id_depot (même options que pour les plugins).
	$select = plugin_lister_champs('paquet', $options);

	// -- Préfixe et conditions sur le dépôt pour exclure les paquets installés.
	$where = array(
@@ -282,7 +292,11 @@ function paquets_collectionner($conditions, $filtres, $configuration) {
	$from = array('spip_paquets');
	// -- Seuls les champs signifiants pour SVP
	include_spip('inc/svpapi_plugin');
	$select = array_keys(_SVPAPI_CONFIG_CHAMPS['paquet']);
	$options = [
		'pour_svp'  => isset($filtres['type_reponse']) and ($filtres['type_reponse'] === 'svp'),
		'avec_type' => false
	];
	$select = plugin_lister_champs('paquet', $options);

	// -- Initialisation du where avec les conditions sur la table des dépots.
	$where = array('id_depot>0');
+99 −42
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -19,45 +19,45 @@ if (!defined('_SVPAPI_CONFIG_CHAMPS')) {
		[
			'plugin' => [
				// SVP référentiel par défaut
				'prefixe'            => '',
				'nom'                => 'multi',
				'slogan'             => 'multi',
				'vmax'               => 'version',
				'date_crea'          => '',
				'date_modif'         => '',
				'compatibilite_spip' => '',
				'branches_spip'      => 'liste',
				'prefixe'            => ['svp' => true, 'type' => ''],
				'nom'                => ['svp' => true, 'type' => 'multi'],
				'slogan'             => ['svp' => true, 'type' => 'multi'],
				'vmax'               => ['svp' => true, 'type' => 'version'],
				'date_crea'          => ['svp' => false, 'type' => ''],
				'date_modif'         => ['svp' => false, 'type' => ''],
				'compatibilite_spip' => ['svp' => true, 'type' => ''],
				'branches_spip'      => ['svp' => true, 'type' => 'liste'],
				// SVP Statistiques
				'nbr_sites'  => '',
				'popularite' => '',
				'nbr_sites'          => ['svp' => false, 'type' => ''],
				'popularite'         => ['svp' => false, 'type' => ''],
			],
			'paquet' => [
				// SVP référentiel par défaut
				'prefixe'            => '',
				'logo'               => '',
				'version'            => 'version',
				'version_base'       => 'version',
				'compatibilite_spip' => '',
				'branches_spip'      => 'liste',
				'description'        => 'multi',
				'auteur'             => 'serial',
				'credit'             => 'serial',
				'licence'            => 'serial',
				'copyright'          => 'serial',
				'lien_doc'           => '',
				'lien_demo'          => '',
				'lien_dev'           => '',
				'etat'               => '',
				'etatnum'            => '',
				'dependances'        => 'serial',
				'procure'            => 'serial',
				'date_crea'          => '',
				'date_modif'         => '',
				'nom_archive'        => '',
				'nbo_archive'        => '',
				'maj_archive'        => '',
				'src_archive'        => '',
				'traductions'        => 'serial',
				'prefixe'            => ['svp' => true, 'type' => ''],
				'logo'               => ['svp' => true, 'type' => ''],
				'version'            => ['svp' => true, 'type' => 'version'],
				'version_base'       => ['svp' => true, 'type' => 'version'],
				'compatibilite_spip' => ['svp' => true, 'type' => ''],
				'branches_spip'      => ['svp' => true, 'type' => 'liste'],
				'description'        => ['svp' => true, 'type' => 'multi'],
				'auteur'             => ['svp' => true, 'type' => 'serial'],
				'credit'             => ['svp' => false, 'type' => 'serial'],
				'licence'            => ['svp' => false, 'type' => 'serial'],
				'copyright'          => ['svp' => false, 'type' => 'serial'],
				'lien_doc'           => ['svp' => true, 'type' => ''],
				'lien_demo'          => ['svp' => true, 'type' => ''],
				'lien_dev'           => ['svp' => false, 'type' => ''],
				'etat'               => ['svp' => true, 'type' => ''],
				'etatnum'            => ['svp' => true, 'type' => ''],
				'dependances'        => ['svp' => false, 'type' => 'serial'],
				'procure'            => ['svp' => false, 'type' => 'serial'],
				'date_crea'          => ['svp' => false, 'type' => ''],
				'date_modif'         => ['svp' => false, 'type' => ''],
				'nom_archive'        => ['svp' => true, 'type' => ''],
				'nbo_archive'        => ['svp' => true, 'type' => ''],
				'maj_archive'        => ['svp' => true, 'type' => ''],
				'src_archive'        => ['svp' => true, 'type' => ''],
				'traductions'        => ['svp' => false, 'type' => 'serial'],
			]
		]
	);
@@ -82,24 +82,41 @@ function plugin_normaliser_champs($type_objet, $objet) {
	// renvoyer vide si erreur.
	$objet_normalise = [];

	if ($objet) {
	// Extraire la liste des champs du type d'objet : on prend tout sans se soucier du fait que ce
	// soit dans le cadre d'utilisation de SVP ou autre.
	// -- on utilise une statique car cette fonction est appelée sur chaque objet
	static $champs_config = [];
	if (!isset($champs_config[$type_objet])) {
		$options = [
			'pour_svp'  => false,
			'avec_type' => true
		];
		$champs_config[$type_objet] = plugin_lister_champs($type_objet, $options);
	}

	if (
		$objet
		and $champs_config[$type_objet]
	) {
		// On boucle sur les champs de l'objet pour les normaliser au besoin selon leur type.
		include_spip('plugins/preparer_sql_plugin');
		include_spip('svp_fonctions');
		foreach ($objet as $_champ => $_valeur) {
			if (isset(_SVPAPI_CONFIG_CHAMPS[$type_objet][$_champ])) {
				if (_SVPAPI_CONFIG_CHAMPS[$type_objet][$_champ]) {
			if (isset($champs_config[$type_objet][$_champ]['type'])) {
				$type = $champs_config[$type_objet][$_champ]['type'];
				if ($type) {
					// On traite les normalisations
					if (_SVPAPI_CONFIG_CHAMPS[$type_objet][$_champ] === 'multi') {
					if ($type === 'multi') {
						// Passer un champ multi en tableau indexé par la langue
						$objet_normalise[$_champ] = normaliser_multi($_valeur);
					} elseif (_SVPAPI_CONFIG_CHAMPS[$type_objet][$_champ] === 'serial') {
					} elseif ($type === 'serial') {
						// Désérialiser un champ sérialisé
						$objet_normalise[$_champ] = unserialize($_valeur);
					} elseif (_SVPAPI_CONFIG_CHAMPS[$type_objet][$_champ] === 'version') {
					} elseif ($type === 'version') {
						// Retourne la chaine de la version x.y.z sous sa forme initiale, sans
						// remplissage à gauche avec des 0.
						$objet_normalise[$_champ] = denormaliser_version($_valeur);
					} elseif (_SVPAPI_CONFIG_CHAMPS[$type_objet][$_champ] === 'liste') {
					} elseif ($type === 'liste') {
						// Passer une chaine liste en tableau
						$objet_normalise[$_champ] = $_valeur ? explode(',', $_valeur) : [];
					}
@@ -113,3 +130,43 @@ function plugin_normaliser_champs($type_objet, $objet) {

	return $objet_normalise;
}

/**
 * Renvoie la liste des champs à renvoyer suite à une requête sur les collections paquets ou plugins.
 *
 * @param string $type_objet Type d'objet à normaliser, soit `plugin` ou `paquet`.
 * @param array  $options    Permet d'indiquer si la demande est pour SVP (gestion de l'installation des plugins)
 *                           et le format de la liste souhaitée:
 *                           - pour_svp  : true/false (par défaut true)
 *                           - avec_type : true, valeur par défaut, renvoie un tableau [champ] = type, false renvoie
 *                                         juste la liste des champs.
 *
 * @return array Liste des champs de l'objet `plugin` ou `paquet` utiles.
 */
function plugin_lister_champs($type_objet, $options = []) {

	// Par défaut, si erreur d'argument on renvoie un tableau vide
	$champs = [];

	if (isset(_SVPAPI_CONFIG_CHAMPS[$type_objet])) {
		// Initialisation des options
		if (!isset($options['pour_svp'])) {
			$options['pour_svp'] = true;
		}
		if (!isset($options['pour_svp'])) {
			$options['avec_type'] = true;
		}

		// Extraction des champs nécessaires
		$champs_objet = _SVPAPI_CONFIG_CHAMPS[$type_objet];
		if ($options['pour_svp']) {
			// Uniquement les champs nécessaire à SVP
			$champs_objet = array_filter($champs_objet, function($v) {return !empty($v['svp']);});
		}

		// Mise en liste de champs simple si demandé
		$champs = $options['avec_type'] ? $champs_objet : array_keys($champs_objet);
	}

	return $champs;
}
+10 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -41,6 +41,11 @@ function svpapi_liste_ezcollection($collections) {
				'critere'         => 'compatible_spip',
				'est_obligatoire' => false
			),
			array(
				'critere'         => 'type_reponse',
				'est_obligatoire' => false,
				'sans_condition'  => true,
			),
		)
	);

@@ -55,6 +60,11 @@ function svpapi_liste_ezcollection($collections) {
				'critere'         => 'compatible_spip',
				'est_obligatoire' => true
			),
			array(
				'critere'         => 'type_reponse',
				'est_obligatoire' => false,
				'sans_condition'  => true,
			),
		)
	);