You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
300 lines
9.2 KiB
300 lines
9.2 KiB
<?php |
|
if (!defined('_ECRIRE_INC_VERSION')) { |
|
return; |
|
} |
|
|
|
/** |
|
* Retourne la description complète ou une liste de champs précisés dans l'appel |
|
* d'un objet rubrique identifié par son id. |
|
* |
|
* @param int $id_rubrique Id de la rubrique. |
|
* @param array|string $informations Identifiant d'un champ ou de plusieurs champs de la description d'une rubrique. |
|
* Si l'argument est vide, la fonction renvoie la description complète. |
|
* |
|
* @return mixed La description brute complète ou partielle de la rubrique : |
|
* - sous la forme d'une valeur simple si l'information demandée est unique (chaine ou tableau à un élément) |
|
* - sous la forme d'un tabelau associatif sinon. |
|
* - sous la forme d'un tableau vide si une erreur s'est produite. |
|
*/ |
|
function rubrique_lire($id_rubrique, $informations = array()) { |
|
|
|
// Initialisation du tableau statique des descriptions |
|
static $descriptions_rubrique = array(); |
|
|
|
// Initialisation de la description (sortie en cas d'erreur). |
|
$description = array(); |
|
|
|
if ($id_rubrique = intval($id_rubrique)) { |
|
if (!isset($descriptions_rubrique[$id_rubrique])) { |
|
// Initialisation des attributs de la requête. |
|
$from = array('spip_rubriques'); |
|
$where[] = 'id_rubrique=' . $id_rubrique; |
|
|
|
// Acquisition de tous les champs du plugin et sauvegarde de celle-ci à l'index du préfixe. |
|
$descriptions_rubrique[$id_rubrique] = array(); |
|
if ($description = sql_fetsel('*', $from, $where)) { |
|
$descriptions_rubrique[$id_rubrique] = $description; |
|
} |
|
} |
|
|
|
// On extrait la description complète maintenant que l'on sait qu'elle existe. |
|
$description = $descriptions_rubrique[$id_rubrique]; |
|
} |
|
|
|
// On ne retourne que les champs demandés |
|
if ($description and $informations) { |
|
// Extraction des seules informations demandées. |
|
// -- si on demande une information unique on renvoie la valeur simple, sinon on renvoie un tableau. |
|
// -- si une information n'est pas un champ valide elle n'est pas renvoyée sans monter d'erreur. |
|
if (is_array($informations)) { |
|
if (count($informations) == 1) { |
|
// Tableau d'une seule information : on revient à une chaine unique. |
|
$informations = array_shift($informations); |
|
} else { |
|
// Tableau des informations valides |
|
$description = array_intersect_key($description, array_flip($informations)); |
|
} |
|
} |
|
|
|
if (is_string($informations)) { |
|
// Valeur unique demandée. |
|
$description = isset($description[$informations]) ? $description[$informations] : ''; |
|
} |
|
} |
|
|
|
return $description; |
|
} |
|
|
|
/** |
|
* Renvoie l'information brute demandée pour l'ensemble des types de plugins d'une typologie donnée |
|
* ou toute les descriptions si aucune information n'est explicitement demandée. |
|
* |
|
* @api |
|
* |
|
* @param array $filtres Liste des couples (champ, valeur) ou tableau vide. |
|
* @param array $informations Identifiant d'un champ ou de plusieurs champs de la description d'un type de plugin. |
|
* Si l'argument est vide, la fonction renvoie les descriptions complètes. |
|
* |
|
* @return array Description complète ou information précise pour chaque type de plugin de la typologie concernée. |
|
*/ |
|
function rubrique_repertorier($filtres = array(), $informations = array()) { |
|
|
|
// On récupère la description complète de toutes les rubriques |
|
// -- Table, colonnes et tri |
|
$from = array('spip_rubriques'); |
|
$select = '*'; |
|
$order_by = array('id_rubrique'); |
|
|
|
// -- Calcul du where à partir des filtres. |
|
$where = array(); |
|
if ($filtres) { |
|
foreach ($filtres as $_champ => $_critere) { |
|
$operateur = '='; |
|
$valeur = $_critere; |
|
if (substr($_critere, 0, 1) == '!') { |
|
$operateur = '!='; |
|
$valeur = ltrim($_critere, '!'); |
|
} |
|
$where[] = $_champ . $operateur . (intval($valeur) ? intval($valeur) : sql_quote($valeur)); |
|
} |
|
} |
|
|
|
// -- Appel SQL : le retour est toujours un tableau éventuellement vide. |
|
$rubriques_description = sql_allfetsel($select, $from, $where, '', $order_by); |
|
|
|
// Refactoring du tableau suivant les champs demandés. |
|
if (!$informations) { |
|
$rubriques = $rubriques_description; |
|
} else { |
|
$rubriques = array(); |
|
$informations = array_flip($informations); |
|
foreach ($rubriques_description as $_cle => $_rubrique) { |
|
$rubriques[] = array_intersect_key($rubriques_description[$_cle], $informations); |
|
} |
|
} |
|
|
|
return $rubriques; |
|
} |
|
|
|
/** |
|
* Libère, pour l'auteur l'ayant demandé, les éditions sur les rubriques. |
|
* |
|
* @uses lire_tableau_edition() |
|
* @uses ecrire_tableau_edition() |
|
* |
|
* @param int $id_auteur Identifiant de l'auteur |
|
* |
|
* @return void |
|
*/ |
|
function rubrique_debloquer_edition($id_auteur) { |
|
$edition = lire_tableau_edition(); |
|
|
|
foreach ($edition as $_objet => $_data) { |
|
if ($_objet == 'rubrique') { |
|
foreach ($_data as $_id => $_auteurs) { |
|
if (isset($_auteurs[$id_auteur])) { |
|
unset($edition[$_objet][$_id][$id_auteur]); |
|
ecrire_tableau_edition($edition); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
function rubrique_lire_categorie_secteur($id_rubrique) { |
|
static $categories = array(); |
|
|
|
if (!isset($categories[$id_rubrique])) { |
|
$categories[$id_rubrique] = ''; |
|
|
|
$id_secteur = rubrique_lire($id_rubrique, 'id_secteur'); |
|
$categories[$id_rubrique] = rubrique_lire($id_secteur, 'categorie'); |
|
} |
|
|
|
return $categories[$id_rubrique]; |
|
} |
|
|
|
function rubrique_determiner_type($id_rubrique) { |
|
static $types = array(); |
|
|
|
if (!isset($types[$id_rubrique])) { |
|
$types[$id_rubrique] = ''; |
|
if (rubrique_dans_secteur_plugin($id_rubrique)) { |
|
// On vérifie que la rubrique est soit une catégorie de profondeur inférieure à 1, soit un plugin de |
|
// profondeur 2 |
|
$rubrique = rubrique_lire($id_rubrique); |
|
if ((($rubrique['profondeur'] <= 1) and $rubrique['categorie']) |
|
or (($rubrique['profondeur'] == 2) and $rubrique['prefixe'])) { |
|
$types[$id_rubrique] = 'plugin'; |
|
} |
|
} elseif (rubrique_dans_secteur_apropos($id_rubrique)) { |
|
$types[$id_rubrique] = 'apropos'; |
|
} elseif (rubrique_dans_secteur_carnet($id_rubrique)) { |
|
$types[$id_rubrique] = 'carnet'; |
|
} elseif (rubrique_dans_secteur_galaxie($id_rubrique)) { |
|
$types[$id_rubrique] = 'galaxie'; |
|
} |
|
} |
|
|
|
return $types[$id_rubrique]; |
|
} |
|
|
|
/** |
|
* Vérifie que la rubrique concernée fait bien partie du secteur-apropos. |
|
* Le secteur-apropos est déterminé par la configuration du secteur exclus dans |
|
* le plugin Exclure Secteur. |
|
* |
|
* @param int $id |
|
* Id de la rubrique concernée. |
|
* @param mixed $id_rubrique |
|
* |
|
* @return bool |
|
* True si la rubrique fait partie du secteur-apropos, false sinon. |
|
*/ |
|
function rubrique_dans_secteur_apropos($id_rubrique) { |
|
$est_apropos = false; |
|
|
|
include_spip('inc/config'); |
|
$apropos = lire_config('secteur/exclure_sect', array()); |
|
|
|
if ($apropos |
|
and ($id_secteur = intval(rubrique_lire($id_rubrique, 'id_secteur'))) |
|
and in_array($id_secteur, $apropos)) { |
|
$est_apropos = true; |
|
} |
|
|
|
return $est_apropos; |
|
} |
|
|
|
/** |
|
* Vérifie que la rubrique concernée fait bien partie du secteur-carnet. |
|
* Le secteur-carnet est déterminé par la configuration de l'espace wiki dans le plugin |
|
* Autorité. |
|
* |
|
* @param mixed $id_rubrique Id de la rubrique concernée. |
|
* |
|
* @return bool True si la rubrique fait partie du secteur-carnet, false sinon. |
|
*/ |
|
function rubrique_dans_secteur_carnet($id_rubrique) { |
|
$est_carnet = false; |
|
|
|
include_spip('inc/config'); |
|
$carnet = lire_config('autorite/espace_wiki', array()); |
|
|
|
if ($carnet |
|
and ($id_secteur = intval(rubrique_lire($id_rubrique, 'id_secteur'))) |
|
and in_array($id_secteur, $carnet)) { |
|
$est_carnet = true; |
|
} |
|
|
|
return $est_carnet; |
|
} |
|
|
|
/** |
|
* Vérifie que la rubrique concernée fait bien partie du secteur-galaxie. |
|
* Les secteurs-galaxie sont déterminés par une configuration du plugin Contrib. |
|
* |
|
* @param mixed $id_rubrique Id de la rubrique concernée. |
|
* |
|
* @return bool True si la rubrique fait partie du secteur-galaxie, false sinon. |
|
*/ |
|
function rubrique_dans_secteur_galaxie($id_rubrique) { |
|
$est_galaxie = false; |
|
|
|
include_spip('inc/config'); |
|
$galaxie = lire_config('contrib/secteurs', array()); |
|
|
|
if ($galaxie |
|
and ($id_secteur = intval(rubrique_lire($id_rubrique, 'id_secteur'))) |
|
and in_array($id_secteur, $galaxie)) { |
|
$est_galaxie = true; |
|
} |
|
|
|
return $est_galaxie; |
|
} |
|
|
|
/** |
|
* Vérifie que la rubrique concernée fait bien partie d'un secteur-plugin. |
|
* Il suffit de vérifier que le secteur a bien une catégorie non vide. |
|
* |
|
* @param int $id |
|
* Id de la rubrique concernée. |
|
* @param mixed $id_rubrique |
|
* |
|
* @return bool |
|
* True si la rubrique fait partie d'un secteur-plugin, false sinon. |
|
*/ |
|
function rubrique_dans_secteur_plugin($id_rubrique) { |
|
static $est_plugin = array(); |
|
|
|
if (!isset($est_plugin[$id_rubrique])) { |
|
$est_plugin[$id_rubrique] = false; |
|
|
|
if (rubrique_lire_categorie_secteur($id_rubrique)) { |
|
$est_plugin[$id_rubrique] = true; |
|
} |
|
} |
|
|
|
return $est_plugin[$id_rubrique]; |
|
} |
|
|
|
/** |
|
* Récupère les id de tous les secteurs-plugin. |
|
* |
|
* @return array |
|
* Liste des id des secteurs-pllugin ou tableau vide. |
|
*/ |
|
function rubrique_lister_secteur_plugin() { |
|
|
|
// On sélectionne les rubriques de profondeur nulle et ayant une catégorie. |
|
$from = 'spip_rubriques'; |
|
$where = array( |
|
'profondeur=0', |
|
'categorie!=' . sql_quote('') |
|
); |
|
if ($secteurs = sql_allfetsel('id_rubrique', $from, $where)) { |
|
$secteurs = array_column($secteurs, 'id_rubrique'); |
|
} |
|
|
|
return $secteurs; |
|
}
|
|
|