Carnet Wiki

Nouvelle balise #LOGO

Version 6 — il y a 1 mois — 82.64.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 ```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.
 *    #LOGO{right} :    Valeurs possibles : top left right center bottom
 *    #LOGO{icone} :    Valeurs possibles : auto icone apercu vignette
 *    #LOGO{200, 0} :    Redimensionnement indiqué
 *    #LOGO{#URL} : : ajoute un lien sur l'image du logo vers l'url
 *
 *    Idem en spécifiant objet et id_objet
 *    #LOGO{rubrique, 13} : logo de la rubrique 13
 *    #LOGO{rubrique, #ID_SECTEUR}
 *    #LOGO{rubrique, 13, icone}
 *    #LOGO{rubrique, 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 = "'0'";
    } else {
        $type = objet_type($p->boucles[$b]->id_table);
        $_id_objet = champ_sql($p->boucles[$b]->primary, $p);
    }
 
    $lien = '';
    $fichier = ($p->etoile === '**') ? -1 : 0;
    $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 = 0;
    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 ? 0 : intval(array_shift($coord));
    $coord_y = !$coord ? 0 : 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) {


$b  =   index_boucle($p ); return  $ p ;
 } 
```


// hors boucle ? Logo du site.
	if ($b === '') {
		$type = 'site';
		$_id_objet = "'0'";
	} else {
		$type = objet_type($p->boucles[$b]->id_table);
		$_id_objet = champ_sql($p->boucles[$b]->primary, $p);
	}


preg_match(',^LOGO_([A-Z_]+?);
	 $suite_logo = '';  #   FIXME :  Permettre  d’indiquer  cette  option  de  logo  ?    $ regs[2] (_NORMAL )(|_NORMAL|_SURVOL|_RUBRIQUE)$,i ',  $p->nom_champ , _SURVOL ,  _RUBRIQUE ) $regs );
	 $type  =   strtolower($regs[1] ;


// cas de #LOGO_SITE_SPIP
	if ($type == 'site_spip') {
		$type = 'site';
		$_id_objet = "\"'0'\"";
	}


$fichier = ($p->etoile === '**') ? -1 : ;
	$coord = [];
	$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 = 0;
	if (
		interprete_argument_balise(1, $p)
		&& interprete_argument_balise(2, $p)
		&& $p->param[0][1][0]->type === 'texte'
		&& !is_numeric($p->param[0][1][0]->texte)
		&& (
			$p->param[0][2][0]->type !== 'texte'
			|| 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;
	}


$id_objet = id_table_objet($type);if  (! isset($_id_objet)) {
		$_id_objet = champ_sql($id_objet, $p);
	}


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, ['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 = $b p->id_boucle  ? $p->boucles[$b] $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 ?  :  "''")  . ", '$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
				. ")  ?  $lien  :  "''")  .   $code : '')";
		}
	} elseif ($connect) {
		$code = "''";
		spip_log('Les logos distants ne sont pas prevus');
	} else {
		//  pour  generer_code_logo
		 include_spip('balise/id_logo _');
		 $champ_logo $code  = ''; 
		if  ($ fichier )  {
			 $champ_logo  =  ' fichier ';
		 } 
		$ code  =   generer_code_logo($id_objet logo_survol($id_objet , $_id_objet, $type, $align,  $fichier , $lien, $p, $suite_logo,  $champ_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;
}
 

Pour info, la balise #LOGO_ de SPIP 4.2 :  https://git.spip.net/spip/spip/blob/4.2/ecrire/balise/logo_.php#L56