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