Skip to content

Commit

Permalink
first release
Browse files Browse the repository at this point in the history
  • Loading branch information
julienmru committed Feb 9, 2018
1 parent 7f42905 commit 494d9d0
Show file tree
Hide file tree
Showing 8 changed files with 389 additions and 0 deletions.
16 changes: 16 additions & 0 deletions README.md
@@ -0,0 +1,16 @@
# spip-logos-multiples

Ce plugin pour SPIP permet d’avoir plus de deux logos par objet éditorial. Mon cas d’usage est de permettre de mettre un logo desktop, un logo tablette et un logo mobile pour les sites adaptatifs.

Dans la configuration du plugin, vous indiquez le nom du logo ainsi que le label correspondant, par ex :

```
tablet|Logo pour tablette
mobile|Logo pour mobile
```

Ensuite, dans vos squelettes, vous pourrez utiliser `#LOGO_ARTICLE_TABLET` et `#LOGO_ARTICLE_MOBILE`.

## Crédits

La gestion des balises `#LOGO_` a été reprise du core de SPIP avec une légère adaptation.
202 changes: 202 additions & 0 deletions balise/logo_.php
@@ -0,0 +1,202 @@
<?php

/*
* Plugin Logos Multiples
* (c) 2018 Julien Tessier
* Parties de code issues de SPIP, Copyright (c) 2001-2017 Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James
* Distribué sous licence GPL
*
*/

/**
* Fonctions génériques pour les balises `#LOGO_XXXX`
*
* @package SPIP\Core\Compilateur\Balises
**/

if (!defined('_ECRIRE_INC_VERSION')) {
return;
}


/**
* Compile la balise dynamique `#LOGO_xx` qui retourne le code HTML
* pour afficher l'image de logo d'un objet éditorial de SPIP.
*
* Le type d'objet est récupéré dans le nom de la balise, tel que
* `LOGO_ARTICLE` ou `LOGO_SITE`.
*
* Ces balises ont quelques options :
*
* - La balise peut aussi demander explicitement le logo normal ou de survol,
* avec `LOGO_ARTICLE_NORMAL` ou `LOGO_ARTICLE_SURVOL`.
* - On peut demander un logo de rubrique en absence de logo sur l'objet éditorial
* demandé avec `LOGO_ARTICLE_RUBRIQUE`
* - `LOGO_ARTICLE*` ajoute un lien sur l'image du logo vers l'objet éditorial
* - `LOGO_ARTICLE**` retourne le nom du fichier de logo.
* - `LOGO_ARTICLE{right}`. Valeurs possibles : top left right center bottom
* - `LOGO_DOCUMENT{icone}`. Valeurs possibles : auto icone apercu vignette
* - `LOGO_ARTICLE{200, 0}`. Redimensionnement indiqué
*
* @balise
* @uses logo_survol()
* @example
* ```
* #LOGO_ARTICLE
* ```
*
* @param Champ $p
* Pile au niveau de la balise
* @return Champ
* Pile complétée par le code à générer
*/
function balise_LOGO_($p) {

$preg = ',^LOGO_([A-Z_]+?)(|_NORMAL|_SURVOL|_RUBRIQUE';
foreach(_logos_multiples_types() as $type => $label) {
$preg .= '|_'.strtoupper($type);
}
$preg .= ')$,i';
preg_match($preg, $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 = "\"'0'\"";
}

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

$fichier = ($p->etoile === '**') ? -1 : 0;
$coord = array();
$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, 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 = $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;
}

