From 81a7b9df0d25c4f663cba493820846b5b6eccc8f Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Tue, 1 Aug 2006 22:13:59 +0000 Subject: [PATCH] =?UTF-8?q?Permettre=20la=20surcharge=20du=20selecteur=20d?= =?UTF-8?q?e=20rubrique.=20Ca=20permet=20plus=20facilement=20de=20d=C3=A9s?= =?UTF-8?q?activer=20Ajax=20pour=20ceux=20qui=20n'aiment=20pas,=20et=20de?= =?UTF-8?q?=20fabriquer=20d'autres=20menus=20au=20besoin.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 1 + ecrire/exec/articles_edit.php | 3 +- ecrire/exec/breves_edit.php | 6 +- ecrire/exec/rubriques_edit.php | 4 +- ecrire/exec/sites_edit.php | 4 +- ecrire/inc/auteur_voir.php | 4 +- ecrire/inc/chercher_rubrique.php | 228 +++++++++++++++++++++++++++++++ ecrire/inc/rubriques.php | 214 ----------------------------- 8 files changed, 240 insertions(+), 224 deletions(-) create mode 100644 ecrire/inc/chercher_rubrique.php diff --git a/.gitattributes b/.gitattributes index 1d5ac59e0b..7b645dcd55 100644 --- a/.gitattributes +++ b/.gitattributes @@ -378,6 +378,7 @@ ecrire/inc/article_select.php -text ecrire/inc/auteur_voir.php -text ecrire/inc/boutons.php -text ecrire/inc/chercher_logo.php -text +ecrire/inc/chercher_rubrique.php -text ecrire/inc/cookie.php -text ecrire/inc/distant.php -text ecrire/inc/drapeau_edition.php -text diff --git a/ecrire/exec/articles_edit.php b/ecrire/exec/articles_edit.php index cb06519d16..c9e78e44af 100644 --- a/ecrire/exec/articles_edit.php +++ b/ecrire/exec/articles_edit.php @@ -156,6 +156,7 @@ function formulaire_articles_edit($row, $lier_trad, $new, $champs_article) { if ($champs_extra) include_spip('inc/extra'); + $selecteur_rubrique = charger_fonction('chercher_rubrique', 'inc'); return "\n<table cellpadding='0' cellspacing='0' border='0' width='100%'>" . "<tr width='100%'>" . @@ -214,7 +215,7 @@ function formulaire_articles_edit($row, $lier_trad, $new, $champs_article) { debut_cadre_couleur($logo, true, "", _T('titre_cadre_interieur_rubrique'). aide("artrub")) . - selecteur_rubrique($id_rubrique, 'article', ($statut == 'publie')) . + $selecteur_rubrique($id_rubrique, 'article', ($statut == 'publie')) . fin_cadre_couleur(true) . diff --git a/ecrire/exec/breves_edit.php b/ecrire/exec/breves_edit.php index 746d872714..81b88af545 100644 --- a/ecrire/exec/breves_edit.php +++ b/ecrire/exec/breves_edit.php @@ -127,9 +127,9 @@ if ($connect_statut=="0minirezo" OR $statut=="prop" OR $new == "oui") { debut_cadre_couleur("$logo_parent", false, "",_T('entree_interieur_rubrique').aide ("brevesrub")); - // selecteur de rubrique (pas d'ajax car toujours racine) - include_spip('inc/rubriques'); - echo selecteur_rubrique_html($id_rubrique, 'breve', ($statut == 'publie')); + // selecteur de rubrique (en general pas d'ajax car toujours racine) + $selecteur_rubrique = charger_fonction('chercher_rubrique', 'inc'); + echo $selecteur_rubrique($id_rubrique, 'breve', ($statut == 'publie')); fin_cadre_couleur(); diff --git a/ecrire/exec/rubriques_edit.php b/ecrire/exec/rubriques_edit.php index af7b5d2f56..54170da624 100644 --- a/ecrire/exec/rubriques_edit.php +++ b/ecrire/exec/rubriques_edit.php @@ -112,9 +112,9 @@ echo "<INPUT TYPE='text' CLASS='formo' NAME='titre' VALUE=\"$titre\" SIZE='40' $ debut_cadre_couleur("$logo_parent", false, '', _T('entree_interieur_rubrique').aide ("rubrub")); // selecteur de rubriques -include_spip('inc/rubriques'); +$selecteur_rubrique = charger_fonction('chercher_rubrique', 'inc'); $restreint = ($GLOBALS['statut'] == 'publie'); -echo selecteur_rubrique($id_parent, 'rubrique', $restreint, $id_rubrique); +echo $selecteur_rubrique($id_parent, 'rubrique', $restreint, $id_rubrique); // si c'est une rubrique-secteur contenant des breves, demander la diff --git a/ecrire/exec/sites_edit.php b/ecrire/exec/sites_edit.php index 8db1d9a30e..c9ed5d2156 100644 --- a/ecrire/exec/sites_edit.php +++ b/ecrire/exec/sites_edit.php @@ -118,9 +118,9 @@ echo "<input type='text' class='formo' name='url_site' value=\"$url_site\" size= debut_cadre_couleur("$logo_parent", false, "", _T('entree_interieur_rubrique')); // selecteur de rubriques - include_spip('inc/rubriques'); + $selecteur_rubrique = charger_fonction('chercher_rubrique', 'inc'); $restreint = ($GLOBALS['statut'] == 'publie'); - echo selecteur_rubrique($id_rubrique, 'site', $restreint); + echo $selecteur_rubrique($id_rubrique, 'site', $restreint); fin_cadre_couleur(); diff --git a/ecrire/inc/auteur_voir.php b/ecrire/inc/auteur_voir.php index 1b45371c7e..efa10428fe 100644 --- a/ecrire/inc/auteur_voir.php +++ b/ecrire/inc/auteur_voir.php @@ -80,8 +80,8 @@ function afficher_formulaire_statut_auteur ($id_auteur, $statut, $post='') { else echo "<b>"._T('info_ajouter_rubrique')."</b><br />"; echo "\n<input name='id_auteur' value='$id_auteur' type='hidden' />"; - include_spip('inc/rubriques'); - echo selecteur_rubrique(0, 'auteur', false); + $selecteur_rubrique = charger_fonction('chercher_rubrique', 'inc'); + echo $selecteur_rubrique(0, 'auteur', false); echo "</div>\n"; echo fin_block(); } diff --git a/ecrire/inc/chercher_rubrique.php b/ecrire/inc/chercher_rubrique.php new file mode 100644 index 0000000000..eb1dbca3fc --- /dev/null +++ b/ecrire/inc/chercher_rubrique.php @@ -0,0 +1,228 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2006 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined("_ECRIRE_INC_VERSION")) return; + +// +// Selecteur de rubriques pour l'espace prive +// En entree : +// - l'id_rubrique courante (0 si NEW) +// - le type d'objet a placer (une rubrique peut aller a la racine +// mais pas dans elle-meme, les articles et sites peuvent aller +// n'importe ou (defaut), et les breves dans les secteurs. +// $idem : en mode rubrique = la rubrique soi-meme +function inc_chercher_rubrique_dist ($id_rubrique, $type, $restreint, $idem=0) { + global $_COOKIE; + global $browser_name, $browser_version; + + // Mode sans Ajax : + // - soit parce que le cookie ajax n'est pas la + // - soit parce qu'il y a peu de rubriques + // - soit parce qu'avec IE ca plante et c'est penible + if (false /* mettre true pour desactiver ajax */ + OR (($browser_name == "MSIE" AND floor($browser_version) < "7")) + OR $_COOKIE['spip_accepte_ajax'] < 1 + OR spip_num_rows( + spip_query("SELECT id_rubrique FROM spip_rubriques LIMIT 21")) < 20) + return selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem); + + else + return selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem); + +} + +// compatibilite pour extensions qui utilisaient l'ancien nom +$GLOBALS['selecteur_rubrique'] = 'inc_chercher_rubrique_dist'; + +function style_menu_rubriques($i) { + global $browser_name, $browser_version; + global $couleur_claire, $spip_lang_left; + + if (eregi("mozilla", $browser_name)) { + $style = "padding-$spip_lang_left: 16px; " + . "margin-$spip_lang_left: ".(($i-1)*16)."px;"; + $espace = ''; + } else { + $style = ''; + for ($count = 0; $count <= $i; $count ++) + $espace .= " "; + } + switch ($i) { + case 1: + $espace= ""; + $style .= "font-weight: bold;"; + break; + case 2: + $style .= "color: #202020;"; + break; + case 3: + $style .= "color: #404040;"; + break; + case 4: + $style .= "color: #606060;"; + break; + case 5: + $style .= "color: #808080;"; + break; + default: + $style .= "color: #A0A0A0;"; + break; + } + + if ($i==1) { + $style .= "background-image: url(" . _DIR_IMG_PACK. "secteur-12.gif);"; + $style .= "background-color: $couleur_claire;"; + $style .= "font-weight: bold;"; + } + else if ($i==2) { + $style .= "border-bottom: 1px solid $couleur_claire;"; + $style .= "font-weight: bold;"; + } + + if ($style) $style = " style='$style'"; + + return array($style,$espace); +} + +function sous_menu_rubriques($id_rubrique, $root, $niv, &$data, &$enfants, $exclus, $restreint, $type) { + global $browser_name, $browser_version; + static $decalage_secteur; + + // Si on a demande l'exclusion ne pas descendre dans la rubrique courante + if ($exclus > 0 + AND $root == $exclus) return ''; + + // en fonction du niveau faire un affichage plus ou moins kikoo + + // selected ? + $selected = ($root == $id_rubrique) ? ' selected' : ''; + + // class='selec_rub' sauf pour contourner le bug MSIE / MacOs 9.0 + if (!($browser_name == "MSIE" AND floor($browser_version) == "5")) + $class = " class='selec_rub'"; + + // le style en fonction de la profondeur + list($style,$espace) = style_menu_rubriques($niv); + + // creer l'<option> pour la rubrique $root + if (isset($data[$root])) # pas de racine sauf pour les rubriques + { + $r .= "<option$selected value='$root'$class$style>$espace" + .$data[$root] + .'</option>'."\n"; + } + + // et le sous-menu pour ses enfants + $sous = ''; + if ($enfants[$root]) + foreach ($enfants[$root] as $sousrub) + $sous .= sous_menu_rubriques($id_rubrique, $sousrub, + $niv+1, $data, $enfants, $exclus, $restreint, $type); + + // si l'objet a deplacer est publie, verifier qu'on a acces aux rubriques + if ($restreint AND !acces_rubrique($root)) + return $sous; + + // sauter un cran pour les secteurs (sauf premier) + if ($niv == 1 + AND $decalage_secteur++ + AND $type != 'breve') + $r = "<option value='$root'></option>\n".$r; + + // et voila le travail + return $r.$sous; +} + +// Le selecteur de rubriques en mode classique (menu) +function selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem=0) { + $data = array(); + if ($type == 'rubrique') + $data[0] = _T('info_racine_site'); + if ($type == 'auteur') + $data[0] = ' '; # premier choix = neant (rubriques restreintes) + + // + // creer une structure contenant toute l'arborescence + // + + $q = spip_query("SELECT id_rubrique, id_parent, titre, statut, lang, langue_choisie FROM spip_rubriques " . ($type == 'breve' ? 'WHERE id_parent=0 ' : '') . "ORDER BY 0+titre,titre"); + while ($r = spip_fetch_array($q)) { + // titre largeur maxi a 50 + $titre = couper(supprimer_tags(typo(extraire_multi($r['titre'] + )))." ", 50); + if ($GLOBALS['meta']['multi_rubriques'] == 'oui' + AND ($r['langue_choisie'] == "oui" OR $r['id_parent'] == 0)) + $titre .= ' ['.traduire_nom_langue($r['lang']).']'; + $data[$r['id_rubrique']] = $titre; + $enfants[$r['id_parent']][] = $r['id_rubrique']; + if ($id_rubrique == $r['id_rubrique']) $id_parent = $r['id_parent']; + } + + + $opt = sous_menu_rubriques($id_rubrique,0, 0,$data,$enfants,$idem, $restreint, $type); + $att = " name='id_parent'\nstyle='font-size: 90%; width: 99%; font-face: verdana,arial,helvetica,sans-serif; max-height: 24px;'"; + + if (preg_match(',^<option[^<>]*value=.(\d*).[^<>]*>([^<]*)</option>$,',$opt,$r)) + $r = "<input$att type='hidden' value='" . $r[1] . "' />" . $r[2] ; + else + $r = "<select$att size='1'>\n$opt</select>\n"; + + # message pour neuneus (a supprimer ?) +# if ($type != 'auteur' AND $type != 'breve') +# $r .= "\n<br />"._T('texte_rappel_selection_champs'); + + return $r; +} + +// +// Le selecteur de rubriques en mode Ajax +// necessite ajax_page.php et inc_mini_nav.php +// +function selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem=0) { + + ## $restreint indique qu'il faut limiter les rubriques affichees + ## aux rubriques editables par l'admin restreint... or, ca ne marche pas. + ## Pour la version HTML c'est bon (cf. ci-dessus), mais pour l'ajax... + ## je laisse ca aux specialistes de l'ajax & des admins restreints + ## note : toutefois c'est juste un pb d'interface, car question securite + ## la verification est faite a l'arrivee des donnees (Fil) + + if ($idem) + $exclus = "&exclus=$idem&rac=oui"; + + if ($id_rubrique) + list($titre_parent) = spip_fetch_array(spip_query("SELECT titre FROM spip_rubriques WHERE id_rubrique=$id_rubrique")); + else if ($type == 'auteur') + $titre_parent = ' '; + else + $titre_parent = _T('info_racine_site'); + + return "<table width='100%'><tr width='100%'><td width='45'> + <a href=\"#\" + onClick=\"if(findObj('selection_rubrique').style.display=='none') + {charger_id_url_si_vide('" . + generer_url_ecrire('ajax_page', "fonction=aff_rubrique&id=$id_rubrique$exclus", true) ."', + 'selection_rubrique');} + else {findObj('selection_rubrique').style.display='none';}\" + ><img src='". _DIR_IMG_PACK . "loupe.png' style='vertical-align: middle;' + /></a><img src='". _DIR_IMG_PACK . "searching.gif' + id='img_selection_rubrique' style='visibility: hidden;'> + </td><td> + <input type='text' id='titreparent' name='titreparent' + disabled='disabled' class='forml' value=\"" + . str_replace('&', '&', entites_html(textebrut(typo($titre_parent)))) + ."\" /> + <input type='hidden' id='id_parent' name='id_parent' value='$id_rubrique' /> + </td></tr></table> + <div id='selection_rubrique' style='display: none;'></div>"; +} +?> diff --git a/ecrire/inc/rubriques.php b/ecrire/inc/rubriques.php index 0d8bdcd506..79961b3780 100644 --- a/ecrire/inc/rubriques.php +++ b/ecrire/inc/rubriques.php @@ -10,11 +10,8 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ - -// if (!defined("_ECRIRE_INC_VERSION")) return; - // // Recalculer l'ensemble des donnees associees a l'arborescence des rubriques // (cette fonction est a appeler a chaque modification sur les rubriques) @@ -368,217 +365,6 @@ function calcul_branche ($generation) { } } -// -// Selecteur de rubriques pour l'espace prive -// En entree : -// - l'id_rubrique courante (0 si NEW) -// - le type d'objet a placer (une rubrique peut aller a la racine -// mais pas dans elle-meme, les articles et sites peuvent aller -// n'importe ou (defaut), et les breves dans les secteurs. -// $idem : en mode rubrique = la rubrique soi-meme -function selecteur_rubrique($id_rubrique, $type, $restreint, $idem=0) { - global $_COOKIE; - global $browser_name, $browser_version; - - // Mode sans Ajax : - // - soit parce que le cookie ajax n'est pas la - // - soit parce qu'il y a peu de rubriques - // - soit parce qu'avec IE ca plante et c'est penible - if (false /* mettre true pour desactiver ajax */ - OR (($browser_name == "MSIE" AND floor($browser_version) < "7")) - OR $_COOKIE['spip_accepte_ajax'] < 1 - OR spip_num_rows( - spip_query("SELECT id_rubrique FROM spip_rubriques LIMIT 21")) < 20) - return selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem); - - else - return selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem); - -} - -function style_menu_rubriques($i) { - global $browser_name, $browser_version; - global $couleur_claire, $spip_lang_left; - - if (eregi("mozilla", $browser_name)) { - $style = "padding-$spip_lang_left: 16px; " - . "margin-$spip_lang_left: ".(($i-1)*16)."px;"; - $espace = ''; - } else { - $style = ''; - for ($count = 0; $count <= $i; $count ++) - $espace .= " "; - } - switch ($i) { - case 1: - $espace= ""; - $style .= "font-weight: bold;"; - break; - case 2: - $style .= "color: #202020;"; - break; - case 3: - $style .= "color: #404040;"; - break; - case 4: - $style .= "color: #606060;"; - break; - case 5: - $style .= "color: #808080;"; - break; - default: - $style .= "color: #A0A0A0;"; - break; - } - - if ($i==1) { - $style .= "background-image: url(" . _DIR_IMG_PACK. "secteur-12.gif);"; - $style .= "background-color: $couleur_claire;"; - $style .= "font-weight: bold;"; - } - else if ($i==2) { - $style .= "border-bottom: 1px solid $couleur_claire;"; - $style .= "font-weight: bold;"; - } - - if ($style) $style = " style='$style'"; - - return array($style,$espace); -} - -function sous_menu_rubriques($id_rubrique, $root, $niv, &$data, &$enfants, $exclus, $restreint, $type) { - global $browser_name, $browser_version; - static $decalage_secteur; - - // Si on a demande l'exclusion ne pas descendre dans la rubrique courante - if ($exclus > 0 - AND $root == $exclus) return ''; - - // en fonction du niveau faire un affichage plus ou moins kikoo - - // selected ? - $selected = ($root == $id_rubrique) ? ' selected' : ''; - - // class='selec_rub' sauf pour contourner le bug MSIE / MacOs 9.0 - if (!($browser_name == "MSIE" AND floor($browser_version) == "5")) - $class = " class='selec_rub'"; - - // le style en fonction de la profondeur - list($style,$espace) = style_menu_rubriques($niv); - - // creer l'<option> pour la rubrique $root - if (isset($data[$root])) # pas de racine sauf pour les rubriques - { - $r .= "<option$selected value='$root'$class$style>$espace" - .$data[$root] - .'</option>'."\n"; - } - - // et le sous-menu pour ses enfants - $sous = ''; - if ($enfants[$root]) - foreach ($enfants[$root] as $sousrub) - $sous .= sous_menu_rubriques($id_rubrique, $sousrub, - $niv+1, $data, $enfants, $exclus, $restreint, $type); - - // si l'objet a deplacer est publie, verifier qu'on a acces aux rubriques - if ($restreint AND !acces_rubrique($root)) - return $sous; - - // sauter un cran pour les secteurs (sauf premier) - if ($niv == 1 - AND $decalage_secteur++ - AND $type != 'breve') - $r = "<option value='$root'></option>\n".$r; - - // et voila le travail - return $r.$sous; -} - -// Le selecteur de rubriques en mode classique (menu) -function selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem=0) { - $data = array(); - if ($type == 'rubrique') - $data[0] = _T('info_racine_site'); - if ($type == 'auteur') - $data[0] = ' '; # premier choix = neant (rubriques restreintes) - - // - // creer une structure contenant toute l'arborescence - // - - $q = spip_query("SELECT id_rubrique, id_parent, titre, statut, lang, langue_choisie FROM spip_rubriques " . ($type == 'breve' ? 'WHERE id_parent=0 ' : '') . "ORDER BY 0+titre,titre"); - while ($r = spip_fetch_array($q)) { - // titre largeur maxi a 50 - $titre = couper(supprimer_tags(typo(extraire_multi($r['titre'] - )))." ", 50); - if ($GLOBALS['meta']['multi_rubriques'] == 'oui' - AND ($r['langue_choisie'] == "oui" OR $r['id_parent'] == 0)) - $titre .= ' ['.traduire_nom_langue($r['lang']).']'; - $data[$r['id_rubrique']] = $titre; - $enfants[$r['id_parent']][] = $r['id_rubrique']; - if ($id_rubrique == $r['id_rubrique']) $id_parent = $r['id_parent']; - } - - - $opt = sous_menu_rubriques($id_rubrique,0, 0,$data,$enfants,$idem, $restreint, $type); - $att = " name='id_parent'\nstyle='font-size: 90%; width: 99%; font-face: verdana,arial,helvetica,sans-serif; max-height: 24px;'"; - - if (preg_match(',^<option[^<>]*value=.(\d*).[^<>]*>([^<]*)</option>$,',$opt,$r)) - $r = "<input$att type='hidden' value='" . $r[1] . "' />" . $r[2] ; - else - $r = "<select$att size='1'>\n$opt</select>\n"; - - # message pour neuneus (a supprimer ?) -# if ($type != 'auteur' AND $type != 'breve') -# $r .= "\n<br />"._T('texte_rappel_selection_champs'); - - return $r; -} - -// -// Le selecteur de rubriques en mode Ajax -// necessite ajax_page.php et inc_mini_nav.php -// -function selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem=0) { - - ## $restreint indique qu'il faut limiter les rubriques affichees - ## aux rubriques editables par l'admin restreint... or, ca ne marche pas. - ## Pour la version HTML c'est bon (cf. ci-dessus), mais pour l'ajax... - ## je laisse ca aux specialistes de l'ajax & des admins restreints - ## note : toutefois c'est juste un pb d'interface, car question securite - ## la verification est faite a l'arrivee des donnees (Fil) - - if ($idem) - $exclus = "&exclus=$idem&rac=oui"; - - if ($id_rubrique) - list($titre_parent) = spip_fetch_array(spip_query("SELECT titre FROM spip_rubriques WHERE id_rubrique=$id_rubrique")); - else if ($type == 'auteur') - $titre_parent = ' '; - else - $titre_parent = _T('info_racine_site'); - - return "<table width='100%'><tr width='100%'><td width='45'> - <a href=\"#\" - onClick=\"if(findObj('selection_rubrique').style.display=='none') - {charger_id_url_si_vide('" . - generer_url_ecrire('ajax_page', "fonction=aff_rubrique&id=$id_rubrique$exclus", true) ."', - 'selection_rubrique');} - else {findObj('selection_rubrique').style.display='none';}\" - ><img src='". _DIR_IMG_PACK . "loupe.png' style='vertical-align: middle;' - /></a><img src='". _DIR_IMG_PACK . "searching.gif' - id='img_selection_rubrique' style='visibility: hidden;'> - </td><td> - <input type='text' id='titreparent' name='titreparent' - disabled='disabled' class='forml' value=\"" - . str_replace('&', '&', entites_html(textebrut(typo($titre_parent)))) - ."\" /> - <input type='hidden' id='id_parent' name='id_parent' value='$id_rubrique' /> - </td></tr></table> - <div id='selection_rubrique' style='display: none;'></div>"; -} - function cron_rubriques($t) { calculer_rubriques(); return 1; -- GitLab