Browse Source

passage en trunk

svn/attic/branches/v3/111501
brunobergot@gmail.com 5 years ago
commit
76977eb2cb
  1. 129
      .gitattributes
  2. 34
      action/crayons.php
  3. 486
      action/crayons_html.php
  4. 580
      action/crayons_store.php
  5. 62
      action/crayons_upload.php
  6. 11
      controleurs/article_intro.html
  7. 17
      controleurs/article_intro2.html
  8. 38
      controleurs/article_intro3.php
  9. 54
      controleurs/article_introduction.html
  10. 26
      controleurs/article_introduction.php
  11. 17
      controleurs/article_texte.html
  12. 11
      controleurs/auteur_email.html
  13. 11
      controleurs/auteur_nom.html
  14. 24
      controleurs/auteur_qui.html
  15. 9
      controleurs/breve_hyperlien.html
  16. 46
      controleurs/document_fichier.html
  17. 38
      controleurs/extra.html
  18. 8
      controleurs/extra_fonctions.php
  19. 11
      controleurs/forum_email.html
  20. 33
      controleurs/forum_id_article.html
  21. 11
      controleurs/forum_nom.html
  22. 15
      controleurs/forum_qui.html
  23. 104
      controleurs/hyperlien.html
  24. 31
      controleurs/id_parent.html
  25. 49
      controleurs/logo.html
  26. 20
      controleurs/mots_article_brut.html
  27. 26
      controleurs/portfolio.php
  28. 41
      controleurs/rubrique_introduction.html
  29. 29
      controleurs/rubrique_introduction.php
  30. 11
      controleurs/signature_email.html
  31. 10
      controleurs/signature_nom.html
  32. 16
      controleurs/signature_qui.html
  33. 26
      controleurs/statut.html
  34. 17
      controleurs/syndic_article_hyperlien.html
  35. 47
      controleurs/vignette.html
  36. 40
      crayons.css
  37. 33
      crayons.js.html
  38. 48
      crayons.js_fonctions.php
  39. 482
      crayons_fonctions.php
  40. 11
      fonds/cfg_crayons.html
  41. 118
      formulaires/configurer_crayons.html
  42. BIN
      images/annuler-16.png
  43. BIN
      images/changed.png
  44. BIN
      images/crayon-128.png
  45. BIN
      images/crayon-24.png
  46. BIN
      images/crayon-32.png
  47. BIN
      images/crayon.png
  48. BIN
      images/crayon20.png
  49. BIN
      images/edit.png
  50. BIN
      images/ok-16.png
  51. BIN
      images/pencil.png
  52. BIN
      images/resizer.png
  53. BIN
      images/searching.gif
  54. 103
      inc/compat_crayons.php
  55. 93
      inc/crayons-json.php
  56. 717
      inc/crayons.php
  57. 103
      js/crayons-fade.js
  58. 586
      js/crayons.js
  59. 1515
      js/jquery.form.js
  60. 157
      js/jquery.html5uploader.js
  61. 11008
      js/jquery.js
  62. 32
      js/resizehandle.js
  63. 70
      js/uploader.js.html
  64. 84
      lang/crayons.xml
  65. 41
      lang/crayons_ar.php
  66. 79
      lang/crayons_ast.php
  67. 41
      lang/crayons_br.php
  68. 76
      lang/crayons_ca.php
  69. 91
      lang/crayons_de.php
  70. 91
      lang/crayons_en.php
  71. 41
      lang/crayons_eo.php
  72. 92
      lang/crayons_es.php
  73. 37
      lang/crayons_eu.php
  74. 82
      lang/crayons_fa.php
  75. 90
      lang/crayons_fr.php
  76. 92
      lang/crayons_fr_tu.php
  77. 44
      lang/crayons_gl.php
  78. 79
      lang/crayons_it.php
  79. 41
      lang/crayons_it_fem.php
  80. 24
      lang/crayons_km.php
  81. 41
      lang/crayons_lb.php
  82. 91
      lang/crayons_nl.php
  83. 41
      lang/crayons_oc_lnc.php
  84. 92
      lang/crayons_oc_ni_mis.php
  85. 90
      lang/crayons_pt_br.php
  86. 41
      lang/crayons_ro.php
  87. 86
      lang/crayons_ru.php
  88. 91
      lang/crayons_sk.php
  89. 41
      lang/crayons_sv.php
  90. 41
      lang/crayons_tr.php
  91. 41
      lang/crayons_tw.php
  92. 65
      lang/crayons_zh.php
  93. 41
      lang/crayons_zh_tw.php
  94. 34
      lang/paquet-crayons.xml
  95. 19
      lang/paquet-crayons_ar.php
  96. 16
      lang/paquet-crayons_de.php
  97. 16
      lang/paquet-crayons_en.php
  98. 16
      lang/paquet-crayons_es.php
  99. 14
      lang/paquet-crayons_fr.php
  100. 16
      lang/paquet-crayons_fr_tu.php
  101. Some files were not shown because too many files have changed in this diff Show More

129
.gitattributes vendored

