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 ''; } ?>