$_descriptions) { $noisettes_squelette = $information ? array_column($_descriptions, $information, $cle) : array_column($_descriptions, null, $cle); $noisettes = array_merge($noisettes, $noisettes_squelette); } } } } return $noisettes; } /** * Renvoie la description brute d'une noisette sans traitement typo ni désérialisation des champs de type * tableau sérialisé. * * @package SPIP\NCORE\SERVICE\NOISETTE * * @uses ncore_chercher_service() * @uses ncore_squelette_identifier() * * @param string $plugin * Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier ou * un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe. * @param mixed $noisette * Identifiant de la noisette qui peut prendre soit la forme d'un entier ou d'une chaine unique, soit la forme * d'un triplet (squelette, contexte, rang). * @param string $stockage * Identifiant du service de stockage à utiliser si précisé. Dans ce cas, ni celui du plugin ni celui de N-Core * ne seront utilisés. En général, cet identifiant est le préfixe du plugin fournissant le stockage. * * @return array * Tableau de la description du type de noisette. Les champs textuels et les champs de type tableau sérialisé * sont retournés en l'état. */ function ncore_noisette_decrire($plugin, $noisette, $stockage = '') { $description = array(); // On cherche le service de stockage à utiliser selon la logique suivante : // - si le service de stockage est non vide on l'utilise en considérant que la fonction existe forcément; // - sinon, on utilise la fonction du plugin appelant si elle existe; // - et sinon, on utilise la fonction de N-Core. include_spip('inc/ncore_utils'); if ($decrire = ncore_chercher_service($plugin, 'noisette_decrire', $stockage)) { // On passe le plugin appelant à la fonction car cela permet ainsi de mutualiser les services de stockage. $description = $decrire($plugin, $noisette); } else { // Le plugin ne propose pas de fonction propre ou le stockage N-Core est explicitement demandé. // -- N-Core stocke les noisettes dans une meta propre au plugin appelant contenant un tableau au format // [squelette contextualisé][rang] = description include_spip('inc/config'); $meta_noisettes = lire_config("${plugin}_noisettes", array()); // On recherche la description dans la meta. if ($meta_noisettes) { if (!is_array($noisette)) { // L'identifiant est l'id unique de la noisette. Il faut donc parcourir le tableau pour trouver la // noisette désirée // => ce n'est pas la méthode optimale pour le stockage N-Core. $noisette_trouvee = false; foreach ($meta_noisettes as $_noisettes_squelette) { foreach ($_noisettes_squelette as $_noisette) { if ($_noisette['id_noisette'] == $noisette) { $description = $_noisette; $noisette_trouvee = true; break; } } if ($noisette_trouvee) { break; } } } else { if (isset($noisette['squelette'], $noisette['contexte'], $noisette['rang'])) { // Détermination de l'identifiant du squelette contextualisé. $squelette_contextualise = ncore_squelette_identifier( $plugin, $noisette['squelette'], $noisette['contexte'], $stockage ); if (!empty($meta_noisettes[$squelette_contextualise][$noisette['rang']])) { // L'identifiant est un tableau associatif fournissant le squelette contextualisé et le rang. // Comme la meta de N-Core est structurée ainsi c'est la méthode la plus adaptée pour adresser // le stockage de N-Core. $description = $meta_noisettes[$squelette_contextualise][$noisette['rang']]; } } } } } return $description; } /** * Construit un identifiant unique pour le squelette et son contexte sous forme de chaine. * Cette fonction est juste un aiguillage vers la fonction éventuelle du plugin utilisateur * car N-Core ne fournit pas de calcul par défaut. * * @package SPIP\NCORE\SERVICE\NOISETTE * * @uses ncore_chercher_service() * * @param string $plugin * Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier ou * un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe. * @param string $squelette * Chemin relatif du squelette où ajouter la noisette. * @param array $contexte * Tableau éventuellement vide matérialisant le contexte d'utilisation du squelette. * @param string $stockage * Identifiant du service de stockage à utiliser si précisé. Dans ce cas, ni celui du plugin ni celui de N-Core * ne seront utilisés. En général, cet identifiant est le préfixe du plugin fournissant le stockage. * * @return string * Identifiant du squelette contextualisé. */ function ncore_squelette_identifier($plugin, $squelette, $contexte, $stockage) { // Il faut calculer l'identifiant du squelette contextualisé pour accéder à la bonne liste // de noisettes. N-Core ne propose pas de fonction par défaut car l'élaboration de l'identifiant // en fonction du contexte est totalement spécifique au plugin utilisateur. // Il est donc indispensable que le plugin qui nécessite l'utilisation d'un contexte propose la // fonction de calcul associée sinon le contexte ne sera pas pris en compte et seul l'identifiant // du squelette sera retourné. $squelette_contextualise = ''; if ($squelette or $contexte) { include_spip('inc/ncore_utils'); if ($identifier = ncore_chercher_service($plugin, 'squelette_identifier', $stockage)) { // On passe le plugin appelant à la fonction car cela permet ainsi de mutualiser les services de stockage. $squelette_contextualise = $identifier($plugin, $squelette, $contexte); } } return $squelette_contextualise; }