@ -0,0 +1,129 @@
* text=auto !eol
action/crayons.php -text
action/crayons_html.php -text
action/crayons_store.php -text
action/crayons_upload.php -text
controleurs/article_intro.html -text
controleurs/article_intro2.html -text
controleurs/article_intro3.php -text
controleurs/article_introduction.html -text
controleurs/article_introduction.php -text
controleurs/article_texte.html -text
controleurs/auteur_email.html -text
controleurs/auteur_nom.html -text
controleurs/auteur_qui.html -text
controleurs/breve_hyperlien.html -text
controleurs/document_fichier.html -text
controleurs/extra.html -text
controleurs/extra_fonctions.php -text
controleurs/forum_email.html -text
controleurs/forum_id_article.html -text
controleurs/forum_nom.html -text
controleurs/forum_qui.html -text
controleurs/hyperlien.html -text
controleurs/id_parent.html -text
controleurs/logo.html -text
controleurs/mots_article_brut.html -text
controleurs/portfolio.php -text
controleurs/rubrique_introduction.html -text
controleurs/rubrique_introduction.php -text
controleurs/signature_email.html -text
controleurs/signature_nom.html -text
controleurs/signature_qui.html -text
controleurs/statut.html -text
controleurs/syndic_article_hyperlien.html -text
controleurs/vignette.html -text
/crayons.css -text
/crayons.js.html -text
/crayons.js_fonctions.php -text
/crayons_fonctions.php -text
fonds/cfg_crayons.html -text
formulaires/configurer_crayons.html -text
images/annuler-16.png -text
images/changed.png -text
images/crayon-128.png -text
images/crayon-24.png -text
images/crayon-32.png -text
images/crayon.png -text
images/crayon20.png -text
images/edit.png -text
images/ok-16.png -text
images/pencil.png -text
images/resizer.png -text
images/searching.gif -text
inc/compat_crayons.php -text
inc/crayons-json.php -text
inc/crayons.php -text
js/crayons-fade.js -text
js/crayons.js -text
js/jquery.form.js -text
js/jquery.html5uploader.js -text
js/jquery.js -text
js/resizehandle.js -text
js/uploader.js.html -text
lang/crayons.xml -text
lang/crayons_ar.php -text
lang/crayons_ast.php -text
lang/crayons_br.php -text
lang/crayons_ca.php -text
lang/crayons_de.php -text
lang/crayons_en.php -text
lang/crayons_eo.php -text
lang/crayons_es.php -text
lang/crayons_eu.php -text
lang/crayons_fa.php -text
lang/crayons_fr.php -text
lang/crayons_fr_tu.php -text
lang/crayons_gl.php -text
lang/crayons_it.php -text
lang/crayons_it_fem.php -text
lang/crayons_km.php -text
lang/crayons_lb.php -text
lang/crayons_nl.php -text
lang/crayons_oc_lnc.php -text
lang/crayons_oc_ni_mis.php -text
lang/crayons_pt_br.php -text
lang/crayons_ro.php -text
lang/crayons_ru.php -text
lang/crayons_sk.php -text
lang/crayons_sv.php -text
lang/crayons_tr.php -text
lang/crayons_tw.php -text
lang/crayons_zh.php -text
lang/crayons_zh_tw.php -text
lang/paquet-crayons.xml -text
lang/paquet-crayons_ar.php -text
lang/paquet-crayons_de.php -text
lang/paquet-crayons_en.php -text
lang/paquet-crayons_es.php -text
lang/paquet-crayons_fr.php -text
lang/paquet-crayons_fr_tu.php -text
lang/paquet-crayons_it.php -text
lang/paquet-crayons_nl.php -text
lang/paquet-crayons_oc_ni_mis.php -text
lang/paquet-crayons_pt_br.php -text
lang/paquet-crayons_ru.php -text
lang/paquet-crayons_sk.php -text
lib/JavaScriptPacker/class.JavaScriptPacker.php -text
modeles/uploader_item.html -text
modeles/uploader_liste.html -text
/paquet.xml -text
/plugin.xml -text
prive/squelettes/contenu/configurer_crayons.html -text
/tetecrayons.php -text
vues/article_intro.html -text
vues/article_intro2.html -text
vues/article_intro3.html -text
vues/article_introduction.html -text
vues/article_texte.html -text
vues/document_fichier.html -text
vues/extra.html -text
vues/extra_fonctions.php -text
vues/hyperlien.html -text
vues/id_parent.html -text
vues/logo.html -text
vues/mots_article_brut.html -text
vues/qui.html -text
vues/rubrique_id_parent.html -text
vues/rubrique_introduction.html -text
vues/vignette.html -text

34
action/crayons.php