/**
* Calcule le code HTML pour l'image d'un logo
*
* @param string $id_objet
* Nom de la clé primaire de l'objet (id_article, ...)
* @param string $_id_objet
* Code pour la compilation permettant de récupérer la valeur de l'identifiant
* @param string $type
* Type d'objet
* @param string $align
* Alignement demandé du logo
* @param int $fichier
* - -1 pour retourner juste le chemin de l'image
* - 0 pour retourner le code HTML de l'image
* @param string $lien
* Lien pour encadrer l'image avec si présent
* @param Champ $p
* Pile au niveau de la balise
* @param string $suite
* Suite éventuelle de la balise logo, telle que `_SURVOL`, `_NORMAL` ou `_RUBRIQUE`.
* @return string
* Code compilé retournant le chemin du logo ou le code HTML du logo.
**/
function logo_survol($id_objet, $_id_objet, $type, $align, $fichier, $lien, $p, $suite) {
$suite_lc = strtolower(ltrim($suite, '_'));
$code = "quete_logo('$id_objet', '" .
(($suite == '_SURVOL') ? 'off' :
(($suite == '_NORMAL') ? 'on' : (in_array($suite_lc, array_keys(_logos_multiples_types())) ? $suite_lc : 'ON'))) .
"', $_id_objet," .
(($suite == '_RUBRIQUE') ?
champ_sql('id_rubrique', $p) :
(($type == 'rubrique') ? "quete_parent($_id_objet)" : "''")) .
', ' . intval($fichier) . ')';

if ($fichier) {
return $code;
}

// class spip_logos a supprimer ulterieurement (transition douce vers spip_logo)
// cf http://core.spip.net/issues/2483
$class = 'spip_logo ';
if ($align) {
$class .= "spip_logo_$align ";
}
$class .= 'spip_logos';
$style = '';
if (in_array($align, array('left', 'right'))) {
$style = "float:$align";
$align = '';
}
$code = "\n((!is_array(\$l = $code)) ? '':\n (" .
'"<img class=\"' . $class . '\" alt=\"\"' .
($style ? " style=\\\"$style\\\"" : '') .
($align ? " align=\\\"$align\\\"" : '') .
' src=\"$l[0]\"" . $l[2] . ($l[1] ? " onmouseover=\"this.src=\'$l[1]\'\" onmouseout=\"this.src=\'$l[0]\'\"" : "") . \' />\'))';

if (!$lien) {
return $code;
}

return ('(strlen($logo=' . $code . ')?\'<a href="\' .' . $lien . ' . \'">\' . $logo . \'</a>\':\'\')');

}
19 changes: 19 additions & 0 deletions formulaires/configurer_logos_multiples.html
@@ -0,0 +1,19 @@
<div class="formulaire_spip formulaire_configurer_logos_multiples">

[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]


