You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svp_typologie/ezrest/svptype.php

226 lines
8.7 KiB
PHP

<?php
/**
* Ce fichier contient l'ensemble des fonctions de service spécifiques à une collection.
*
* @package SPIP\SVPTYPE\EZREST\SERVICE
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// -----------------------------------------------------------------------
// ----------------------- COLLECTION CATEGORIES -------------------------
// -----------------------------------------------------------------------
/**
* Récupère la liste des catégories de la table spip_mots éventuellement filtrée par profondeur.
*
* @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.
* @param array $configuration Configuration de la collection catégories utile pour savoir quelle fonction appeler pour construire
* chaque filtre.
*
* @return array Tableau des catégories.
*/
function categories_collectionner(array $conditions, array $filtres, array $configuration) : array {
// Initialisation de la typologie
$typologie = 'categorie';
// Récupérer la collection demandée.
include_spip('inc/svptype_typologie');
$categories = typologie_plugin_collectionner($typologie, $filtres);
return $categories;
}
/**
* Détermine si la valeur de la profondeur est valide.
*
* @param mixed $profondeur La valeur du critère profondeur
* @param array<string, mixed> &$erreur Tableau initialisé avec les index identifiant l'erreur.
*
* @return bool `true` si la valeur est valide, `false` sinon.
*/
function categories_verifier_filtre_profondeur($profondeur, array &$erreur) : bool {
$est_valide = true;
// Acquisition de la liste des catégories affectables.
include_spip('inc/config');
$max_profondeur = lire_config('svptype/typologies/categorie/max_profondeur', 0);
// Test de validité
if ((int) $profondeur > $max_profondeur) {
$est_valide = false;
$erreur['type'] = 'profondeur_nok';
$erreur['extra'] = _T('svptype:erreur_400_profondeur_nok_extra', ['max' => $max_profondeur]);
}
return $est_valide;
}
// -----------------------------------------------------------------------
// -------------------------- COLLECTION TAGS ----------------------------
// -----------------------------------------------------------------------
/**
* Récupère la liste des tags de la table spip_mots.
*
* @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: toujours vide pour les tags.
* @param array $configuration Configuration de la collection catégories utile pour savoir quelle fonction appeler pour construire
* chaque filtre.
*
* @return array Tableau des catégories.
*/
function tags_collectionner(array $conditions, array $filtres, array $configuration) : array {
// Initialisation de la typologie
$typologie = 'tag';
// Récupérer la collection demandée.
include_spip('inc/svptype_typologie');
$tags = typologie_plugin_collectionner($typologie, $filtres);
return $tags;
}
// -----------------------------------------------------------------------
// ---------------------- COLLECTION AFFECTATIONS ------------------------
// -----------------------------------------------------------------------
/**
* Récupère la liste des affectations pour une typologie donnée.
*
* @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 : permet en particulier de choisir les affectations pour une typologie donnée.
* @param array $configuration Configuration de la collection affectations utile pour savoir quelle fonction appeler pour construire
* chaque filtre (pas utilisée aujourd'hui).
*
* @return array Tableau des affectations indexé par préfixe de plugin.
*/
function affectations_collectionner(array $conditions, array $filtres, array $configuration) : array {
// Initialisation de la collection
$affectations = [];
// On traite préalablement le filtre typologie :
// -- celui-ci est forcément présent (obligatoire) et sa valeur est forcément valide.
$typologie = $filtres['typologie'];
// Récupérer les informations sur la typologie et le groupe de mots correspondant.
// -- on loge l'identifiant de la typologie.
$affectations['typologie'] = ['identifiant' => $typologie];
// -- on ajoute le titre du groupe de mots
include_spip('inc/config');
$configuration_typologie = lire_config("svptype/typologies/{$typologie}", []);
$id_groupe = (int) ($configuration_typologie['id_groupe']);
$select = ['titre'];
$where = ['id_groupe=' . $id_groupe];
$affectations['typologie'] = array_merge(
$affectations['typologie'],
sql_fetsel($select, 'spip_groupes_mots', $where)
);
// On supprime la typologie des filtres pour ne garder que les filtres optionnels à traiter.
unset($filtres['typologie']);
// Récupération du couple (identifiant du type, préfixe du plugin) de chaque affectation.
// Le tableau de sortie est présenté par préfixe de plugin :
// - si la typologie n'autorise qu'un type par plugin le tableau est de la forme [prefixe] = [type]
// - sinon si plusieurs types sont possibles, le tableauu est de la forme [prefixe] = array(types)
include_spip('inc/svptype_type_plugin');
$collection = type_plugin_repertorier_affectation($typologie, $filtres);
// On refactore le tableau de façon à le présenter avec le préfixe en index.
// -- la liste des types est toujours un tableau même si pour une typologie un seul type est affectable.
$affectations['affectations'] = [];
if ($collection) {
foreach ($collection as $_affectation) {
$affectations['affectations'][$_affectation['prefixe']][] = $_affectation['identifiant_mot'];
}
}
return $affectations;
}
/**
* Détermine si la valeur de la profondeur est valide.
*
* @param mixed $typologie Identifiant de la typologie concernée : categorie, tag...
* @param array<string, mixed> &$erreur Tableau initialisé avec les index identifiant l'erreur.
*
* @return bool `true` si la valeur est valide, `false` sinon.
*/
function affectations_verifier_filtre_typologie($typologie, array &$erreur) : bool {
$est_valide = true;
// Acquisition de la liste des catégories affectables.
include_spip('inc/config');
$typologies = array_keys(lire_config('svptype/typologies', []));
// Test de validité
if (!in_array($typologie, $typologies)) {
$est_valide = false;
$erreur['type'] = 'typologie_nok';
$erreur['extra'] = implode(', ', $typologies);
}
return $est_valide;
}
// -----------------------------------------------------------------------
// ------------------------ COLLECTION PLUGINS ---------------------------
// -----------------------------------------------------------------------
/**
* Détermine si la valeur de la catégorie est valide.
* La fonction récupère via l'API du plugin la liste des catégories autorisées.
*
* @param mixed $categorie La valeur du critère catégorie
* @param array<string, mixed> &$erreur Tableau initialisé avec les index identifiant l'erreur.
*
* @return bool `true` si la valeur est valide, `false` sinon.
*/
function plugins_verifier_filtre_categorie($categorie, array &$erreur) : bool {
$est_valide = true;
// Acquisition de la liste des catégories affectables.
include_spip('inc/svptype_type_plugin');
$filtres = ['profondeur' => 1];
$informations = ['identifiant'];
$categories = type_plugin_repertorier('categorie', $filtres, $informations);
// Test de validité
if (!in_array($categorie, array_column($categories, 'identifiant'))) {
$est_valide = false;
$erreur['type'] = 'categorie_nok';
$erreur['extra'] = 'https://contrib.spip.net/';
}
return $est_valide;
}
/**
* Construit le critère applicable sur la table spip_plugins pour filtrer la collection sur le
* critère categorie.
*
* @param mixed $categorie La valeur du critère catégorie
*
* @return string Chaine représentant le critère sur la catégorie appliqué à la table spip_plugins.
*/
function plugins_conditionner_categorie($categorie) : string {
// On initialise le critère avec une condition toujours fausse.
$condition = '0=1';
// On récupère les affectations de plugins pour la catégorie demandée
include_spip('inc/svptype_type_plugin');
$filtres = ['type' => $categorie];
$affectations = type_plugin_repertorier_affectation('categorie', $filtres);
// Construction de la condition sur les préfixes
if ($affectations) {
$plugins = array_column($affectations, 'prefixe');
$condition = sql_in('prefixe', $plugins);
}
return $condition;
}