@ -0,0 +1,34 @@
<?php
/**
* Crayons
* plugin for spip
* (c) Fil, toggg 2006-2013
* licence GPL
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// On a ete appele par un formulaire normal (ajax est traite par crayons_store)
function action_crayons_dist() {
include_spip('action/crayons_store');
$r = crayons_store();
// soit exit, soit un redirect gere par SPIP
if (trim($r['$erreur'])) {
include_spip('inc/minipres');
echo minipres($r['$erreur']);
exit;
}
// S'il n'y a pas de redirect, on est mal : eviter toutefois la page blanche
if (!_request('redirect')) {
die('OK');
}
// Invalider le cache parce que bon... a priori on est dans une
// interface qui va avoir besoin de refresh
include_spip('inc/invalideur');
suivre_invalideur('1');
}

486
action/crayons_html.php

@ -0,0 +1,486 @@
<?php
/**
* Crayons
* plugin for spip
* (c) Fil, toggg 2006-2013
* licence GPL
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Affiche le controleur (formulaire) d'un crayon
* suivant la classe CSS décrivant le champ à éditer (produit par `#EDIT`)
*
* @param string $class
* Class CSS décrivant le champ
* @param null $c
*
* @return array
* Tableau avec 2 entrées possibles :
* - '$erreur' : texte d'erreur éventuel
* - '$html' : code HTML du controleur
**/
function affiche_controleur($class, $c = null) {
$return = array('$erreur'=>'');
if (preg_match(_PREG_CRAYON, $class, $regs)) {
list(,$nomcrayon,$type,$champ,$id) = $regs;
$regs[] = $class;
// A-t-on le droit de crayonner ?
spip_log("autoriser('crayonner', $type, $id, NULL, array('modele'=>$champ)", 'crayons_distant');
if (!autoriser('crayonner', $type, $id, null, array('modele'=>$champ))) {
$return['$erreur'] = "$type $id: " . _U('crayons:non_autorise');
} else {
// Trouver la fonction de controleur PHP à utiliser
$f = charger_fonction($type.'_'.$champ, 'controleurs', true)
or $f = charger_fonction($champ, 'controleurs', true)
or $f = charger_fonction($type, 'controleurs', true)
or $f = 'controleur_dist';
$f = pipeline('crayons_controleur', array(
'args' => array(
'nomcrayon' => $nomcrayon,
'type' => $type,
'champ' => $champ,
'id' => $id,
'class' => $class,
),
'data' => $f,
));
list($html,$status) = $f($regs, $c);
if ($status) {
$return['$erreur'] = $html;
} else {
$return['$html'] = $html;
}
}
} else {
$return['$erreur'] = _U('crayons:donnees_mal_formatees');
}
return $return;
}
/**
* Contrôleur par défaut.
*
* Il recherche la présence d'un contrôleur au format html pour éditer le champ ou type de crayon demandé.
*
* S'il n'en trouve pas crée un contrôleur en se basant sur le type de champ dans la base de données,
* mais se limite à afficher soit un 'textarea' (contrôleur texte), soit un 'input' (contrôleur ligne).
*
* @param array $regs
* @param null $c
* @return array Liste : HTML, erreur
*/
function controleur_dist($regs, $c = null) {
list( , $nomcrayon, $type, $champ, $id, $class) = $regs;
$options = array(
'class' => $class
);
list($distant,$table) = distant_table($type);
// Si le controleur est un squelette html, on va chercher
// les champs qu'il lui faut dans la table demandee
// Attention, un controleur multi-tables ne fonctionnera
// que si les champs ont le meme nom dans toutes les tables
// (par exemple: hyperlien est ok, mais pas nom)
if (($fichier = find_in_path(($controleur = 'controleurs/' . $type . '_' . $champ) . '.html'))
|| ($fichier = find_in_path(($controleur = 'controleurs/' . $champ) .'.html'))) {
if (!lire_fichier($fichier, $controldata)) {
die('erreur lecture controleur');
}
if (preg_match_all('/\bname=(["\'])#ENV\{name_(\w+)\}\1/', $controldata, $matches, PREG_PATTERN_ORDER)) {
$champ = $matches[2];
}
} else {
$controleur = '';
}
$valeur = valeur_colonne_table($type, $champ, $id);
#spip_log("$valeur = valeur_colonne_table($type, $champ, $id);");
#spip_log($champ);
if ($valeur === false) {
return array("$type $id $champ: " . _U('crayons:pas_de_valeur'), 6);
}
/* if (is_scalar($valeur)) {
$valeur = array($champ => $valeur);
}*/
// type du crayon (a revoir quand le core aura type ses donnees)
$inputAttrs = array();
if ($controleur) {
$options['hauteurMini'] = 80; // base de hauteur mini
$option['inmode'] = 'controleur';
$options['controleur'] = $controleur;
} elseif (preg_match(",[\n\r],", $valeur[$champ])
or (($champ == 'valeur') && ($id == 'descriptif_site'))
or
// on regarde le type tel que defini dans serial
// (attention il y avait des blob dans les vieux spip)
($sqltype = colonne_table($type, $champ)) &&
(in_array($sqltype['type'], array('mediumtext', 'longblob', 'longtext')) ||
(($sqltype['type'] == 'text' || $sqltype['type'] == 'blob')
and in_array($champ, array('descriptif', 'bio'))))) {
// si la valeur fait plusieurs lignes on doit mettre un textarea
// derogation specifique pour descriptif_site de spip_metas
$options['hauteurMini'] = 80; // hauteur mini d'un textarea
$option['inmode'] = 'texte';
} else { // ligne, hauteur naturelle
$options['hauteurMaxi'] = 0;
$option['inmode'] = 'ligne';
// c'est un nombre entier
if ($sqltype['long']) {
// si long est [4,3] sa longueur maxi est 8 (1234,123)
if (is_array($sqltype['long'])) {
if (count($sqltype['long']) == 2) {
$inputAttrs['maxlength'] = $sqltype['long'][0] + 1 + $sqltype['long'][1];
} else {
// on ne sait pas ce que c'est !
$inputAttrs['maxlength'] = $sqltype['long'][0];
}
} else {
$inputAttrs['maxlength'] = $sqltype['long'];
}
}
}
$crayon = new Crayon($nomcrayon, $valeur, $options, $c);
$inputAttrs['style'] = implode('', $crayon->styles);
if (!$controleur) {
$inputAttrs['style'] .= 'width:' . $crayon->largeur . 'px;' .
($crayon->hauteur ? ' height:' . $crayon->hauteur . 'px;' : '');
}
$html = $controleur ? $crayon->formulaire(null, $inputAttrs) :
$crayon->formulaire($option['inmode'], $inputAttrs);
$status = null;
return array($html,$status);
}
// Definition des crayons
class Crayon {
// le nom du crayon "type-modele-id" comme "article-introduction-237"
var $name;
// type, a priori une table, extrait du nom plus eventuellement base distante
var $type;
// table la table a crayonner
var $table;
// distant base distante
var $distant;
// modele, un champ comme "texte" ou un modele, extrait du nom
var $modele;
// l'identificateur dans le type, comme un numero d'article
var $id;
// la ou les valeurs des champs du crayon, tableau associatif champ => valeur
var $texts = array();
// une cle unique pour chaque crayon demande
var $key;
// un md5 associe aux valeurs pour verifier et detecter si elles changent
var $md5;
// classe css
var $class;
// dimensions indicatives
var $largeurMini = 170;
var $largeurMaxi = 700;
var $hauteurMini = 80;
var $hauteurMaxi = 700;
var $largeur;
// le mode d'entree: texte, ligne ou controleur
var $inmode = '';
// eventuellement le fond modele pour le controleur
var $controleur = '';
var $styles = array();
// le constructeur du crayon
// $name : son nom
// $texts : tableau associatif des valeurs ou valeur unique si crayon monochamp
// $options : options directes du crayon (developpement)
function __construct($name, $texts = array(), $options = array(), $c = null) {
$this->name = $name;
list($this->type, $this->modele, $this->id) = array_pad(explode('-', $this->name, 3), 3, '');
list($this->distant,$this->table) = distant_table($this->type);
if (is_scalar($texts) || is_null($texts)) {
$texts = array($this->modele => $texts);
}
$this->texts = $texts;
$this->key = strtr(uniqid('wid', true), '.', '_');
$this->md5 = $this->md5();
foreach ($options as $opt => $val) {
$this->$opt = $val;
}
$this->dimension($c);
$this->css();
}
// calcul du md5 associe aux valeurs
function md5() {
#spip_log($this->texts, 'crayons');
return md5(serialize($this->texts));
}
// dimensions indicatives
function dimension($c) {
// largeur du crayon
$this->largeur = min(max(intval(_request('w', $c)), $this->largeurMini), $this->largeurMaxi);
// hauteur maxi d'un textarea selon wh: window height
$maxheight = min(max(intval(_request('wh', $c)) - 50, 400), $this->hauteurMaxi);
$this->hauteur = min(max(intval(_request('h', $c)), $this->hauteurMini), $maxheight);
$this->left = _request('left');
$this->top = _request('top');
$this->w = _request('w');
$this->h = _request('h');
$this->ww = _request('ww');
$this->wh = _request('wh');
}
// recuperer les elements de style
function css() {
foreach (array('color', 'font-size', 'font-family', 'font-weight', 'line-height', 'min-height', 'text-align') as $property) {
if (null !== ($p = _request($property))) {
$this->styles[] = "$property:$p;";
}
}
$property = 'background-color';
if (!$p = _request($property)
or $p == 'transparent') {
$p = 'white';
}
$this->styles[] = "$property:$p;";
}
// formulaire standard
function formulaire($contexte = array(), $inputAttrs = array()) {
return
$this->code() .
$this->input($contexte, $inputAttrs);
}
// balises input type hidden d'identification du crayon
function code() {
return
'<input type="hidden" class="crayon-id" name="crayons[]"'
.' value="' . $this->key .'" />'."\n"
. '<input type="hidden" name="name_'.$this->key
.'" value="' . $this->name .'" />'."\n"
. '<input type="hidden" name="class_' . $this->key
. '" value="' . $this->class . '" />' . "\n"
. '<input type="hidden" name="md5_'.$this->key
.'" value="' . $this->md5 . '" />'."\n"
. '<input type="hidden" name="fields_'.$this->key
.'" value="'.join(',', array_keys($this->texts)).'" />'
."\n"
;
}
/**
* Fabriquer les balises des champs d'apres un modele controleurs/(type_)modele.html
*
* @param array $contexte
* tableau (nom=>valeur) qui sera enrichi puis passe à recuperer_fond
* @return string
* le contenu de recuperer_fond du controleur
*/
function fond($contexte = array()) {
include_spip('inc/filtres');
$contexte['id_' . $this->type] = $this->id;
$contexte['id_' . $this->table] = $this->id;
$contexte['crayon_type'] = $this->type;
$contexte['crayon_modele'] = $this->modele;
$contexte['lang'] = $GLOBALS['spip_lang'];
$contexte['key'] = $this->key;
$contexte['largeur'] = $this->largeur;
$contexte['hauteur'] = $this->hauteur;
$contexte['self'] = _request('self');
foreach ($this->texts as $champ => $val) {
$contexte['name_' . $champ] = 'content_' . $this->key . '_' . $champ;
}
$contexte['style'] = join(' ', $this->styles);
include_spip('public/assembler');
return recuperer_fond($this->controleur, $contexte);
}
/**
* Fabriquer les balises du ou des champs
* $attrs est un tableau (attr=>val) d'attributs communs ou pour le champs unique
*
* @param string|array $spec
* soit un scalaire 'ligne' ou 'texte' précisant le type de balise
* soit un array($champ=>array('type'=>'...', 'attrs'=>array(attributs specifique du champs)))
* @return string
* le html de l'input
*/
function input($spec = 'ligne', $attrs = array()) {
if ($this->controleur) {
return $this->fond($spec);
}
include_spip('inc/filtres');
$return = '';
foreach ($this->texts as $champ => $val) {
$type = is_array($spec) ? $spec[$champ]['type'] : $spec;
switch ($type) {
case 'texte':
$id = uniqid('wid');
$input = '<textarea style="width:100%;" class="crayon-active"'
. ' name="content_'.$this->key.'_'.$champ.'" id="'.$id.'">'
. "\n"
. entites_html($val)
. "</textarea>\n";
break;
case 'ligne':
default:
$input = '<input class="crayon-active text" type="text"'
. ' name="content_'.$this->key.'_'.$champ.'"'
. ' value="'
. entites_html($val)
. '" />'."\n";
}
if (is_array($spec) && isset($spec[$champ]['attrs'])) {
foreach ($spec[$champ]['attrs'] as $attr => $val) {
$input = inserer_attribut($input, $attr, $val);
}
}
foreach ($attrs as $attr => $val) {
$input = inserer_attribut($input, $attr, $val);
}
// petit truc crado pour mettre la barre typo si demandee
// pour faire propre il faudra reprogrammer la bt en jquery
$meta_crayon = isset($GLOBALS['meta']['crayons']) ? unserialize($GLOBALS['meta']['crayons']) : array();
if (isset($meta_crayon['barretypo'])
and $meta_crayon['barretypo']
and $type == 'texte') {
// Pas la peine de mettre cette barre si PortePlume est la
if (!(
function_exists('chercher_filtre')
and $f = chercher_filtre('info_plugin')
and $f('PORTE_PLUME', 'est_actif')
)
) {
include_spip('inc/barre');
$input = "<div style='width:".$this->largeur."px;height:23px;'>"
. (function_exists('afficher_barre')
? afficher_barre("document.getElementById('$id')")
: '')
. '</div>'
. $input;
}
}
$return .= $input;
}
return $return;
}
}
/**
* Fabriquer les boutons du formulaire
*
* @param array $boutons
* Le tableau des boutons
* @return string
* Le html des boutons
*/
function crayons_boutons($boutons = array()) {
$boutons['submit'] = array('ok', texte_backend(_T('bouton_enregistrer')));
$boutons['cancel'] = array('cancel', texte_backend(_T('crayons:annuler')));
$html = '';
foreach ($boutons as $bnam => $bdef) {
if ($bdef) {
$html .= '<button type="button" class="crayon-' . $bnam .
'" title="' . $bdef[1] . '">' . $bdef[1] . '</button>';
}
}
if ($html) {
return '<div class="crayon-boutons"><div>'.$html.'</div></div>';
}
}
function crayons_formulaire($html, $action = 'crayons_store') {
if (!$html) {
return '';
}
// on est oblige de recreer un Crayon pour connaitre la largeur du form.
// Pb conceptuel a revoir
$crayon = new Crayon('');
$class = ($crayon->largeur < 250 ? ' small' : '');
include_spip('inc/filtres');
return liens_absolus(
'<div class="formulaire_spip">'
. '<form class="formulaire_crayon'.$class.'" method="post" action="'
. url_absolue(parametre_url(self(), 'action', $action))
. '" enctype="multipart/form-data">'
. $html
. crayons_boutons()
. '</form>'
.'</div>'
);
}
//
// Un Crayon avec une verification de code de securite
//
class SecureCrayon extends Crayon {
function __construct($name, $text='') {
parent::__construct($name, $text);
}
function code() {
$code = parent::code();
$secu = md5($GLOBALS['meta']['alea_ephemere']. '=' . $this->name);
return
$code
.'<input type="hidden" name="secu_'.$this->key.'" value="'.$secu.'" />'."\n";
}
}
/**
* Action affichant le controleur html ou php adéquat
*
* on affiche le formulaire demande (controleur associe au crayon)
* Si le crayon n'est pas de type "crayon", c'est un crayon etendu, qui
* integre le formulaire requis à son controleur (pour avoir les boutons
* du formulaire dans un controleur Draggable, par exemple, mais il y a
* d'autres usages possibles)
*
*/
function action_crayons_html_dist() {
include_spip('inc/crayons');
// Utiliser la bonne langue d'environnement
if (!isset($GLOBALS['forcer_lang']) or !$GLOBALS['forcer_lang'] or ($GLOBALS['forcer_lang'] === 'non')) {
lang_select($GLOBALS['auteur_session']['lang']);
}
$return = affiche_controleur(_request('class'));
if (!_request('type') or _request('type') == 'crayon') {
if (!empty($return['$html'])) {
$return['$html'] = crayons_formulaire($return['$html']);
}
}
$json = trim(crayons_json_encode($return));
header('Content-Type: text/plain; charset=utf-8');
die($json);
}

