X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fplugins%2Fauto%2Fcompositions_v2%2Fcompositions_fonctions.php;fp=www%2Fplugins%2Fauto%2Fcompositions_v2%2Fcompositions_fonctions.php;h=28c56caf0225d527dbe5618287c64ea45bc24a8d;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/plugins/auto/compositions_v2/compositions_fonctions.php b/www/plugins/auto/compositions_v2/compositions_fonctions.php new file mode 100644 index 0000000..28c56ca --- /dev/null +++ b/www/plugins/auto/compositions_v2/compositions_fonctions.php @@ -0,0 +1,370 @@ +array('type' => $type,'informer' => $informer), + 'data'=> $res + ) + ); + return $res; +} + +/** + * Liste les id d'un type donne utilisant une composition donnee + * + * @param string $type + * @param string $composition + * @return array + */ +function compositions_lister_utilisations($type,$composition){ + $table_sql = table_objet_sql($type); + if (!in_array($table_sql, sql_alltable())) return; + $_id_table_objet = id_table_objet($type); + return sql_allfetsel("$_id_table_objet as id,titre", $table_sql, "composition=".sql_quote($composition)); +} + +/** + * Selectionner le fond en fonction du type et de la composition + * en prenant en compte la configuration pour le chemin + * et le fait que la composition a pu etre supprimee + * + * @param string $composition + * @param string $type + * @param string $defaut + * @param string $ext + * @param bool $fullpath + * @param string $vide + * @return string + */ +function compositions_selectionner($composition,$type,$defaut="",$ext="html",$fullpath = false, $vide="composition-vide"){ + if ($type=='syndic') $type='site'; //grml + $fond = compositions_chemin() . $type; + + // regarder si compositions/article-xxx est disponible + if (strlen($composition) + AND $f = find_in_path("$fond-$composition.$ext")) + return $fullpath ? $f : $fond . "-$composition"; + else + // sinon regarder si compositions/article-defaut est disponible + if (strlen($defaut) + AND $f = find_in_path("$fond-$defaut.$ext")) + return $fullpath ? $f : $fond . "-$defaut"; + + // se rabattre sur compositions/article si disponible + if ($f = find_in_path("$fond.$ext")) + return $fullpath ? $f : $fond; + + // sinon une composition vide pour ne pas generer d'erreur + if ($vide AND $f = find_in_path("$vide.$ext")) + return $fullpath ? $f : $vide; + + // rien mais ca fera une erreur dans le squelette si appele en filtre + return ''; +} + +/** + * Decrire une composition pour un objet + * @param string $type + * @param string $composition + * @return array|bool|string + */ +function compositions_decrire($type, $composition){ + static $compositions = array(); + if (!function_exists('compositions_charger_infos')) + include_spip('inc/compositions'); + if ($type=='syndic') $type='site'; //grml + if (isset($compositions[$type][$composition])) + return $compositions[$type][$composition]; + $ext = "html"; + $fond = compositions_chemin() . $type; + if (strlen($composition) + AND $f = find_in_path("$fond-$composition.$ext") + AND $desc = compositions_charger_infos($f)) + return $compositions[$type][$composition] = $desc; + return $compositions[$type][$composition] = false; +} + +/** + * Un filtre a utiliser sur [(#COMPOSITION|composition_class{#ENV{type}})] + * pour poser des classes generiques sur le + * si une balise toto est definie dans la composition c'est elle qui est appliquee + * sinon on pose simplement le nom de la composition + * + * @param string $composition + * @param string $type + * @return string + */ +function composition_class($composition,$type){ + if ($desc = compositions_decrire($type, $composition) + AND isset($desc['class']) + AND strlen($desc['class'])) + return $desc['class']; + return $composition; +} + +/** + * Liste les types d'objets qui ont une composition + * utilise la valeur en cache meta sauf si demande de recalcul + * ou pas encore definie + * + * @staticvar array $liste + * @return array + */ +function compositions_types(){ + static $liste = null; + if (is_null($liste)) { + if ($GLOBALS['var_mode'] OR !isset($GLOBALS['meta']['compositions_types'])){ + include_spip('inc/compositions'); + compositions_cacher(); + } + $liste = explode(',',$GLOBALS['meta']['compositions_types']); + } + return $liste; +} + +/** + * Renvoie la composition qui s'applique � un objet + * en tenant compte, le cas �ch�ant, de la composition h�rit�e + * si etoile=true on renvoi dire le champ sql + * + * @param string $type + * @param integer $id + * @param string $serveur + * @param bool $etoile + * @return string + */ +function compositions_determiner($type, $id, $serveur='', $etoile = false){ + static $composition = array(); + + if (isset($composition[$etoile][$serveur][$type][$id])) + return $composition[$etoile][$serveur][$type][$id]; + + include_spip('base/abstract_sql'); + $table = table_objet($type); + $table_sql = table_objet_sql($type); + $_id_table = id_table_objet($type); + + $retour = ''; + + $trouver_table = charger_fonction('trouver_table', 'base'); + $desc = $trouver_table($table,$serveur); + if (isset($desc['field']['composition']) AND $id){ + $select = "composition"; + if (isset($desc['field']['id_rubrique'])) + $select .= "," . (($type == 'rubrique') ? 'id_parent' : 'id_rubrique as id_parent'); + $row = sql_fetsel($select, $table_sql, "$_id_table=".intval($id), '', '', '', '', $serveur); + if ($row['composition'] != '') + $retour = $row['composition']; + elseif (!$etoile + AND isset($row['id_parent']) + AND $row['id_parent']) + $retour = compositions_heriter($type, $row['id_parent'], $serveur); + } + return $composition[$etoile][$serveur][$type][$id] = (($retour == '-') ? '' : $retour); +} + +/** + * Renvoie la composition h�rit�e par un objet selon sa rubrique + * + * @param string $type + * @param integer $id_rubrique + * @param string $serveur + * @return string + */ +function compositions_heriter($type, $id_rubrique, $serveur=''){ + if ($type=='syndic') $type='site'; //grml + if (intval($id_rubrique) < 1) return ''; + static $infos = null; + $id_parent = $id_rubrique; + $compo_rubrique = ''; + do { + $row = sql_fetsel(array('id_parent','composition'),'spip_rubriques','id_rubrique='.intval($id_parent),'','','','',$serveur); + if (strlen($row['composition']) AND $row['composition']!='-') + $compo_rubrique = $row['composition']; + elseif (strlen($row['composition'])==0) // il faut aussi verifier que la rub parente n'herite pas elle-meme d'une composition + $compo_rubrique = compositions_determiner('rubrique', $id_parent, $serveur=''); + + if (strlen($compo_rubrique) AND is_null($infos)) + $infos = compositions_lister_disponibles('rubrique'); + } + while ($id_parent = $row['id_parent'] + AND + (!strlen($compo_rubrique) OR !isset($infos['rubrique'][$compo_rubrique]['branche'][$type]))); + + if (strlen($compo_rubrique) AND isset($infos['rubrique'][$compo_rubrique]['branche'][$type])) + return $infos['rubrique'][$compo_rubrique]['branche'][$type]; + + return ''; +} + +/** + * #COMPOSITION + * Renvoie la composition s'appliquant � un objet + * en tenant compte, le cas �ch�ant, de l'h�ritage. + * + * Sans precision, l'objet et son identifiant sont pris + * dans la boucle en cours, mais l'on peut sp�cifier notre recherche + * en passant objet et id_objet en argument de la balise : + * #COMPOSITION{article, 8} + * + * #COMPOSITION* renvoie toujours le champs brut, sans tenir compte de l'heritage + * + * @param array $p AST au niveau de la balise + * @return array AST->code modifi� pour calculer le nom de la composition + */ +function balise_COMPOSITION_dist($p) { + $_composition = ""; + if ($_objet = interprete_argument_balise(1, $p)) { + $_id_objet = interprete_argument_balise(2, $p); + } else { + $_composition = champ_sql('composition',$p); + $_id_objet = champ_sql($p->boucles[$p->id_boucle]->primary, $p); + $_objet = "objet_type('" . $p->boucles[$p->id_boucle]->id_table . "')"; + } + // si on veut le champ brut, et qu'on l'a sous la main, inutile d'invoquer toute la machinerie + if ($_composition AND $p->etoile) + $p->code = $_composition; + else { + $connect = $p->boucles[$p->id_boucle]->sql_serveur; + $p->code = "compositions_determiner($_objet, $_id_objet, '$connect', ".($p->etoile?'true':'false').")"; + // ne declencher l'usine a gaz que si composition est vide ... + if ($_composition) + $p->code = "((\$zc=$_composition)?(\$zc=='-'?'':\$zc):".$p->code.")"; + } + return $p; +} + +/** + * Indique si la composition d'un objet est verrouill�e ou non, + * auquel cas, seul le webmaster peut la modifier + * + * @param string $type + * @param integer $id + * @param string $serveur + * @return string + */ +function compositions_verrouiller($type, $id, $serveur=''){ + $config = unserialize($GLOBALS['meta']['compositions']); + if ($config['tout_verrouiller'] == 'oui') + return true; + + include_spip('base/abstract_sql'); + $table = table_objet($type); + $table_sql = table_objet_sql($type); + $_id_table = id_table_objet($type); + + $trouver_table = charger_fonction('trouver_table', 'base'); + $desc = $trouver_table($table,$serveur); + if (isset($desc['field']['composition_lock']) AND $id){ + $lock = sql_getfetsel('composition_lock', $table_sql, "$_id_table=".intval($id), '', '', '', '', $serveur); + if ($lock) + return true; + elseif (isset($desc['field']['id_rubrique'])) { + $id_rubrique = sql_getfetsel('id_rubrique', $table_sql, "$_id_table=".intval($id), '', '', '', '', $serveur); + return compositions_verrou_branche($id_rubrique, $serveur); + } + else + return false; + } + else return false; +} + +/** + * Indique si les objets d'une branche sont verrouill�s + * @param integer $id_rubrique + * @param string $serveur + * @return string + */ +function compositions_verrou_branche($id_rubrique, $serveur=''){ + + if (intval($id_rubrique) < 1) return false; + if($infos_rubrique = sql_fetsel(array('id_parent','composition_branche_lock'),'spip_rubriques','id_rubrique='.intval($id_rubrique),'','','','',$serveur)) { + if ($infos_rubrique['composition_branche_lock']) + return true; + else + return compositions_verrou_branche($infos_rubrique['id_parent'],$serveur); + } + return ''; +} +?>