Version 5 — il y a 1 mois — 86.202.xx.xx
- Proposée par Tetue, codée par Marcimat
- Satisfait la demande #3465 de tetue
- Cette page pourra être supprimée si le code rejoint le core
php <cadre class='php '>
/**
* Compile la balise `#LOGO` chargée d'afficher le logo de l’objet
*
* Affiche le logo de l’objet éditorial de la boucle parente.
* Ainsi `#LOGO` dans une boucle ARTICLES est un alias de `#LOGO_ARTICLE`
*
* Différents paramètres existent, assez historiques.
* On introduit ici en plus éventuellement les paramètres objet / id_objet
* dans l'ordre (en 1er et 2nd argument). Le type d’objet, s'il est
* renseigné doit obligatoirement être un texte et non une balise.
*
* @example
*
* #LOGO : à l’intérieur d’une boucle, logo de l’objet ;
* #LOGO : à l’extérieur d’une boucle, logo du site.
* #LOGO* : ajoute un lien sur l’image du logo vers l’objet éditorial
* #LOGO** : retourne le nom du fichier de logo.
* #LOGOright : Valeurs possibles : top left right center bottom
* #LOGOicone : Valeurs possibles : auto icone apercu vignette
* #LOGO200, 0 : Redimensionnement indiqué
* #LOGO#URL : : ajoute un lien sur l’image du logo vers l’url
*
* Idem en spécifiant objet et id_objet
* #LOGOrubrique, 13 : logo de la rubrique 13
* #LOGOrubrique, #ID_SECTEUR
* #LOGOrubrique, 13, icone
* #LOGOrubrique, 13, 200, 0
*
*
* @see balise_LOGO__dist()
*
* @param Champ $p
* Pile au niveau de la balise
* @return Champ
* Pile complétée par le code à générer
*/
function balise_LOGO_dist($p) {
$b = index_boucle($p);
// hors boucle ? Logo du site.
if ($b === '') {
$type = 'site';
$_id_objet = "''";
} else {
$type = objet_type($p->boucles[$b]->id_table);
$_id_objet = champ_sql($p->boucles[$b]->primary, $p);
}
$lien = '';
$fichier = ($p->etoile === '**') ? -1 : ;
$coord = array();
$align = $lien = '';
$mode_logo = '';
// ambiguite si uniquement 2 paramètres
// (objet/id_objet ou autre chose)
// on considère que si le premier argument est un texte et
// le second un numérique ou une balise, alors c'est objet/id_objet
// ou objet / #ID_OBJET
$i = ;
if (
interprete_argument_balise(1, $p)
and interprete_argument_balise(2, $p)
and $p->param[0][1][0]->type === 'texte'
and !is_numeric($p->param[0][1][0]->texte)
and (
$p->param[0][2][0]->type !== 'texte'
or is_numeric($p->param[0][2][0]->texte)
)
) {
$type = objet_type($p->param[0][1][0]->texte);
if ($p->param[0][2][0]->type === 'texte') {
$_id_objet = "\"'" . $p->param[0][2][0]->texte . "'\"";
} else {
$_id_objet = interprete_argument_balise(2, $p);
}
$i = 2;
}
if ($p->param and !$p->param[0][0]) {
$params = $p->param[0];
array_shift($params);
while ($i--) {
array_shift($params);
}
foreach ($params as $a) {
if ($a[0]->type === 'texte') {
$n = $a[0]->texte;
if (is_numeric($n)) {
$coord[] = $n;
} elseif (in_array($n, array('top', 'left', 'right', 'center', 'bottom'))) {
$align = $n;
} elseif (in_array($n, array('auto', 'icone', 'apercu', 'vignette'))) {
$mode_logo = $n;
}
} else {
$lien = calculer_liste($a, $p->descr, $p->boucles, $p->id_boucle);
}
}
}
$coord_x = !$coord ? : intval(array_shift($coord));
$coord_y = !$coord ? : intval(array_shift($coord));
if ($p->etoile === '*') {
include_spip('balise/url_');
$lien = generer_generer_url_arg($type, $p, $_id_objet);
}
$connect = $b ? $p->boucles[$b]->sql_serveur : '';
if ($type == 'document') {
$qconnect = _q($connect);
$doc = "quete_document($_id_objet, $qconnect)";
if ($fichier) {
$code = "quete_logo_file($doc, $qconnect)";
} else {
$code = "quete_logo_document($doc, " . ($lien ? $lien : "''") . ", '$align', '$mode_logo', $coord_x, $coord_y, $qconnect)";
}
// (x=non-faux ? y : '') pour affecter x en retournant y
if ($p->descr['documents']) {
$code = '(($doublons["documents"] .= ",". '
. $_id_objet
. ") ? $code : '')";
}
} elseif ($connect) {
$code = "''";
spip_log('Les logos distants ne sont pas prevus');
} else {
include_spip('balise/logo_');
$code = logo_survol(id_table_objet($type), $_id_objet, $type, $align, $fichier, $lien, $p, '');
}
// demande de reduction sur logo avec ecriture spip 2.1 : #LOGO_xxx{200, 0}
if ($coord_x or $coord_y) {
$code = "filtrer('image_graver',filtrer('image_reduire'," . $code . ", '$coord_x', '$coord_y'))";
}
$p->code = $code;
$p->interdire_scripts = false;
return $p;
}
Pour info voici la version dans SPIP 4
php
function balise_LOGO__dist($p ) {
</ cadre >
Et voici la version finalisée (SPIP 4)
<cadre>
function balise_LOGO__dist($p) {
preg_match(',^LOGO_([A-Z_]+?)(|_NORMAL|_SURVOL|_RUBRIQUE)$,i', $p->nom_champ, $regs);
$type = strtolower($regs[1]);
$suite_logo = $regs[2];
// cas de #LOGO_SITE_SPIP
if ($type == 'site_spip') {
$type = 'site';
$_id_objet = "\"''\"";
}
$id_objet = id_table_objet($type);
if (!isset($_id_objet)) {
$_id_objet = champ_sql($id_objet, $p);
}
$fichier = ($p->etoile === '**') ? -1 : ;
$coord = [];
$align = $lien = '';
$mode_logo = '';
if ($p->param and !$p->param[0][0]) {
$params = $p->param[0];
array_shift($params);
foreach ($params as $a) {
if ($a[0]->type === 'texte') {
$n = $a[0]->texte;
if (is_numeric($n)) {
$coord[] = $n;
} elseif (in_array($n, ['top', 'left', 'right', 'center', 'bottom'])) {
$align = $n;
} elseif (in_array($n, ['auto', 'icone', 'apercu', 'vignette'])) {
$mode_logo = $n;
}
} else {
$lien = calculer_liste($a, $p->descr, $p->boucles, $p->id_boucle);
}
}
}
$coord_x = !$coord ? : intval(array_shift($coord));
$coord_y = !$coord ? : intval(array_shift($coord));
if ($p->etoile === '*') {
include_spip('balise/url_');
$lien = generer_generer_url_arg($type, $p, $_id_objet);
}
$connect = $p->id_boucle ? $p->boucles[$p->id_boucle]->sql_serveur : '';
if ($type == 'document') {
$qconnect = _q($connect);
$doc = "quete_document($_id_objet, $qconnect)";
if ($fichier) {
$code = "quete_logo_file($doc, $qconnect)";
} else {
$code = "quete_logo_document($doc, " . ($lien ? $lien : "''") . ", '$align', '$mode_logo', $coord_x, $coord_y, $qconnect)";
}
// (x=non-faux ? y : '') pour affecter x en retournant y
if ($p->descr['documents']) {
$code = '(($doublons["documents"] .= ",". '
. $_id_objet
. ") ? $code : '')";
}
} elseif ($connect) {
$code = "''";
spip_log('Les logos distants ne sont pas prevus');
} else {
$code = logo_survol($id_objet, $_id_objet, $type, $align, $fichier, $lien, $p, $suite_logo);
}
// demande de reduction sur logo avec ecriture spip 2.1 : #LOGO_xxx{200, 0}
if ($coord_x or $coord_y) {
$code = "filtrer('image_graver',filtrer('image_reduire'," . $code . ", '$coord_x', '$coord_y'))";
}
$p->code = $code;
$p->interdire_scripts = false;
return $p;
}