580
action/crayons_store.php

@ -0,0 +1,580 @@
<?php
/**
* Crayons
* plugin for spip
* (c) Fil, toggg 2006-2013
* licence GPL
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function verif_secu($w, $secu) {
return (
$secu == md5($GLOBALS['meta']['alea_ephemere'].'='.$w)
or
$secu == md5($GLOBALS['meta']['alea_ephemere_ancien'].'='.$w)
);
}
function post_crayons() {
$results = array();
if (isset($_POST['crayons']) and is_array($_POST['crayons'])) {
foreach ($_POST['crayons'] as $crayon) {
$name = $_POST['name_'.$crayon];
$content = array();
if ($_POST['fields_'.$crayon]) {
foreach (explode(',', $_POST['fields_'.$crayon]) as $field) {
// cas particulier d'un envoi de fichier
if (isset($_FILES['content_'.$crayon.'_'.$field])) {
if ($_FILES['content_'.$crayon.'_'.$field]['size'] > 0) {
$content[$field] = $_FILES['content_'.$crayon.'_'.$field];
} else {
$content[$field] = false;
}
// cf. valeur passee dans crayon->md5() : false ou filemtime() du logo
} else {
/**
* le changement de charset n'est plus necessaire
* depuis jquery 1.5 (feature non documentee de jquery!)
*/
if (isset($_POST['content_'.$crayon.'_'.$field])) {
$content[$field] = is_array($_POST['content_'.$crayon.'_'.$field])
?implode(',', $_POST['content_'.$crayon.'_'.$field])
:$_POST['content_'.$crayon.'_'.$field];
} else {
$content[$field] = null;
}
}
}
}
// Si les donnees POSTees ne correspondent pas a leur md5,
// il faut les traiter
if (isset($name)
and md5(serialize($content)) != $_POST['md5_'.$crayon]) {
if (!isset($_POST['secu_'.$crayon])
or verif_secu($name, $_POST['secu_' . $crayon])) {
$results[] = array($name, $content, $_POST['md5_'.$crayon], $crayon);
} else {
return false; // erreur secu
}
} else {
// cas inchange
$results[] = array($name, $content, false, $crayon);
}
}
}
return $results;
}
function crayons_store($options = array()) {
// permettre de surcharger les fonctions de recuperation des valeurs
// et de sauvegardes de celles-ci
$options = array_merge(array(
'f_get_valeur' => 'crayons_store_get_valeur',
'f_set_modifs' => 'crayons_store_set_modifs',
), $options);
include_spip('inc/crayons');
$wdgcfg = wdgcfg();
$return = array('$erreur'=>'');
$postees = post_crayons();
$invalides = $modifs = $updates = array();
if (!is_array($postees)) {
$return['$erreur'] = _U('crayons:donnees_mal_formatees');
} else {
foreach ($postees as $postee) {
if ($postee[2] !== false) {
$name = $postee[0];
$content = $postee[1];
if ($content && preg_match(_PREG_CRAYON, 'crayon '.$name, $regs)) {
list(,$crayon,$type,$modele,$id) = $regs;
$wid = $postee[3];
spip_log("autoriser('crayonner', $type, $id, null, array('modele' => $modele)", 'crayons_distant');
if (!autoriser('crayonner', $type, $id, null, array('modele' => $modele))) {
$return['$erreur'] =
"$type $id: " . _U('crayons:non_autorise');
} else {
// recuperer l'existant pour calculer son md5 et verifier
// qu'il n'a pas ete modifie entre-temps
$get_valeur = $options['f_get_valeur'];
$data = $get_valeur($content, $regs);
$md5 = md5(serialize($data));
// est-ce que le champ a ete modifie dans la base entre-temps ?
if ($md5 != $postee[2]) {
// si oui, la modif demandee correspond peut-etre
// a la nouvelle valeur ? dans ce cas on procede
// comme si "pas de modification", sinon erreur
if ($md5 != md5(serialize($content))) {
$return['$erreur'] = "$type $id $modele: " .
_U('crayons:modifie_par_ailleurs');
}
}
// Vérifications, en retournant presque comme le pipeline formulaire_verifier
// On permet aussi de modifier la valeur soumise, si une valeur est retournée dans normaliser.
$data = pipeline(
'crayons_verifier',
array(
'args' => array(
'type' => $type,
'modele' => $modele,
'id' => $id,
'content' => $content,
'wid' => $wid,
),
'data' => array(
'erreurs' => array(), // couples : champ => texte d'erreur
'normaliser' => array(), // couples : champ => valeur à utiliser
),
)
);
if (count($data['normaliser'])) {
$content = $data['normaliser'] + $content;
}
if ($data['erreurs']) {
foreach ($data['erreurs'] as $c => $e) {
$invalides[$wid . '_' . $c]['msg'] = $e;
}
}
$modifs[] = array($type, $modele, $id, $content, $wid);
// Anciennes méthodes de vérifications.
// Aiguillage pour verification de la saisie
// Pour traitement ulterieur les fonctions de verifications doivent renvoyer $invalides :
// $invalides[wid_champ]['msg'] -> message de saisie invalide
// $invalides[wid_champ]['retour'] -> caracteres invalides
$f = 'verifier_'.$type.'_'.$modele;
if (function_exists($f)) {
$_invalides = $f($modifs);
if ($_invalides and is_array($invalides)) {
$invalides = array_merge($invalides, $_invalides);
}
}
}
}
}
}
}
if (!$modifs and !$return['$erreur']) {
$return['$erreur'] = $wdgcfg['msgNoChange'] ? _U('crayons:pas_de_modification') : ' ';
$return['$annuler'] = true;
}
// un champ invalide ... ou rien ==> on ne fait rien !
if (count($invalides)) {
$return['$invalides'] = $invalides;
return $return;
}
// une quelconque erreur ... ou rien ==> on ne fait rien !
if (isset($return['$erreur']) and $return['$erreur']) {
return $return;
}
// on traite toutes les modifications
// en appelant la fonction adequate de traitement
$set_modifs = $options['f_set_modifs'];
$return = $set_modifs($modifs, $return);
// une quelconque erreur ... ou rien ==> on ne fait rien !
if ($return['$erreur']) {
return $return;
}
// et maintenant refaire l'affichage des crayons modifies
include_spip('inc/texte');
foreach ($modifs as $m) {
list($type, $modele, $id, $content, $wid) = $m;
$f = charger_fonction($type.'_'.$modele, 'vues', true)
or $f = charger_fonction($modele, 'vues', true)
or $f = charger_fonction($type, 'vues', true)
or $f = 'vues_dist';
$return[$wid] = $f($type, $modele, $id, $content, $wid);
}
return $return;
}
// recuperer une valeur en fonction des parametres recuperes
// cette fonction cherche une valeur d'une colonne d'une table SQL
function crayons_store_get_valeur($content, $regs) {
list(,$crayon,$type,$modele,$id) = $regs;
return valeur_colonne_table($type, array_keys($content), $id);
}
// stocke les valeurs envoyees dans des colonnes de table SQL
function crayons_store_set_modifs($modifs, $return) {
// sinon on bosse : toutes les modifs ont ete acceptees
// verifier qu'on a tout ce qu'il faut pour mettre a jour la base
// et regrouper les mises a jour par type/id
foreach ($modifs as $modif) {
list($type, $modele, $id, $content, $wid) = $modif;
$fun = '';
// si le crayon est un MODELE avec une fonction xxx_revision associee
// cas ou une fonction xxx_revision existe
if (function_exists($f = $type.'_'. $modele . '_revision')
or function_exists($f = $modele . '_revision')
or function_exists($f = $type . '_revision')) {
$fun = $f;
} elseif (function_exists('lister_tables_objets_sql')
and $tables_objet = lister_tables_objets_sql()
and isset($tables_objet[table_objet_sql($type)])) {
// si on est en SPIP 3+ et qu'on edite un objet editorial bien declare
// passer par l'API objet_modifier
$fun = 'crayons_objet_modifier';
} else {
// sinon spip < 3 (ou pas un objet edito)
// on teste les objets connus et on route sur les fonctions correspondantes
switch ($type) {
case 'article':
$fun = 'crayons_update_article';
break;
case 'breve':
include_spip('action/editer_breve');
$fun = 'revisions_breves';
break;
case 'forum':
include_spip('inc/forum');
$fun = 'enregistre_et_modifie_forum';
break;
case 'rubrique':
include_spip('action/editer_rubrique');
$fun = 'revisions_rubriques';
break;
case 'syndic':
case 'site':
include_spip('action/editer_site');
$fun = 'revisions_sites';
break;
case 'document':
include_spip('plugins/installer');
include_spip('inc/plugin');
if (spip_version_compare($GLOBALS['spip_version_branche'], '3.0.0alpha', '>=')) {
include_spip('action/editer_document');
$fun = 'document_modifier';
} else {
include_spip('inc/modifier');
$fun = 'revision_document';
}
break;
// cas geres de la maniere la plus standard
case 'auteur':
case 'mot':
case 'signature':
case 'petition':
default:
include_spip('inc/modifier');
$fun = 'revision_'.$type;
break;
}
}
// si on a pas reussi on passe par crayons_update() qui fera un update sql brutal
if (!$fun or !function_exists($fun)) {
$fun = 'crayons_update';
// $return['$erreur'] = "$type: " . _U('crayons:non_implemente');
// break;
}
if (!isset($updates[$type][$fun])) {
$updates[$type][$fun] = array();
}
if (!isset($updates[$type][$fun][$id])) {
$updates[$type][$fun][$id] = array('wdg'=>array(), 'chval'=>array());
}
// pour reaffecter le retour d'erreur sql au cas ou
$updates[$type][$fun][$id]['wdg'][] = $wid;
foreach ($content as $champtable => $val) {
$updates[$type][$fun][$id]['chval'][$champtable] = $val;
}
}
// il manque une fonction de mise a jour ==> on ne fait rien !
if ($return['$erreur']) {
return $return;
}
// hop ! mises a jour table par table et id par id
foreach ($updates as $type => $idschamps) {
foreach ($idschamps as $fun => $ids) {
foreach ($ids as $id => $champsvaleurs) {
/* cas particulier du logo dans un crayon complexe :
ce n'est pas un champ de la table */
if (isset($champsvaleurs['chval']['logo'])) {
spip_log('revision logo', 'crayons');
logo_revision($id, $champsvaleurs['chval'], $type, $champsvaleurs['wdg']);
unset($champsvaleurs['chval']['logo']);
}
if (count($champsvaleurs['chval'])) {
// -- revisions_articles($id_article, $c) --
spip_log("$fun($id ...)", 'crayons');
$updok = $fun($id, $champsvaleurs['chval'], $type, $champsvaleurs['wdg']);
// Renvoyer erreur si update base distante echoue,
// on ne regarde pas les updates base local car ils ne renvoient rien
list($distant,$table) = distant_table($type);
if ($distant and !$updok) {
$return['$erreur'] = "$type: " . _U('crayons:update_impossible');
}
}
}
}
}
return $return;
}
//
// VUE
//
function vues_dist($type, $modele, $id, $content, $wid) {
// pour ce qui a une {lang_select} par defaut dans la boucle,
// la regler histoire d'avoir la bonne typo dans le propre()
// NB: ceci n'a d'impact que sur le "par defaut" en bas
list($distant,$table) = distant_table($type);
if (colonne_table($type, 'lang')) {
$b = valeur_colonne_table($type, 'lang', $id);
lang_select($a = array_pop($b));
} else {
lang_select($a = $GLOBALS['meta']['langue_site']);
}
// chercher vues/article_toto.html
// sinon vues/toto.html
if (find_in_path(($fond = 'vues/' . $type . '_' . $modele) . '.html')
or find_in_path(($fond = 'vues/' . $modele) .'.html')
or find_in_path(($fond = 'vues/' . $type) .'.html')) {
$primary = (function_exists('id_table_objet')?id_table_objet($table):'id_' . $table);
$contexte = array(
$primary => $id,
'crayon_type' => $type,
'crayon_modele' => $modele,
'champ' => $modele,
'class' => _request('class_'.$wid),
'self' => _request('self'),
'lang' => $GLOBALS['spip_lang']
);
$contexte = array_merge($contexte, $content);
include_spip('public/assembler');
return recuperer_fond($fond, $contexte);
} else {
// vue par defaut
// Par precaution on va rechercher la valeur
// dans la base de donnees (meme si a priori la valeur est
// ce qu'on vient d'envoyer, il y a nettoyage des caracteres et
// eventuellement d'autres filtres de saisie...)
$bdd = valeur_colonne_table($type, $modele, $id);
if (count($bdd)) {
$valeur = array_pop($bdd);
} else {
// les champs n'ont pas ete retrouves dans la base
// ce qui signifie a priori que nous sommes en face d'une cle primaire compose
// et qu'un crayon a modifie un element de cette cle (c'est pas malin !)
// dans ce cas, on reaffiche a minima ce qu'on vient de publier
// mais il sera impossible de le reediter dans la foulee avec le meme crayon
// (car l'identifiant du crayon se base sur l'id).
// Il faudra donc recharger la page pour pouvoir reediter.
if (is_scalar($id)) {
$valeur = $content[$modele];
}
}
if ($valeur) {
// seul spip core sait rendre les donnees
if (function_exists('appliquer_traitement_champ')) {
$valeur = appliquer_traitement_champ($valeur, $modele, table_objet($table));
} else {
if (in_array($modele, array('chapo', 'texte', 'descriptif', 'ps', 'bio'))) {
$valeur = propre($valeur);
} else {
$valeur = typo($valeur);
}
}
}
return $valeur;
}
}
/**
* Fonction de mise a jour par API editer_objet
* @param $id
* @param $data
* @param $type
* @param $ref
* @return bool|mixed|string
*/
function crayons_objet_modifier($id, $data, $type, $ref) {
if (include_spip('action/editer_objet')
and function_exists('objet_modifier')) {
$type = objet_type($type);
// objet_modifier attend id_parent pour le parent et pas id_rubrique
if (isset($data['id_rubrique']) and !isset($data['id_parent']) and $type!=='rubrique') {
$data['id_parent'] = $data['id_rubrique'];
}
return objet_modifier($type, $id, $data);
}
// fallback
return crayons_update($id, $data, $type);
}
//
// Fonctions de mise a jour generique
//
function crayons_update($id, $colval = array(), $type = '') {
if (!$colval or !count($colval)) {
return false;
}
list($distant,$table) = distant_table($type);
if ($distant) {
list($nom_table, $where) = table_where($type, $id);
if (!$nom_table) {
return false;
}
$update = $sep = '';
foreach ($colval as $col => $val) {
$update .= $sep . '`' . $col . '`=' . _q($val);
$sep = ', ';
}
$a = spip_query($q = 'UPDATE `' . $nom_table . '` SET ' . $update . ' WHERE ' . $where, $distant);
#spip_log($q);
include_spip('inc/invalideur');
suivre_invalideur($cond, $modif = true);
} else {
// cle primaire composee : 3-4-rubrique
// calculer un where approprie
// et modifier sans passer par la fonction destinee aux tables principales
// on limite a SPIP 2 mini car sql_updateq n'est pas mappe dans les crayons_compat
if (is_scalar($id) and ($GLOBALS['spip_version_code'] >= '1.93')) {
list($nom_table, $where) = table_where($type, $id, true); // where sous forme de tableau
$a = sql_updateq($nom_table, $colval, $where);
} else {
// modification d'une table principale
include_spip('inc/modifier');
$a = modifier_contenu($type, $id, array(), $colval);
}
}
return $a;
}
//
// Fonctions de mise a jour
//
function crayons_update_article($id_article, $c = false) {
include_spip('action/editer_article');
// Enregistrer les nouveaux contenus
revisions_articles($id_article, $c);
// En cas de statut ou de id_rubrique
// NB: instituer_article veut id_parent, et pas id_rubrique !
if (isset($c['id_rubrique'])) {
$c['id_parent'] = $c['id_rubrique'];
unset($c['id_rubrique']);
}
instituer_article($id_article, $c);
}
/**
* Enregistre les modifications sur une configuration
* suite à un crayon sur une meta
*
* La colonne est toujours 'valeur' pour ces données.
* La donnée à enregistrer peut-être une sous partie de configuration.
* Si c'est le cas, on gère l'enregistrement via ecrire_config.
*
* @param string $a
* Nom ou clé de la meta (descriptif_site ou demo__truc pour demo/truc)
* @param bool|array $c
* Liste des champs modifiés
* Ici, 'valeur' normalement.
* @return void
**/
function revision_meta($a, $c = false) {
if (isset($c['valeur'])) {
// Certaines cles de configuration sont echapées ici (cf #EDIT_CONFIG{demo/truc})
$a = str_replace('__', '/', $a);
spip_log("meta '$a' = '$c[valeur]'", 'crayons');
// eviter de planter les vieux SPIP
if (false === strpos($a, '/')) {
ecrire_meta($a, $c['valeur']);
// SPIP 3 ou Bonux 2 ou CFG
} else {
include_spip('inc/config');
ecrire_config($a, $c['valeur']);
}
include_spip('inc/invalideur');
suivre_invalideur('meta');
}
}
// TODO:
// Ce modele est cense enregistrer les tags sous forme de ??
// une ligne dans un champ spip_articles.tags, et/ou des mots-cles...
function modeles_tags($id, $c) {
var_dump($id); #id_article
var_dump($c); # perturbant : ici on a array('id_article'=>'valeur envoyee')
}
function action_crayons_store_dist() {
return action_crayons_store_args();
}
// permettre de passer une autre fonction de stockage des informations
function action_crayons_store_args($store = 'crayons_store') {
header('Content-Type: text/plain; charset='.$GLOBALS['meta']['charset']);
lang_select($GLOBALS['auteur_session']['lang']);
$r = $store();
// Si on a ete appeles par jQuery, on renvoie tout, c'est le client
// crayons.js qui va traiter l'affichage du resultat et status
# Attention le test $_SERVER["HTTP_X_REQUESTED_WITH"] === "XMLHttpRequest"
# n'est pas bon car le cas d'un fichier uploade via iframe n'est pas detecte
// S'il y a une adresse de redirection, on renvoie vers elle
// En cas d'erreur il faudrait ajouter &err=... dans l'url ?
if (_request('redirect')) {
if (!$r['$erreur']
or $r['$annuler']) {
include_spip('inc/headers');
redirige_par_entete(_request('redirect'));
} else {
echo "<h4 class='status'>".$r['$erreur']."</h4>\n";
foreach ($r as $wid => $v) {
if ($wid !== '$erreur') {
echo "<div id='$wid'>$v</div><hr />\n";
}
}
echo "<a href='".quote_amp(_request('redirect'))."'>"
.quote_amp(_request('redirect'))
."</a>\n";
}
} else {
// Cas normal : JSON
echo crayons_json_export($r);
}
exit;
}

