[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / compositions_v2 / compositions_fonctions.php
diff --git a/www/plugins/auto/compositions_v2/compositions_fonctions.php b/www/plugins/auto/compositions_v2/compositions_fonctions.php
new file mode 100644 (file)
index 0000000..28c56ca
--- /dev/null
@@ -0,0 +1,370 @@
+<?php\r
+/*\r
+ * Plugin Compositions\r
+ * (c) 2007-2009 Cedric Morin\r
+ * Distribue sous licence GPL\r
+ *\r
+ */\r
+\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+define('_COMPOSITIONS_MATCH','-([^0-9][^.]*)');\r
+\r
+/**\r
+ * Retrouver le nom du dossier ou sont stockees les compositions\r
+ * reglage par defaut, ou valeur personalisee via cfg\r
+ * \r
+ * @return string\r
+ */\r
+function compositions_chemin(){\r
+       $config_chemin = 'compositions/';\r
+       if (defined('_DIR_PLUGIN_Z') OR defined('_DIR_PLUGIN_ZCORE'))\r
+               $config_chemin = (isset($GLOBALS['z_blocs'])?reset($GLOBALS['z_blocs']):'contenu/');\r
+\r
+       if (isset($GLOBALS['meta']['compositions'])){\r
+               $config = unserialize($GLOBALS['meta']['compositions']);\r
+               if (isset ($config['chemin_compositions'])){\r
+                       $config_chemin = rtrim($config['chemin_compositions'],'/').'/';\r
+               }\r
+       }\r
+       \r
+       return $config_chemin;\r
+}\r
+\r
+/**\r
+ * Tester si la stylisation auto est activee\r
+ * @return string\r
+ */\r
+function compositions_styliser_auto(){\r
+       $config_styliser = true;\r
+       if (defined('_DIR_PLUGIN_Z') OR defined('_DIR_PLUGIN_ZCORE')){\r
+               $config_styliser = false; // Z s'occupe de styliser les compositions\r
+       }\r
+       elseif (isset($GLOBALS['meta']['compositions'])){\r
+               $config = unserialize($GLOBALS['meta']['compositions']);\r
+               $config_styliser = $config['styliser_auto'] != 'non';\r
+       }\r
+       return $config_styliser?' ':'';\r
+}\r
+\r
+/**\r
+ * Lister les compositions disponibles : toutes ou pour un type donne\r
+ * Si informer est a false, on ne charge pas les infos du xml\r
+ *\r
+ * @param string $type\r
+ * @param bool $informer\r
+ * @return array\r
+ */\r
+function compositions_lister_disponibles($type, $informer=true){\r
+       include_spip('inc/compositions');\r
+       $type = preg_replace(',\W,','',$type);\r
+       if ($type=='syndic') $type='site'; //grml\r
+       if (!strlen($type)) $type="[a-z0-9]+";\r
+\r
+\r
+       // rechercher les skel du type article-truc.html\r
+       // truc ne doit pas commencer par un chiffre pour eviter de confondre avec article-12.html\r
+       $match = "/($type)("._COMPOSITIONS_MATCH.")?[.]html$";\r
+\r
+       // lister les compositions disponibles\r
+       $liste = find_all_in_path(compositions_chemin(),$match);\r
+       $res = array();\r
+       if (count($liste)){\r
+               foreach($liste as $s) {\r
+                       $base = preg_replace(',[.]html$,i','',$s);\r
+                       if (preg_match(",$match,ims",$s,$regs)\r
+                         AND ($composition = !$informer\r
+                               OR $composition = compositions_charger_infos($base)))\r
+                               $res[$regs[1]][$regs[3]] = $composition;\r
+                       // retenir les skels qui ont un xml associe\r
+               }\r
+       }\r
+       // Pipeline compositions_lister_disponibles\r
+       if ($type=="[a-z0-9]+")\r
+               $type = '';\r
+       $res = pipeline('compositions_lister_disponibles',array(\r
+               'args'=>array('type' => $type,'informer' => $informer), \r
+               'data'=> $res\r
+               )\r
+       );\r
+       return $res;\r
+}\r
+\r
+/**\r
+ * Liste les id d'un type donne utilisant une composition donnee\r
+ *\r
+ * @param string $type\r
+ * @param string $composition\r
+ * @return array\r
+ */\r
+function compositions_lister_utilisations($type,$composition){\r
+       $table_sql = table_objet_sql($type);\r
+       if (!in_array($table_sql, sql_alltable())) return;\r
+       $_id_table_objet = id_table_objet($type);\r
+       return sql_allfetsel("$_id_table_objet as id,titre", $table_sql, "composition=".sql_quote($composition));\r
+}\r
+\r
+/**\r
+ * Selectionner le fond en fonction du type et de la composition\r
+ * en prenant en compte la configuration pour le chemin\r
+ * et le fait que la composition a pu etre supprimee\r
+ *\r
+ * @param string $composition\r
+ * @param string $type\r
+ * @param string $defaut\r
+ * @param string $ext\r
+ * @param bool $fullpath\r
+ * @param string $vide\r
+ * @return string\r
+ */\r
+function compositions_selectionner($composition,$type,$defaut="",$ext="html",$fullpath = false, $vide="composition-vide"){\r
+       if ($type=='syndic') $type='site'; //grml\r
+       $fond = compositions_chemin() . $type;\r
+\r
+       // regarder si compositions/article-xxx est disponible\r
+       if (strlen($composition)\r
+               AND $f = find_in_path("$fond-$composition.$ext"))\r
+               return $fullpath ? $f : $fond . "-$composition";\r
+       else\r
+               // sinon regarder si compositions/article-defaut est disponible\r
+               if (strlen($defaut)\r
+                       AND $f = find_in_path("$fond-$defaut.$ext"))\r
+                       return $fullpath ? $f : $fond . "-$defaut";\r
+\r
+       // se rabattre sur compositions/article si disponible\r
+       if ($f = find_in_path("$fond.$ext"))\r
+               return $fullpath ? $f : $fond;\r
+\r
+       // sinon une composition vide pour ne pas generer d'erreur\r
+       if ($vide AND $f = find_in_path("$vide.$ext"))\r
+               return $fullpath ? $f : $vide;\r
+\r
+       // rien mais ca fera une erreur dans le squelette si appele en filtre\r
+       return '';\r
+}\r
+\r
+/**\r
+ * Decrire une composition pour un objet\r
+ * @param string $type\r
+ * @param string $composition\r
+ * @return array|bool|string\r
+ */\r
+function compositions_decrire($type, $composition){\r
+       static $compositions = array();\r
+       if (!function_exists('compositions_charger_infos'))\r
+               include_spip('inc/compositions');\r
+       if ($type=='syndic') $type='site'; //grml\r
+       if (isset($compositions[$type][$composition]))\r
+               return $compositions[$type][$composition];\r
+       $ext = "html";\r
+       $fond = compositions_chemin() . $type;\r
+       if (strlen($composition)\r
+               AND $f = find_in_path("$fond-$composition.$ext")\r
+               AND $desc = compositions_charger_infos($f))\r
+               return $compositions[$type][$composition] = $desc;\r
+       return $compositions[$type][$composition] = false;\r
+}\r
+\r
+/**\r
+ * Un filtre a utiliser sur [(#COMPOSITION|composition_class{#ENV{type}})]\r
+ * pour poser des classes generiques sur le <body>\r
+ * si une balise <class>toto</class> est definie dans la composition c'est elle qui est appliquee\r
+ * sinon on pose simplement le nom de la composition\r
+ * \r
+ * @param string $composition\r
+ * @param string $type\r
+ * @return string\r
+ */\r
+function composition_class($composition,$type){\r
+       if ($desc = compositions_decrire($type, $composition)\r
+               AND isset($desc['class'])\r
+               AND strlen($desc['class']))\r
+               return $desc['class'];\r
+       return $composition;\r
+}\r
+\r
+/**\r
+ * Liste les types d'objets qui ont une composition\r
+ * utilise la valeur en cache meta sauf si demande de recalcul\r
+ * ou pas encore definie\r
+ *\r
+ * @staticvar array $liste\r
+ * @return array\r
+ */\r
+function compositions_types(){\r
+       static $liste = null;\r
+       if (is_null($liste)) {\r
+               if ($GLOBALS['var_mode'] OR !isset($GLOBALS['meta']['compositions_types'])){\r
+                       include_spip('inc/compositions');\r
+                       compositions_cacher();\r
+               }\r
+               $liste = explode(',',$GLOBALS['meta']['compositions_types']);\r
+       }\r
+       return $liste;\r
+}\r
+\r
+/**\r
+ * Renvoie la composition qui s'applique � un objet\r
+ * en tenant compte, le cas �ch�ant, de la composition h�rit�e\r
+ * si etoile=true on renvoi dire le champ sql\r
+ *\r
+ * @param string $type\r
+ * @param integer $id\r
+ * @param string $serveur\r
+ * @param bool $etoile\r
+ * @return string\r
+ */\r
+function compositions_determiner($type, $id, $serveur='', $etoile = false){\r
+       static $composition = array();\r
+\r
+       if (isset($composition[$etoile][$serveur][$type][$id]))\r
+               return $composition[$etoile][$serveur][$type][$id];\r
+\r
+       include_spip('base/abstract_sql');\r
+       $table = table_objet($type);\r
+       $table_sql = table_objet_sql($type);\r
+       $_id_table = id_table_objet($type);\r
+\r
+       $retour = '';\r
+\r
+       $trouver_table = charger_fonction('trouver_table', 'base');\r
+       $desc = $trouver_table($table,$serveur);\r
+       if (isset($desc['field']['composition']) AND $id){\r
+               $select = "composition";\r
+               if (isset($desc['field']['id_rubrique']))\r
+                       $select .= "," . (($type == 'rubrique') ? 'id_parent' : 'id_rubrique as id_parent');\r
+               $row = sql_fetsel($select, $table_sql, "$_id_table=".intval($id), '', '', '', '', $serveur);\r
+               if ($row['composition'] != '')\r
+                       $retour = $row['composition'];\r
+               elseif (!$etoile\r
+                 AND isset($row['id_parent'])\r
+                 AND $row['id_parent'])\r
+                       $retour = compositions_heriter($type, $row['id_parent'], $serveur);\r
+       }\r
+       return $composition[$etoile][$serveur][$type][$id] = (($retour == '-') ? '' : $retour);\r
+}\r
+\r
+/**\r
+ * Renvoie la composition h�rit�e par un objet selon sa rubrique\r
+ *\r
+ * @param string $type\r
+ * @param integer $id_rubrique\r
+ * @param string $serveur\r
+ * @return string\r
+ */\r
+function compositions_heriter($type, $id_rubrique, $serveur=''){\r
+       if ($type=='syndic') $type='site'; //grml\r
+       if (intval($id_rubrique) < 1) return '';\r
+       static $infos = null;\r
+       $id_parent = $id_rubrique;\r
+       $compo_rubrique = '';\r
+       do {\r
+               $row = sql_fetsel(array('id_parent','composition'),'spip_rubriques','id_rubrique='.intval($id_parent),'','','','',$serveur);\r
+               if (strlen($row['composition']) AND $row['composition']!='-')\r
+                       $compo_rubrique = $row['composition'];\r
+               elseif (strlen($row['composition'])==0) // il faut aussi verifier que la rub parente n'herite pas elle-meme d'une composition\r
+                       $compo_rubrique = compositions_determiner('rubrique', $id_parent, $serveur='');\r
+               \r
+               if (strlen($compo_rubrique) AND is_null($infos))\r
+                       $infos = compositions_lister_disponibles('rubrique');\r
+       }\r
+       while ($id_parent = $row['id_parent']\r
+               AND\r
+               (!strlen($compo_rubrique) OR !isset($infos['rubrique'][$compo_rubrique]['branche'][$type])));\r
+\r
+       if (strlen($compo_rubrique) AND isset($infos['rubrique'][$compo_rubrique]['branche'][$type]))\r
+               return $infos['rubrique'][$compo_rubrique]['branche'][$type];\r
+\r
+       return '';\r
+}\r
+\r
+/**\r
+ * #COMPOSITION\r
+ * Renvoie la composition s'appliquant � un objet\r
+ * en tenant compte, le cas �ch�ant, de l'h�ritage.\r
+ *\r
+ * Sans precision, l'objet et son identifiant sont pris\r
+ * dans la boucle en cours, mais l'on peut sp�cifier notre recherche\r
+ * en passant objet et id_objet en argument de la balise :\r
+ * #COMPOSITION{article, 8}\r
+ *\r
+ * #COMPOSITION* renvoie toujours le champs brut, sans tenir compte de l'heritage\r
+ *\r
+ * @param array $p     AST au niveau de la balise\r
+ * @return array       AST->code modifi� pour calculer le nom de la composition\r
+ */\r
+function balise_COMPOSITION_dist($p) {\r
+       $_composition = "";\r
+       if ($_objet = interprete_argument_balise(1, $p)) {\r
+               $_id_objet = interprete_argument_balise(2, $p);\r
+       } else {\r
+               $_composition = champ_sql('composition',$p);\r
+               $_id_objet = champ_sql($p->boucles[$p->id_boucle]->primary, $p);\r
+               $_objet = "objet_type('" . $p->boucles[$p->id_boucle]->id_table . "')";\r
+       }\r
+       // si on veut le champ brut, et qu'on l'a sous la main, inutile d'invoquer toute la machinerie\r
+       if ($_composition AND $p->etoile)\r
+               $p->code = $_composition;\r
+       else {\r
+               $connect = $p->boucles[$p->id_boucle]->sql_serveur;\r
+               $p->code = "compositions_determiner($_objet, $_id_objet, '$connect', ".($p->etoile?'true':'false').")";\r
+               // ne declencher l'usine a gaz que si composition est vide ...\r
+               if ($_composition)\r
+                       $p->code = "((\$zc=$_composition)?(\$zc=='-'?'':\$zc):".$p->code.")";\r
+       }\r
+       return $p;\r
+}\r
+\r
+/**\r
+ * Indique si la composition d'un objet est verrouill�e ou non,\r
+ * auquel cas, seul le webmaster peut la modifier\r
+ *\r
+ * @param string $type\r
+ * @param integer $id\r
+ * @param string $serveur\r
+ * @return string\r
+ */\r
+function compositions_verrouiller($type, $id, $serveur=''){\r
+       $config = unserialize($GLOBALS['meta']['compositions']);\r
+       if ($config['tout_verrouiller'] == 'oui')\r
+               return true;\r
+       \r
+       include_spip('base/abstract_sql');\r
+       $table = table_objet($type);\r
+       $table_sql = table_objet_sql($type);\r
+       $_id_table = id_table_objet($type);\r
+\r
+       $trouver_table = charger_fonction('trouver_table', 'base');\r
+       $desc = $trouver_table($table,$serveur);\r
+       if (isset($desc['field']['composition_lock']) AND $id){\r
+               $lock = sql_getfetsel('composition_lock', $table_sql, "$_id_table=".intval($id), '', '', '', '', $serveur);\r
+               if ($lock)\r
+                       return true;\r
+               elseif (isset($desc['field']['id_rubrique'])) {\r
+                       $id_rubrique = sql_getfetsel('id_rubrique', $table_sql, "$_id_table=".intval($id), '', '', '', '', $serveur);\r
+                       return compositions_verrou_branche($id_rubrique, $serveur);\r
+               }\r
+               else\r
+                       return false;\r
+       }\r
+       else return false;\r
+}\r
+\r
+/**\r
+ * Indique si les objets d'une branche sont verrouill�s\r
+ * @param integer $id_rubrique\r
+ * @param string $serveur\r
+ * @return string\r
+ */\r
+function compositions_verrou_branche($id_rubrique, $serveur=''){\r
+       \r
+       if (intval($id_rubrique) < 1) return false;\r
+       if($infos_rubrique = sql_fetsel(array('id_parent','composition_branche_lock'),'spip_rubriques','id_rubrique='.intval($id_rubrique),'','','','',$serveur)) {\r
+               if ($infos_rubrique['composition_branche_lock'])\r
+                       return true;\r
+               else\r
+                       return compositions_verrou_branche($infos_rubrique['id_parent'],$serveur);\r
+       }\r
+       return '';\r
+}\r
+?>\r