--- /dev/null
+<?php\r
+\r
+// Sécurité\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+define('_CACHE_AJAX_NOISETTES', 'noisettes_ajax.php');\r
+define('_CACHE_CONTEXTE_NOISETTES', 'noisettes_contextes.php');\r
+define('_CACHE_DESCRIPTIONS_NOISETTES', 'noisettes_descriptions.php');\r
+define('_CACHE_INCLUSIONS_NOISETTES', 'noisettes_inclusions.php');\r
+\r
+// Pour compatibilité avec PHP4\r
+\r
+if (!function_exists('array_intersect_key'))\r
+{\r
+ function array_intersect_key($isec, $keys)\r
+ {\r
+ $argc = func_num_args();\r
+ if ($argc > 2)\r
+ {\r
+ for ($i = 1; !empty($isec) && $i < $argc; $i++)\r
+ {\r
+ $arr = func_get_arg($i);\r
+ foreach (array_keys($isec) as $key)\r
+ {\r
+ if (!isset($arr[$key]))\r
+ {\r
+ unset($isec[$key]);\r
+ }\r
+ }\r
+ }\r
+ return $isec;\r
+ }\r
+ else\r
+ {\r
+ $res = array();\r
+ foreach (array_keys($isec) as $key)\r
+ {\r
+ if (isset($keys[$key]))\r
+ {\r
+ $res[$key] = $isec[$key];\r
+ }\r
+ }\r
+ return $res;\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ * Lister les noisettes disponibles dans les dossiers noisettes/\r
+ *\r
+ * @staticvar array $liste_noisettes\r
+ * @param text $type\r
+ * @return array\r
+ */\r
+function noizetier_lister_noisettes($type='tout'){\r
+ static $liste_noisettes = array();\r
+ if ($type == 'tout') {\r
+ return noizetier_obtenir_infos_noisettes();\r
+ }\r
+ if (isset($liste_noisettes[$type])) {\r
+ return $liste_noisettes[$type];\r
+ }\r
+ \r
+ $noisettes = noizetier_obtenir_infos_noisettes();\r
+ if ($type == '') {\r
+ $match = "^[^-]*$";\r
+ } else {\r
+ $match = $type."-[^-]*$";\r
+ }\r
+ \r
+ foreach($noisettes as $noisette => $description) {\r
+ if (preg_match("/$match/", $noisette)) {\r
+ $liste_noisettes[$type][$noisette] = $description;\r
+ }\r
+ }\r
+ \r
+ return $liste_noisettes[$type];\r
+}\r
+\r
+\r
+\r
+/**\r
+ * Obtenir les infos de toutes les noisettes disponibles dans les dossiers noisettes/\r
+ * On utilise un cache php pour alleger le calcul.\r
+ *\r
+ * @param \r
+ * @return \r
+**/\r
+function noizetier_obtenir_infos_noisettes() {\r
+ static $noisettes = false;\r
+ \r
+ // seulement 1 fois par appel, on lit ou calcule tous les contextes\r
+ if ($noisettes === false) {\r
+ // lire le cache des descriptions sauvées\r
+ lire_fichier_securise(_DIR_CACHE . _CACHE_DESCRIPTIONS_NOISETTES, $noisettes);\r
+ $noisettes = @unserialize($noisettes);\r
+ // s'il en mode recalcul, on recalcule toutes les descriptions des noisettes trouvees.\r
+ // ou si le cache est désactivé\r
+ if (!$noisettes or (_request('var_mode') == 'recalcul') or (defined('_NO_CACHE') and _NO_CACHE!=0)) {\r
+ $noisettes = noizetier_obtenir_infos_noisettes_direct();\r
+ ecrire_fichier_securise(_DIR_CACHE . _CACHE_DESCRIPTIONS_NOISETTES, serialize($noisettes));\r
+ }\r
+ }\r
+ \r
+ return $noisettes;\r
+}\r
+\r
+\r
+/**\r
+ * Obtenir les infos de toutes les noisettes disponibles dans les dossiers noisettes/\r
+ * C'est un GROS calcul lorsqu'il est a faire.\r
+ *\r
+ * @return array\r
+ */\r
+function noizetier_obtenir_infos_noisettes_direct(){\r
+\r
+ $liste_noisettes = array();\r
+ \r
+ $match = "[^-]*[.]html$";\r
+ $liste = find_all_in_path('noisettes/', $match);\r
+ \r
+ if (count($liste)){\r
+ foreach($liste as $squelette=>$chemin) {\r
+ $noisette = preg_replace(',[.]html$,i', '', $squelette);\r
+ $dossier = str_replace($squelette, '', $chemin);\r
+ // On ne garde que les squelettes ayant un fichier YAML de config\r
+ if (file_exists("$dossier$noisette.yaml")\r
+ AND ($infos_noisette = noizetier_charger_infos_noisette_yaml($dossier.$noisette))\r
+ ){\r
+ $liste_noisettes[$noisette] = $infos_noisette;\r
+ }\r
+ }\r
+ }\r
+ \r
+ // supprimer de la liste les noisettes necissant un plugin qui n'est pas actif\r
+ foreach ($liste_noisettes as $noisette => $infos_noisette)\r
+ if (isset($infos_noisette['necessite']))\r
+ foreach ($infos_noisette['necessite'] as $plugin)\r
+ if (!defined('_DIR_PLUGIN_'.strtoupper($plugin)))\r
+ unset($liste_noisettes[$noisette]);\r
+ \r
+ return $liste_noisettes;\r
+}\r
+\r
+\r
+/**\r
+ * Charger les informations contenues dans le YAML d'une noisette\r
+ *\r
+ * @param string $noisette\r
+ * @param string $info\r
+ * @return array\r
+ */\r
+function noizetier_charger_infos_noisette_yaml($noisette, $info=""){\r
+ // on peut appeler avec le nom du squelette\r
+ $fichier = preg_replace(',[.]html$,i','',$noisette).".yaml";\r
+ include_spip('inc/yaml');\r
+ include_spip('inc/texte');\r
+ $infos_noisette = array();\r
+ if ($infos_noisette = yaml_charger_inclusions(yaml_decode_file($fichier))) {\r
+ if (isset($infos_noisette['nom']))\r
+ $infos_noisette['nom'] = _T_ou_typo($infos_noisette['nom']);\r
+ if (isset($infos_noisette['description']))\r
+ $infos_noisette['description'] = _T_ou_typo($infos_noisette['description']);\r
+ if (isset($infos_noisette['icon']))\r
+ $infos_noisette['icon'] = $infos_noisette['icon'];\r
+ \r
+ if (!isset($infos_noisette['parametres']))\r
+ $infos_noisette['parametres'] = array();\r
+ \r
+ // contexte\r
+ if (!isset($infos_noisette['contexte'])) {\r
+ $infos_noisette['contexte'] = array();\r
+ }\r
+ if (is_string($infos_noisette['contexte'])) {\r
+ $infos_noisette['contexte'] = array($infos_noisette['contexte']);\r
+ }\r
+ \r
+ // ajax\r
+ if (!isset($infos_noisette['ajax'])) {\r
+ $infos_noisette['ajax'] = 'oui';\r
+ }\r
+ // inclusion\r
+ if (!isset($infos_noisette['inclusion'])) {\r
+ $infos_noisette['inclusion'] = 'statique';\r
+ }\r
+ }\r
+\r
+ if (!$info)\r
+ return $infos_noisette;\r
+ else \r
+ return isset($infos_noisette[$info]) ? $infos_noisette[$info] : "";\r
+}\r
+\r
+/**\r
+ * Charger les informations des paramètres d'une noisette\r
+ *\r
+ * @param string $noisette\r
+ * @staticvar array $params_noisettes\r
+ * @return array\r
+ */\r
+function noizetier_charger_parametres_noisette($noisette){\r
+ static $params_noisettes = null;\r
+\r
+ if (is_null($params_noisettes[$noisette])){\r
+ $noisettes = noizetier_lister_noisettes();\r
+ $infos = $noisettes[$noisette];\r
+ $params_noisettes[$noisette] = extrait_parametres_noisette($infos['parametres']);\r
+ }\r
+ return $params_noisettes[$noisette];\r
+}\r
+\r
+/**\r
+ * Charger les informations des contexte pour une noisette\r
+ *\r
+ * @param string $noisette\r
+ * @staticvar array $params_noisettes\r
+ * @return array\r
+ */\r
+function noizetier_charger_contexte_noisette($noisette){\r
+ static $contexte_noisettes = null;\r
+\r
+ if (is_null($contexte_noisettes[$noisette])){\r
+ $noisettes = noizetier_lister_noisettes();\r
+ $contexte_noisettes[$noisette] = $noisettes[$noisette]['contexte'];\r
+ }\r
+ return $contexte_noisettes[$noisette];\r
+}\r
+\r
+\r
+/**\r
+ * Transforme un tableau au format du plugin saisies en un tableau de parametres dont les clés sont les noms des paramètres\r
+ * S'il y a de fieldset, les paramètres sont extraits de son entrée saisies\r
+ *\r
+ * @param string $parametres\r
+ * @return array\r
+ */\r
+function extrait_parametres_noisette($parametres){\r
+ $res = array();\r
+ if (is_array($parametres) && count($parametres)>0) {\r
+ foreach($parametres as $parametre) {\r
+ if ($parametre['saisie']!='fieldset') {\r
+ $nom = $parametre['options']['nom'];\r
+ $res[$nom] = $parametre['options'];\r
+ $res[$nom]['saisie'] = $parametre['saisie'];\r
+ if(isset($parametre['verifier']))\r
+ $res[$nom]['verifier']=$parametre['verifier'];\r
+ if(isset($res[$nom]['label']))\r
+ $res[$nom]['label'] = _T_ou_typo($res[$nom]['label']);\r
+ if(isset($res[$nom]['datas']))\r
+ foreach($res[$nom]['datas'] as $cle => $valeur)\r
+ $res[$nom]['datas'][$cle] = _T_ou_typo($res[$nom]['datas'][$cle]);\r
+ }\r
+ else {\r
+ $res = array_merge($res,extrait_parametres_noisette($parametre['saisies']));\r
+ }\r
+ }\r
+ }\r
+ return $res;\r
+}\r
+\r
+/**\r
+ * Lister les pages pouvant recevoir des noisettes\r
+ * Par défaut, cette liste est basée sur le contenu du répertoire contenu/\r
+ * Le tableau de résultats peut-être modifié via le pipeline noizetier_lister_pages.\r
+ *\r
+ * @staticvar array $liste_pages\r
+ * @return array\r
+ */\r
+function noizetier_lister_pages(){\r
+ static $liste_pages = null;\r
+\r
+ if (is_null($liste_pages)){\r
+ $liste_pages = array();\r
+ $match = ".+[.]html$";\r
+\r
+ // lister les fonds disponibles dans le répertoire contenu\r
+ $rep = defined('_NOIZETIER_REPERTOIRE_PAGES')?_NOIZETIER_REPERTOIRE_PAGES:'contenu/';\r
+ $liste = find_all_in_path($rep, $match);\r
+ if (count($liste)){\r
+ foreach($liste as $squelette=>$chemin) {\r
+ $page = preg_replace(',[.]html$,i', '', $squelette);\r
+ $dossier = str_replace($squelette, '', $chemin);\r
+ // Les éléments situés dans prive/contenu sont écartés\r
+ if (substr($dossier,-14)!='prive/contenu/')\r
+ if(count($infos_page = noizetier_charger_infos_page($dossier,$page))>0)\r
+ $liste_pages[$page] = $infos_page;\r
+ }\r
+ }\r
+ \r
+ // Dans le cas de Zpip, il faut supprimer la page 'page.html' et la page 'z_apl.html'\r
+ if (defined('_DIR_PLUGIN_Z')) {\r
+ unset($liste_pages['page']);\r
+ unset($liste_pages['z_apl']);\r
+ }\r
+ \r
+ // supprimer de la liste les pages necissant un plugin qui n'est pas actif\r
+ foreach ($liste_pages as $page => $infos_page)\r
+ if (isset($infos_page['necessite']))\r
+ foreach ($infos_page['necessite'] as $plugin)\r
+ if (!defined('_DIR_PLUGIN_'.strtoupper($plugin)))\r
+ unset($liste_pages[$page]);\r
+ \r
+ $liste_pages = pipeline('noizetier_lister_pages',$liste_pages);\r
+ \r
+ // On ajoute les compositions du noizetier\r
+ if(defined('_DIR_PLUGIN_COMPOSITIONS')){\r
+ $noizetier_compositions = unserialize($GLOBALS['meta']['noizetier_compositions']);\r
+ // On doit transformer le tableau de [type][compo] en [type-compo]\r
+ $liste_compos = array();\r
+ if (is_array($noizetier_compositions)) {\r
+ foreach($noizetier_compositions as $type => $compos_type)\r
+ foreach($compos_type as $compo => $infos_compo) {\r
+ $infos_compo['nom'] = typo($infos_compo['nom']);\r
+ $infos_compo['description'] = propre($infos_compo['description']);\r
+ $infos_compo['icon'] = $infos_compo['icon']!='' ? $infos_compo['icon'] : '';\r
+ if (isset($liste_pages[$type]))\r
+ $infos_compo['blocs'] = $liste_pages[$type]['blocs'];\r
+ else\r
+ $infos_compo['blocs'] = noizetier_blocs_defaut();\r
+ $liste_compos[$type.'-'.$compo] = $infos_compo;\r
+ }\r
+ }\r
+ $liste_pages = array_merge($liste_pages,$liste_compos);\r
+ }\r
+ }\r
+ return $liste_pages;\r
+}\r
+\r
+/**\r
+ * Charger les informations d'une page, contenues dans un xml de config s'il existe\r
+ *\r
+ * @param string $dossier\r
+ * @param string $page\r
+ * @param string $info\r
+ * @return array\r
+ */\r
+function noizetier_charger_infos_page($dossier,$page, $info=""){\r
+ // on peut appeler avec le nom du squelette\r
+ $page = preg_replace(',[.]html$,i','',$page);\r
+ \r
+ // On autorise le fait que le fichier xml ne soit pas dans le même plugin que le fichier .html\r
+ // Au cas où le fichier .html soit surchargé sans que le fichier .xml ne le soit\r
+ $rep = defined('_NOIZETIER_REPERTOIRE_PAGES')?_NOIZETIER_REPERTOIRE_PAGES:'contenu/';\r
+ $fichier = find_in_path("$rep$page.xml");\r
+ \r
+ include_spip('inc/xml');\r
+ include_spip('inc/texte');\r
+ $infos_page = array();\r
+ // S'il existe un fichier xml de configuration (s'il s'agit d'une composition on utilise l'info de la composition)\r
+ if (file_exists($fichier) AND $xml = spip_xml_load($fichier, false) AND count($xml['page']))\r
+ $xml = reset($xml['page']);\r
+ elseif (file_exists($fichier) AND $xml = spip_xml_load($fichier, false) AND count($xml['composition']))\r
+ $xml = reset($xml['composition']);\r
+ else\r
+ $xml = '';\r
+ if ($xml != '') {\r
+ $infos_page['nom'] = _T_ou_typo(spip_xml_aplatit($xml['nom']));\r
+ $infos_page['description'] = isset($xml['description']) ? _T_ou_typo(spip_xml_aplatit($xml['description'])) : '';\r
+ $infos_page['icon'] = isset($xml['icon']) ? reset($xml['icon']) : '';\r
+ // Décomposition des blocs\r
+ if (spip_xml_match_nodes(',^bloc,', $xml, $blocs)){\r
+ $infos_page['blocs'] = array();\r
+ foreach (array_keys($blocs) as $bloc){\r
+ list($balise, $attributs) = spip_xml_decompose_tag($bloc);\r
+ $infos_page['blocs'][$attributs['id']] = array(\r
+ 'nom' => $attributs['nom'] ? _T($attributs['nom']) : $attributs['id'],\r
+ 'icon' => isset($attributs['icon']) ? $attributs['icon'] : '',\r
+ 'description' => _T($attributs['description'])\r
+ );\r
+ }\r
+ }\r
+ if (spip_xml_match_nodes(',^necessite,', $xml, $necessites)){\r
+ $infos_page['necessite'] = array();\r
+ foreach (array_keys($necessites) as $necessite){\r
+ list($balise, $attributs) = spip_xml_decompose_tag($necessite);\r
+ $infos_page['necessite'][] = $attributs['id'];\r
+ }\r
+ }\r
+ }\r
+ // S'il n'y a pas de fichier XML de configuration\r
+ elseif (defined('_NOIZETIER_LISTER_PAGES_SANS_XML')?_NOIZETIER_LISTER_PAGES_SANS_XML:true) {\r
+ $infos_page['nom'] = $page;\r
+ $infos_page['icon'] = 'img/ic_page.png';\r
+ }\r
+ \r
+ // Si les blocs n'ont pas été définis, on applique les blocs par défaut\r
+ if (count($infos_page)>0 AND !isset($infos_page['blocs']))\r
+ $infos_page['blocs'] = noizetier_blocs_defaut();\r
+ \r
+ // On renvoie les infos\r
+ if (!$info)\r
+ return $infos_page;\r
+ else \r
+ return isset($infos_page[$info]) ? $infos_page[$info] : "";\r
+}\r
+\r
+/**\r
+ * Charger les informations d'une page, contenues dans un xml de config s'il existe\r
+ * La liste des blocs par défaut d'une page peut être modifiée via le pipeline noizetier_blocs_defaut.\r
+ *\r
+ * @staticvar array $blocs_defaut\r
+ * @return array\r
+ */\r
+function noizetier_blocs_defaut(){\r
+ static $blocs_defaut = null;\r
+\r
+ if (is_null($blocs_defaut)){\r
+ $blocs_defaut = array (\r
+ 'contenu' => array(\r
+ 'nom' => _T('noizetier:nom_bloc_contenu'),\r
+ 'description' => _T('noizetier:description_bloc_contenu'),\r
+ 'icon' => 'img/ic_bloc_contenu.png'\r
+ ),\r
+ 'navigation' => array(\r
+ 'nom' => _T('noizetier:nom_bloc_navigation'),\r
+ 'description' => _T('noizetier:description_bloc_navigation'),\r
+ 'icon' => 'img/ic_bloc_navigation.png'\r
+ ),\r
+ 'extra' => array(\r
+ 'nom' => _T('noizetier:nom_bloc_extra'),\r
+ 'description' => _T('noizetier:description_bloc_extra'),\r
+ 'icon' => 'img/ic_bloc_extra.png'\r
+ ),\r
+ );\r
+ $blocs_defaut = pipeline('noizetier_blocs_defaut',$blocs_defaut);\r
+ }\r
+ return $blocs_defaut;\r
+}\r
+\r
+/**\r
+ * Supprime de spip_noisettes les noisettes liées à une page\r
+ *\r
+ * @param text $page\r
+ * \r
+ */\r
+function supprimer_noisettes_page_noizetier($page) {\r
+ $type_compo = explode ('-',$page,2);\r
+ $type = $type_compo[0];\r
+ $composition = $type_compo[1];\r
+ \r
+ sql_delete('spip_noisettes','type='.sql_quote($type).'and composition='.sql_quote($composition));\r
+\r
+ // On invalide le cache\r
+ include_spip('inc/invalideur');\r
+ suivre_invalideur($page);\r
+}\r
+\r
+/**\r
+ * Renvoie le type d'une page\r
+ *\r
+ * @param text $page\r
+ * @return text\r
+ */\r
+function noizetier_page_type($page) {\r
+ $type_compo = explode ('-',$page,2);\r
+ return $type_compo[0];\r
+}\r
+\r
+/**\r
+ * Renvoie la composition d'une page\r
+ *\r
+ * @param text $page\r
+ * @return text\r
+ */\r
+function noizetier_page_composition($page) {\r
+ $type_compo = explode ('-',$page,2);\r
+ return $type_compo[1];\r
+}\r
+\r
+/**\r
+ * Liste les blocs pour lesquels il y a des noisettes à insérer.\r
+ *\r
+ * @staticvar array $liste_blocs\r
+ * @return array\r
+ */\r
+function noizetier_lister_blocs_avec_noisettes(){\r
+ static $liste_blocs = null;\r
+ \r
+ if (is_null($liste_blocs)){\r
+ $liste_blocs = array();\r
+ include_spip('base/abstract_sql');\r
+ $resultats = sql_allfetsel (\r
+ array('bloc', 'type', 'composition'),\r
+ 'spip_noisettes',\r
+ '1',\r
+ array('bloc', 'type', 'composition')\r
+ );\r
+ foreach ($resultats as $res) {\r
+ if ($res['composition'])\r
+ $liste_blocs[] = $res['bloc'].'/'.$res['type'].'-'.$res['composition'];\r
+ else\r
+ $liste_blocs[] = $res['bloc'].'/'.$res['type'];\r
+ }\r
+ }\r
+ return $liste_blocs;\r
+}\r
+\r
+/**\r
+ * Liste d'icônes obtenues en fouillant les répertoires img/ images/ image/ et /img-pack.\r
+ *\r
+ * @staticvar array $liste_icones\r
+ * @return array\r
+ */\r
+function noizetier_lister_icones(){\r
+ static $liste_icones = null;\r
+ \r
+ if (is_null($liste_icones)){\r
+ $match = ".+[.](jpg|jpeg|png|gif)$";\r
+ $liste_icones = array(\r
+ 'img' => find_all_in_path('img/', $match),\r
+ 'img-pack' => find_all_in_path('img-pack/', $match),\r
+ 'image' => find_all_in_path('image/', $match),\r
+ 'images' => find_all_in_path('images/', $match)\r
+ );\r
+ }\r
+ \r
+ return $liste_icones;\r
+}\r
+\r
+\r
+/**\r
+ * Retourne les elements du contexte uniquement\r
+ * utiles a la noisette demande.\r
+ *\r
+ * @param \r
+ * @return \r
+**/\r
+function noizetier_choisir_contexte($noisette, $contexte_entrant, $id_noisette) {\r
+ $contexte_noisette = array_flip(noizetier_obtenir_contexte($noisette));\r
+\r
+ // On transmet toujours l'id_noisette et les variables se terminant par _$id_noisette (utilisées par exemple par Aveline pour la pagination)\r
+ $contexte_min = array('id_noisette' => $id_noisette);\r
+ \r
+ if (isset($contexte_noisette['env'])) {\r
+ return array_merge($contexte_entrant,$contexte_min);\r
+ }\r
+ \r
+ $l = -1 * (strlen($id_noisette)+1);\r
+ foreach ($contexte_entrant as $variable => $valeur)\r
+ if (substr($variable,$l)=='_'.$id_noisette)\r
+ $contexte_min[$variable] = $valeur;\r
+ \r
+ if (isset($contexte_noisette['aucun'])) {\r
+ return $contexte_min;\r
+ }\r
+ if ($contexte_noisette) {\r
+ return array_merge(array_intersect_key($contexte_entrant, $contexte_noisette),$contexte_min);\r
+ }\r
+ \r
+ return $contexte_entrant;\r
+}\r
+\r
+\r
+\r
+/**\r
+ * Retourne la liste des contextes donc peut avoir besoin une noisette. \r
+ *\r
+ * @param \r
+ * @return \r
+**/\r
+function noizetier_obtenir_contexte($noisette) {\r
+ static $noisettes = false;\r
+ \r
+ // seulement 1 fois par appel, on lit ou calcule tous les contextes\r
+ if ($noisettes === false) {\r
+ // lire le cache des contextes sauves\r
+ lire_fichier_securise(_DIR_CACHE . _CACHE_CONTEXTE_NOISETTES, $noisettes);\r
+ $noisettes = @unserialize($noisettes);\r
+ \r
+ // s'il en mode recalcul, on recalcule tous les contextes des noisettes trouvees.\r
+ if (!$noisettes or (_request('var_mode') == 'recalcul')) {\r
+ include_spip('inc/noizetier');\r
+ $infos = noizetier_lister_noisettes();\r
+ $noisettes = array();\r
+ foreach ($infos as $cle_noisette => $infos) {\r
+ $noisettes[$cle_noisette] = ($infos['contexte'] ? $infos['contexte'] : array());\r
+ }\r
+ ecrire_fichier_securise(_DIR_CACHE . _CACHE_CONTEXTE_NOISETTES, serialize($noisettes));\r
+ }\r
+ }\r
+\r
+ if (isset($noisettes[$noisette])) {\r
+ return $noisettes[$noisette];\r
+ }\r
+ \r
+ return array();\r
+}\r
+\r
+/**\r
+ * Retourne true ou false pour indiquer si la noisette doit être inclue en ajax \r
+ *\r
+ * @param \r
+ * @return \r
+**/\r
+function noizetier_ajaxifier_noisette($noisette) {\r
+ static $noisettes = false;\r
+ \r
+ // seulement 1 fois par appel, on lit ou calcule tous les contextes\r
+ if ($noisettes === false) {\r
+ // lire le cache des contextes sauves\r
+ lire_fichier_securise(_DIR_CACHE . _CACHE_AJAX_NOISETTES, $noisettes);\r
+ $noisettes = @unserialize($noisettes);\r
+ \r
+ // s'il en mode recalcul, on recalcule tous les contextes des noisettes trouvees.\r
+ if (!$noisettes or (_request('var_mode') == 'recalcul')) {\r
+ include_spip('inc/noizetier');\r
+ $infos = noizetier_lister_noisettes();\r
+ $noisettes = array();\r
+ foreach ($infos as $cle_noisette => $infos) {\r
+ $noisettes[$cle_noisette] = ($infos['ajax'] == 'non') ? false : true ;\r
+ }\r
+ ecrire_fichier_securise(_DIR_CACHE . _CACHE_AJAX_NOISETTES, serialize($noisettes));\r
+ }\r
+ }\r
+\r
+ if (isset($noisettes[$noisette])) {\r
+ return $noisettes[$noisette];\r
+ }\r
+ \r
+ return true;\r
+}\r
+\r
+/**\r
+ * Retourne true ou false pour indiquer si la noisette doit être inclue dynamiquement\r
+ *\r
+ * @param \r
+ * @return \r
+**/\r
+function noizetier_inclusion_dynamique($noisette) {\r
+ static $noisettes = false;\r
+ \r
+ // seulement 1 fois par appel, on lit ou calcule tous les contextes\r
+ if ($noisettes === false) {\r
+ // lire le cache des contextes sauves\r
+ lire_fichier_securise(_DIR_CACHE . _CACHE_INCLUSIONS_NOISETTES, $noisettes);\r
+ $noisettes = @unserialize($noisettes);\r
+ \r
+ // s'il en mode recalcul, on recalcule tous les contextes des noisettes trouvees.\r
+ if (!$noisettes or (_request('var_mode') == 'recalcul')) {\r
+ include_spip('inc/noizetier');\r
+ $infos = noizetier_lister_noisettes();\r
+ $noisettes = array();\r
+ foreach ($infos as $cle_noisette => $infos) {\r
+ $noisettes[$cle_noisette] = ($infos['inclusion'] == 'dynamique') ? true : false ;\r
+ }\r
+ ecrire_fichier_securise(_DIR_CACHE . _CACHE_INCLUSIONS_NOISETTES, serialize($noisettes));\r
+ }\r
+ }\r
+\r
+ if (isset($noisettes[$noisette])) {\r
+ return $noisettes[$noisette];\r
+ }\r
+ \r
+ return false;\r
+}\r
+\r
+/**\r
+ * Retourne le tableau des noisettes et des compositions du noizetier pour les exports\r
+ *\r
+ * \r
+ * @return \r
+**/\r
+function noizetier_tableau_export() {\r
+ $data = array();\r
+ \r
+ // On calcule le tableau des noisettes\r
+ $data['noisettes'] = sql_allfetsel(\r
+ 'type, composition, bloc, noisette, parametres',\r
+ 'spip_noisettes',\r
+ '1',\r
+ '',\r
+ 'type, composition, bloc, rang, css'\r
+ );\r
+ \r
+ // On remet au propre les parametres\r
+ foreach ($data['noisettes'] as $cle => $noisette)\r
+ $data['noisettes'][$cle]['parametres'] = unserialize($noisette['parametres']);\r
+ \r
+ // On récupère les compositions du noizetier\r
+ $noizetier_compositions = unserialize($GLOBALS['meta']['noizetier_compositions']);\r
+ if (is_array($noizetier_compositions) AND count($noizetier_compositions)>0)\r
+ $data['noizetier_compositions'] = $noizetier_compositions;\r
+ \r
+ $data = pipeline('noizetier_config_export',$data);\r
+ \r
+ return $data;\r
+}\r
+\r
+/**\r
+ * Importe une configuration de noisettes et de compositions\r
+ *\r
+ * @param text $type_import\r
+ * @param text $import_compos\r
+ * @param array $config\r
+ * @return boolean\r
+ */\r
+function noizetier_importer_configuration($type_import, $import_compos, $config){\r
+ if ($type_import!='remplacer')\r
+ $type_import = 'fusion';\r
+ if ($import_compos!='oui')\r
+ $import_compos = 'non';\r
+ \r
+ $config = pipeline('noizetier_config_import',$config);\r
+ \r
+ // On s'occupe déjà des noisettes\r
+ $noisettes = $config['noisettes'];\r
+ include_spip('base/abstract_sql');\r
+ if (is_array($noisettes) AND count($noisettes)>0) {\r
+ $noisettes_insert = array();\r
+ $rang = 1;\r
+ $page = '';\r
+ if ($type_import=='remplacer')\r
+ sql_delete('spip_noisettes','1');\r
+ foreach($noisettes as $noisette) {\r
+ $type = $noisette['type'];\r
+ $composition = $noisette['composition'];\r
+ if ($type.'-'.$composition!=$page) {\r
+ $page = $type.'-'.$composition;\r
+ $rang = 1;\r
+ if ($type_import=='fusion')\r
+ $rang = sql_getfetsel('rang','spip_noisettes','type='.sql_quote($type).' AND composition='.sql_quote($composition),'','rang DESC') + 1;\r
+ }\r
+ else {\r
+ $rang = $rang + 1;\r
+ }\r
+ $noisette['rang']=$rang;\r
+ $noisette['parametres'] = serialize($noisette['parametres']);\r
+ $noisettes_insert[] = $noisette;\r
+ }\r
+ $ok = sql_insertq_multi('spip_noisettes',$noisettes_insert);\r
+ }\r
+ \r
+ // On s'occupe des compositions du noizetier\r
+ if ($import_compos=='oui') {\r
+ include_spip('inc/meta');\r
+ $compos_importees = $config['noizetier_compositions'];\r
+ if (is_array($compos_importees) AND count($compos_importees)>0){\r
+ if ($type_import=='remplacer')\r
+ effacer_meta('noizetier_compositions');\r
+ else \r
+ $noizetier_compositions = unserialize($GLOBALS['meta']['noizetier_compositions']);\r
+ \r
+ if (!is_array($noizetier_compositions))\r
+ $noizetier_compositions = array();\r
+ \r
+ foreach($compos_importees as $type => $compos_type)\r
+ foreach($compos_type as $composition => $info_compo)\r
+ $noizetier_compositions[$type][$composition] = $info_compo;\r
+ \r
+ ecrire_meta('noizetier_compositions',serialize($noizetier_compositions));\r
+ ecrire_metas();\r
+ }\r
+ }\r
+ \r
+ // On invalide le cache\r
+ include_spip('inc/invalideur');\r
+ suivre_invalideur('noizetier-import-config');\r
+ \r
+ return $ok;\r
+}\r
+\r
+?>\r