62
action/crayons_upload.php

@ -0,0 +1,62 @@
<?php
/**
* Crayons
* plugin for spip
* (c) Fil, toggg 2006-2013
* licence GPL
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Upload de documents
*
* Cette action recoit des fichiers ($_FILES)
* et les affecte a l'objet courant ;
* puis renvoie la liste des documents joints
*/
function action_crayons_upload() {
$type = preg_replace('/\W+/', '', strval(_request('type')));
$id = intval(_request('id'));
// check securite :-)
include_spip('inc/autoriser');
if (!autoriser('joindredocument', $type, $id)) {
echo 'Erreur: upload interdit';
return false;
}
// on n'accepte qu'un seul document à la fois, dans la variable 'upss'
if ($file = $_FILES['upss']
and $file['error'] == 0) {
$source = $file['tmp_name']; # /tmp/php/phpxxx
$nom_envoye = $file['name']; # mon-image.jpg
include_spip('plugins/installer'); // spip_version_compare dans SPIP 3.x
include_spip('inc/plugin'); // spip_version_compare dans SPIP 2.x
if (function_exists('spip_version_compare')) { // gerer son absence dans les branche precedente a SPIP 2.x
if (spip_version_compare($GLOBALS['spip_version_branche'], '3.0.0alpha', '>=')) {
define('_SPIP3', true);
}
}
if (defined('_SPIP3')) {
include_spip('action/ajouter_documents');
$ajouter_un_document = charger_fonction('ajouter_un_document', 'action');
$id = $ajouter_un_document('new', $file, $type, $id, 'document');
} else {
include_spip('inc/ajouter_documents');
$id = ajouter_un_document($source, $nom_envoye, $type, $id, 'document', $id_document = 0, $documents_actifs, $titrer = true);
}
}
if (!$id) {
$erreur = 'erreur !';
}
$a = recuperer_fond('modeles/uploader_item', array('id_document' => $id, 'erreur' => $erreur));
echo $a;
}

