X-Git-Url: http://git.cyclocoop.org/?p=lhc%2Fweb%2Fclavette_www.git;a=blobdiff_plain;f=www%2Fplugins%2Fcrayons%2Fcrayons_fonctions.php;fp=www%2Fplugins%2Fcrayons%2Fcrayons_fonctions.php;h=5cb3280e52cb6390d122367214f24907f8d9a9bb;hp=0000000000000000000000000000000000000000;hb=39f8b2ffa1fd0a3c67d6c74ed0fee9af296ccbb8;hpb=65eb21b34b55f850024ccda121bb96c73be4309f diff --git a/www/plugins/crayons/crayons_fonctions.php b/www/plugins/crayons/crayons_fonctions.php new file mode 100644 index 0000000..5cb3280 --- /dev/null +++ b/www/plugins/crayons/crayons_fonctions.php @@ -0,0 +1,462 @@ +$champ))", "crayons_distant"); + } + if (autoriser('modifier', $type, $id, null, array('champ'=>$champ))) { + if (!isset($droits['.' . $crayon])) { + $droits['.' . $crayon] = 0; + } + $droits['.' . $crayon]++; + $droits_accordes ++; + } + } + + // et les signaler dans la page + if ($droits_accordes == count($regs)) { // tous les droits + $page = Crayons_preparer_page($page, '*', $wdgcfg); + } elseif ($droits) { // seulement certains droits, preciser lesquels + $page = Crayons_preparer_page($page, join(',', array_keys($droits)), $wdgcfg); + } + + return $page; +} + +/** + * Ajoute les scripts css et js nécessaires aux crayons dans le code HTML + * + * @uses crayons_var2js() + * + * @param string $page + * Code HTML de la page complète ou du header seulement + * @param string $droits + * - Liste de css définissant les champs crayonnables + * (séparés par virgule) dont l'édition est autorisée + * - "*" si tous sont autorisés + * @param array $wdgcfg + * Description de la configuration des crayons (attribut => valeur) + * @param string $mode + * - page : toute la page est présente dans `$page` + * - head : seul le header est présent dans `$page` + * @return +**/ +function &Crayons_preparer_page(&$page, $droits, $wdgcfg = array(), $mode = 'page') { + /** + * Si pas forcer_lang, on charge le contrôleur dans la langue que l'utilisateur a dans le privé + */ + if (!isset($GLOBALS['forcer_lang']) or !$GLOBALS['forcer_lang'] or ($GLOBALS['forcer_lang'] === 'non')) { + lang_select($GLOBALS['auteur_session']['lang']); + } + + $jsFile = generer_url_public('crayons.js'); + if (_DEBUG_CRAYONS) { + $jsFile = parametre_url($jsFile, 'debug_crayons', 1, '&'); + } + include_spip('inc/filtres'); // rien que pour direction_css() :( + $cssFile = direction_css(find_in_path('crayons.css')); + + $config = crayons_var2js(array( + 'imgPath' => dirname(find_in_path('images/crayon.png')), + 'droits' => $droits, + 'dir_racine' => _DIR_RACINE, + 'self' => self('&'), + 'txt' => array( + 'error' => _U('crayons:svp_copier_coller'), + 'sauvegarder' => $wdgcfg['msgAbandon'] ? _U('crayons:sauvegarder') : '' + ), + 'img' => array( + 'searching' => array( + 'txt' => _U('crayons:veuillez_patienter') + ), + 'crayon' => array( + 'txt' => _U('crayons:editer') + ), + 'edit' => array( + 'txt' => _U('crayons:editer_tout') + ), + 'img-changed' => array( + 'txt' => _U('crayons:deja_modifie') + ) + ), + 'cfg' => $wdgcfg + )); + + + // Est-ce que PortePlume est la ? + $meta_crayon = isset($GLOBALS['meta']['crayons']) ? unserialize($GLOBALS['meta']['crayons']): array(); + $pp = ''; + if (isset($meta_crayon['barretypo']) && $meta_crayon['barretypo']) { + if (function_exists('chercher_filtre') + and $f = chercher_filtre('info_plugin') + and $f('PORTE_PLUME','est_actif')) { + + $pp = <<"; + $incJS = <</* */ + +EOH; + + if ($mode == 'head') { + //js inline avant les css, sinon ca bloque le chargement + $page = $page . $incJS . $incCSS; + return $page; + } + + $pos_head = strpos($page, ''); + if ($pos_head === false) { + return $page; + } + + // js inline avant la premiere css, ou sinon avant la fin du head + $pos_link = strpos($page, ''); + $page = substr_replace($page, $incCSS, $pos_head, 0); + + return $page; +} + +/** + * Balise indiquant un champ SQL crayonnable + * + * @note + * Si cette fonction est absente, `balise_EDIT_dist()` déclarée par SPIP + * ne retourne rien + * + * @example + * ``` + *
#TEXTE
+ *
#PS
+ * ``` + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer +**/ +function balise_EDIT($p) { + + // le code compile de ce qui se trouve entre les {} de la balise + $label = interprete_argument_balise(1, $p); + + // Verification si l'on est dans le cas d'une meta + // #EDIT{meta-descriptif_site} ou #EDIT{meta-demo/truc} + if (preg_match('/meta-(.*)\'/', $label, $meta)) { + $type = 'meta'; + $label= 'valeur'; + $primary = $meta[1]; + $p->code = "classe_boucle_crayon('" + . $type + ."','" + .$label + ."'," + . "str_replace('/', '__', '$primary')" # chaque / doit être remplacé pour CSS. + .").' '"; + $p->interdire_scripts = false; + return $p; + } + + $i_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle; + // #EDIT hors boucle? ne rien faire + if (!isset($p->boucles[$i_boucle]) or !$type = ($p->boucles[$i_boucle]->type_requete)) { + $p->code = "''"; + $p->interdire_scripts = false; + return $p; + } + + // crayon sur une base distante 'nua__article-intro-5' + if ($distant = $p->boucles[$i_boucle]->sql_serveur) { + $type = $distant.'__'.$type; + } + + // le compilateur 1.9.2 ne calcule pas primary pour les tables secondaires + // il peut aussi arriver une table sans primary (par ex: une vue) + if (!($primary = $p->boucles[$i_boucle]->primary)) { + include_spip('inc/vieilles_defs'); # 1.9.2 pour trouver_def_table + if (function_exists('trouver_def_table')) { + list($nom, $desc) = trouver_def_table( + $p->boucles[$i_boucle]->type_requete, + $p->boucles[$i_boucle] + ); + $primary = $desc['key']['PRIMARY KEY']; + } + } + // On rajoute ici un debug dans le cas où aucune clé primaire n'est trouvée. + // Cela peut se présenter par exemple si on utilise #EDIT{monchamp} directement + // dans une boucle CONDITION sans faire référence au nom de la boucle d'au dessus. + if (!$primary) { + erreur_squelette(_T('crayons:absence_cle_primaire'), $p); + } + + $primary = explode(',', $primary); + $id = array(); + foreach ($primary as $key) { + $id[] = champ_sql(trim($key), $p); + } + $primary = implode(".'-'.", $id); + + $p->code = "classe_boucle_crayon('" + . $type + ."'," + .sinon($label, "''") + ."," + . $primary + .").' '"; + $p->interdire_scripts = false; + return $p; +} + +/** + * Balise indiquant une configuration crayonnable + * + * @example + * ``` + *
#DESCRIPTIF_SITE_SPIP
+ *
#CONFIG{demo/truc}
+ * ``` + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer +**/ +function balise_EDIT_CONFIG_dist($p) { + + // le code compile de ce qui se trouve entre les {} de la balise + $config = interprete_argument_balise(1, $p); + if (!$config) { + return $p; + } + + // chaque / du nom de config doit être transformé pour css. + // nous utiliserons '__' à la place. + + $type = 'meta'; + $label= 'valeur'; + + $p->code = "classe_boucle_crayon('" + . $type + . "','" + . $label + . "'," + . "str_replace('/', '__', $config)" + . ").' '"; + $p->interdire_scripts = false; + return $p; +} + +/** + * Crée le controleur du crayon indiqué par la classe CSS + * + * @param string $class + * Class CSS de crayon tel que créé par #EDIT + * @return string + * HTML du crayon, sinon texte d'erreur +**/ +function creer_le_crayon($class) { + include_spip('inc/crayons'); + include_spip('action/crayons_html'); + $a = affiche_controleur($class, array('w' => 485, 'h' => 300, 'wh' => 500)); + return $a['$erreur'] ? $a['$erreur'] : $a['$html']; +} + +/** + * Balise `#CRAYON` affichant un formulaire de crayon + * + * SI `?edit=1;` + * + * @example + * ``` + * #CRAYON{ps} + * ``` + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer +**/ +function balise_CRAYON($p) { + $p = balise_EDIT($p); + $p->code = 'creer_le_crayon('.$p->code.')'; + return $p; +} + + +/** + * Donne la classe CSS crayon + * + * En fonction : + * - du type de la boucle + * (attention aux exceptions pour `#EDIT` dans les boucles HIERARCHIE et SITES) + * - du champ demande (vide, + ou se terminant par + : (+)classe type--id) + * - de l'id courant + * + * @param string $type + * Type d'objet, ou "meta" pour un champ de configuration + * @param string $champ + * Champ SQL concerné + * @param int|string $id + * Identifiant de la ligne sql + * @return string + * Classes CSS (à ajouter dans le HTML à destination du javascript de Crayons) +**/ +function classe_boucle_crayon($type, $champ, $id) { + // $type = objet_type($type); + $type = $type[strlen($type) - 1] == 's' ? + substr($type, 0, -1) : + str_replace( + array('hierarchie','syndication'), + array('rubrique','site'), + $type + ); + + $plus = (substr($champ, -1) == '+' and $champ = substr($champ, 0, -1)) + ? " $type--$id" + : ''; + + // test rapide pour verifier que l'id est valide (a-zA-Z0-9) + if (false !== strpos($id, ' ')) { + spip_log("L'identifiant ($id) ne pourra être géré ($type | $champ)", 'crayons'); + return 'crayon_id_ingerable'; + } + + return 'crayon ' . $type . '-' . $champ . '-' . $id . $plus; +} + +?>