<form action='#ENV{action}' method='post'>
#ACTION_FORMULAIRE{#ENV{action}}
<ul>
[(#SAISIE{textarea, types, label=<:saisies:option_datas_label:>, obligatoire=oui, explication=<:saisies:option_datas_explication:>})]
</ul>

<input type="hidden" name="_meta_casier" value="logos_multiples/config" />

<p class="boutons"><input type="submit" class="submit" value="<:valider:>" /></p>

</form>

</div>
24 changes: 24 additions & 0 deletions formulaires/configurer_logos_multiples.php
@@ -0,0 +1,24 @@
<?php
/*
* Plugin Logos Multiples
* (c) 2018 Julien Tessier
* Distribué sous licence GPL
*
*/


function formulaires_configurer_logos_multiples_verifier_dist(){
$erreurs = array();
// check that mandatory fields are indeed filled out:
$types = explode("\r\n", _request('types'));
$erreur = '';
foreach($types as $type) {
list($cle, $valeur) = explode('|', $type);
if (!preg_match('/^[a-z0-0_]+$/', $cle)) {
$erreur .= "Clé $cle invalide\r\n";
}
}
if ($erreur) $erreurs['types'] = nl2br(trim($erreur));

return $erreurs;
}
22 changes: 22 additions & 0 deletions logos_multiples_options.php
@@ -0,0 +1,22 @@
<?php
/*
* Plugin Logos Multiples
* (c) 2018 Julien Tessier
* Distribué sous licence GPL
*
*/

function _logos_multiples_types() {
$types = array();
include_spip('inc/config');
if ($config = lire_config('logos_multiples/config/types')) {
$fond = '';
$config = explode("\r\n", $config);
foreach($config as $line) {
list($type, $label) = explode('|', $line);
$type = strtolower(preg_replace('/[^a-z0-0_]/', '', $type));
$types[$type] = $label;
}
}
return $types;
}
82 changes: 82 additions & 0 deletions logos_multiples_pipelines.php
@@ -0,0 +1,82 @@
<?php

/*
* Plugin Logos Multiples
* (c) 2018 Julien Tessier
* Distribué sous licence GPL
*
*/

function logos_multiples_recuperer_fond($flux) {
if ($flux['args']['fond'] == 'formulaires/editer_logo') {
$objet = $flux['args']['contexte']['objet'];
$id_objet = $flux['args']['contexte']['id_objet'];
$editable = $flux['args']['contexte']['_options']['editable'];

if ($editable) {
$extra = '';
$valider = FASLE;
$chercher_logo = charger_fonction('chercher_logo', 'inc');
foreach(_logos_multiples_types() as $type => $label) {
$objet = objet_type($objet);
$primary = id_table_objet($objet);
$erreur = ''; // @todo '<span class=\'erreur_message\'></span>'
if ($logo = $chercher_logo($id_objet, $primary, $type)) {
$extra .= '<div><h4 class="titre_logos_multiples">'.$label.'</h4></div>'.recuperer_fond('formulaires/inc-apercu-logo', array(
'objet' => $objet,
'id_objet' => $id_objet,
'logo' => $logo[0],
'quoi' => 'logo_'.$type,
'editable' => $editable,
));
} else {
$valider = TRUE;
$extra .= '<div class="ajouter_'.$type.'"><h4 class="titre_logos_multiples">'.$label.'</h4></div>
<div>
<label for="logo_'.$cle.'">'._T('info_telecharger_nouveau_logo').'</label>
'.$erreur.'
<input type=\'file\' class=\'file\' name=\'logo_'.$type.'\' size="12" id=\'logo_'.$type.'_'.$objet.'_'.$id_objet.'\' value="" />
</div>';
}

}
// si on a pas de bouton, le rajouter (par défaut SPIP masque le bouton si on a le logo normal et survol)
if ($valider) {
if (strpos($flux['data']['texte'], '<p class="boutons"') === FALSE) $extra .= "<p class=\"boutons\"><input type='submit' class='submit' value='"._T('bouton_upload')."' /></p>";
$flux['data']['texte'] = str_replace('class="boutons" style=\'display:none;\'', 'class="boutons"', $flux['data']['texte']);
}
$flux['data']['texte'] = str_replace('<!--extra-->', $extra.'<!--extra-->', $flux['data']['texte']);
}
}
return $flux;
}

function logos_multiples_formulaire_traiter($flux) {
if ($flux['args']['form'] == 'editer_logo') {
$objet = $flux['args']['args'][0];
$id_objet = $flux['args']['args'][1];
$res = $flux['data'];
include_spip('action/editer_logo');

if (!$_FILES) {
$_FILES = isset($GLOBALS['HTTP_POST_FILES']) ? $GLOBALS['HTTP_POST_FILES'] : array();
}
foreach (_logos_multiples_types() as $type => $label) {
if (_request('supprimer_logo_'.$type)) {
logo_supprimer($objet, $id_objet, $type);
$res['message_ok'] = ''; // pas besoin de message : la validation est visuelle
set_request('logo_up', ' ');
} else if (isset($_FILES['logo_'.$type]) && $_FILES['logo_'.$type]['error'] == 0) {
if ($err = logo_modifier($objet, $id_objet, $type, $_FILES['logo_'.$type])) {
$res['message_erreur'] = $err;
} else {
$res['message_ok'] = '';
} // pas besoin de message : la validation est visuelle
set_request('logo_up', ' ');
}
}

$flux['data'] = $res;

}
}
19 changes: 19 additions & 0 deletions paquet.xml
@@ -0,0 +1,19 @@
<paquet
prefix="logos_multiples"
categorie="edition"
version="0.0.1"
etat="dev"
compatibilite="[3.2.0;3.2.*]"
>
<nom>Logos multiples</nom>

<auteur lien="https://www.cahri.com">Julien Tessier, Agence Cahri</auteur>

<licence>GNU/GPL</licence>

<necessite nom="saisies" compatibilite="[2.21.4;]" />

<pipeline nom="recuperer_fond" inclure="logos_multiples_pipelines.php" />
<pipeline nom="formulaire_traiter" inclure="logos_multiples_pipelines.php" />

</paquet>

0 comments on commit 494d9d0

Please sign in to comment.