11
controleurs/article_intro.html

@ -0,0 +1,11 @@
[(#REM)
Controleur pour le crayon 'article_intro' , uniquement html
]
#CACHE{0}
<BOUCLE_a(ARTICLES){id_article}{statut==.}>
<textarea class="crayon-active" name="#ENV{name_descriptif}"
style="width:#ENV{largeur}px; height:#ENV{hauteur}px;#ENV{style}">
[(#DESCRIPTIF**|sinon{#INTRODUCTION|textebrut|trim}|entites_html)]</textarea>
</BOUCLE_a>

17
controleurs/article_intro2.html

@ -0,0 +1,17 @@
[(#REM)
Controleur pour le crayon 'article_intro2' , uniquement html
]
#CACHE{0}
<BOUCLE_a(ARTICLES){id_article}{statut==.}>
<fieldset style="width:#ENV{largeur}px;#ENV{style}">
<legend>Introduction</legend>
<label>Descriptif</label><textarea class="crayon-active" name="#ENV{name_descriptif}"
style="width:100%; height:#ENV{hauteur}px;">
[(#DESCRIPTIF**|entites_html)]</textarea>
<label>Chapo</label><textarea class="crayon-active" name="#ENV{name_chapo}"
style="width:100%; height:#ENV{hauteur}|mul{2}px;">
[(#CHAPO**|entites_html)]</textarea>
</fieldset>
</BOUCLE_a>

38
controleurs/article_intro3.php

@ -0,0 +1,38 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// un controleur qui n'utilise que php et les inputs défauts
function controleurs_article_intro3_dist($regs) {
list(,$crayon,$type,$champ,$id) = $regs;
$valeur = valeur_colonne_table($type, array('descriptif', 'chapo', 'texte'), $id);
if ($valeur === false) {
return array("$type $id $champ: " . _U('crayons:pas_de_valeur'), 6);
}
$n = new Crayon('article-intro3-' . $id, $valeur, array('hauteurMini' => 234));
$return = array(
// html
$n->formulaire(
// champs et attributs propres
array(
'descriptif' => array('type' => 'texte', 'attrs' => array(
'style' => 'height:' . ceil($n->hauteur*2/13) . 'px;' .
'width:' . $n->largeur . 'px;')),
'chapo' => array('type' => 'texte', 'attrs' => array(
'style' => 'height:' . ceil($n->hauteur*4/13) . 'px;' .
'width:' . $n->largeur . 'px;')),
'texte' => array('type' => 'texte', 'attrs' => array(
'style' => 'height:' . ceil($n->hauteur*4/13) . 'px;' .
'width:' . $n->largeur . 'px;'))) //,
// attributs communs :( marche pas pour style , pas 2 fois ?
// array('style' => 'width:' . $n->largeur . 'px;')
),
// status
null);
return $return;
}

54
controleurs/article_introduction.html

@ -0,0 +1,54 @@
[(#REM)
Controleur pour le crayon 'article_introduction' php+html
(les balises écrites ci-dessous sont volontairement avec un espace pour ne pas être
compilée)
Appelé via # EDIT{introduction} dans une boucle article
Affiche les trois champs :
- descriptif (si rempli, il sera le rendu de # INTRODUCTION)
- chapo
- texte
Si aucun descriptif, le rendu de # INTRODUCTION est par défaut les 600 premiers caractères de
# CHAPO + # TEXTE
]
#CACHE{0}
<BOUCLE_a(ARTICLES){id_article}{statut==.}>
<ul class="editer-groupe">
<li class="fieldset" style="width:#ENV{largeur}px;#ENV{style}">
<h3 class="legend"><:crayons:legend_introduction_article:></h3>
<p class="explication"><:crayons:explication_introduction_article:></p>
<ul class="editer-groupe">
<li class="editer_descriptif">
<label for="descriptif"><:texte_descriptif_rapide:></label>
<textarea class="crayon-active maxheight150"
name="#ENV{name_descriptif}"
id="descriptif"
style="width:100%;
height:#ENV{h_descriptif}px;">[(#DESCRIPTIF**|entites_html)]</textarea>
</li>
[(#CONFIG{articles_chapeau}|=={oui}|oui)
<li class="editer_chapo">
<label for="chapo"><:info_chapeau:></label>
<textarea class="crayon-active"
name="#ENV{name_chapo}"
id="chapo"
style="width:100%;
height:#ENV{h_chapo}px;">[(#CHAPO**|entites_html)]</textarea>
</li>]
<li class="editer_texte">
<label for="text_area"><:info_texte:></label>
<textarea class="crayon-active"
name="#ENV{name_texte}"
id="text_area"
style="width:100%;
height:#ENV{h_texte}px;">[(#TEXTE**|entites_html)]</textarea>
</li>
</ul>
</li>
</ul>
</BOUCLE_a>

26
controleurs/article_introduction.php

@ -0,0 +1,26 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// un controleur php + html
// html == avec un modele, controleurs/article_introduction.html)
function controleurs_article_introduction_dist($regs) {
list(,$crayon,$type,$champ,$id) = $regs;
$valeur = valeur_colonne_table($type, array('descriptif', 'chapo', 'texte'), $id);
if ($valeur === false) {
return array("$type $id $champ: " . _U('crayons:pas_de_valeur'), 6);
}
$n = new Crayon('article-introduction-' . $id, $valeur, array('hauteurMini' => 234, 'controleur' => 'controleurs/article_introduction'));
$contexte = array(
'h_descriptif' => (int)ceil($n->hauteur*2/13),
'h_chapo' => (int)ceil($n->hauteur*4/13),
'h_texte' => (int)ceil($n->hauteur*4/13));
$html = $n->formulaire($contexte);
$status = null;
return array($html, $status);
}

17
controleurs/article_texte.html

@ -0,0 +1,17 @@
[(#REM)
Controleur pour le crayon 'article_intro' , uniquement html
]
#CACHE{0}
<BOUCLE_a(ARTICLES){id_article}{statut==.}>
<textarea class="crayon-active" name="#ENV{name_texte}"
style="width:#ENV{largeur}px; height:#ENV{hauteur}px;#ENV{style}">
[(#TEXTE**|entites_html)]</textarea>
[(#CONFIG{crayons/upload}|?{
#MODELE{uploader_liste,id_article}
})<INCLURE{fond=js/uploader.js,id_article=#ID_ARTICLE}>]
</BOUCLE_a>

11
controleurs/auteur_email.html

@ -0,0 +1,11 @@
[(#REM)
Controleur pour le crayon 'auteur_email', uniquement html
]
#CACHE{0}
<BOUCLE_a(AUTEURS){id_auteur}{tous}>
<input class="crayon-active" name="#ENV{name_email}"
style="width:#ENV{largeur}px;#ENV{style}" value="[(#EMAIL**|entites_html)]" />
</BOUCLE_a>

11
controleurs/auteur_nom.html

@ -0,0 +1,11 @@
[(#REM)
Controleur pour le crayon 'auteur_nom', uniquement html
]
#CACHE{0}
<BOUCLE_a(AUTEURS){id_auteur}{tous}>
<input class="crayon-active" name="#ENV{name_nom}"
style="width:#ENV{largeur}px;#ENV{style}" value="[(#NOM**|entites_html)]" />
</BOUCLE_a>

24
controleurs/auteur_qui.html

@ -0,0 +1,24 @@
[(#REM)
Controleur pour le crayon 'auteur_qui', uniquement html
]
#CACHE{0}
<BOUCLE_a(AUTEURS){id_auteur}{tous}>
<fieldset style="#ENV{style}">
<h3 class="legend"><:crayons:legend_controleur_qui:></h3>
<ul class="editer-groupe">
<li class="editer_nom">
<label for="nom"><:ecrire:info_nom:> :</label>
<input type="text" class="crayon-active text" name="#ENV{name_nom}" id="nom"
size="40" value="[(#NOM**|entites_html)]" />
</li>
<li class="editer_email">
<label for="email"><:ecrire:email_2|ucfirst:></label>
<input type="text" class="crayon-active text" name="#ENV{name_email}" id="email"
size="40" value="[(#EMAIL**|entites_html)]" />
</li>
</ul>
</fieldset>
</BOUCLE_a>

9
controleurs/breve_hyperlien.html

@ -0,0 +1,9 @@
<BOUCLE_f(BREVES){id_breve}{statut==.}>
<fieldset style="#ENV{largeur}px;#ENV{style}"><legend>Hyperlien</legend>
<label><:form_prop_indiquer_nom_site:></label> <input class="crayon-active" name="#ENV{name_lien_titre}"
style="width:100%;" value="[(#NOM_SITE**|entites_html)]" />
<br />
<label><:form_prop_url_site:></label> <input class="crayon-active" name="#ENV{name_lien_url}"
style="width:100%;" value="[(#URL_SITE**|entites_html)]" />
</fieldset>
</BOUCLE_f>

46
controleurs/document_fichier.html

@ -0,0 +1,46 @@
[(#REM)
Controleur pour le crayon 'document'
]
#CACHE{0}
[(#REM) En fonction de du contexte, choisir un logo ]
<BOUCLE_d(DOCUMENTS){id_document}{tout}>
[(#SET{image,[<img src="(#LOGO_DOCUMENT||extraire_attribut{src})" />]})]
<fieldset[ style="(#ENV{style});"]>
<legend>
[(#SET{logo,[(#GET{image}|image_reduire{0,40})]})]
[(#REM) hacke l'url pour eviter le cache du navigateur ]
[(#SET{url,[(#GET{logo}|extraire_attribut{src}
|parametre_url{s,#EVAL{time()}})]})]
<small>[(#GET{logo}|inserer_attribut{src,#GET{url}}
|inserer_attribut{style,vertical-align:middle;})]
&nbsp; <:crayons:legend_controleur_fichier_remplacer{extension=#EXTENSION}:>
[((#GET{image}
|extraire_attribut{width})&times;[(#GET{image}
|extraire_attribut{height})]px)]</small>
</legend>
<input class="crayon-active" name="#ENV{name_document}" type="file"[
onchange="(#MODE|=={vignette}|?{' '})if (this.value && !this.value.match(/\.(png|jpeg|jpg|gif)$/i)) { alert('Il faut choisir une image :-)'); this.value=''; };"] />
[(#REM)
TODO: document distant (cf. document_fichier_revision dans inc/crayons)
<br />
<input class="crayon-active" name="#ENV{name_fichier}" type="text" value="#FICHIER" />
]