Browse Source

Branchage menu menu 2

v0_9
rastapopoulos@spip.org 11 years ago
commit
5eccb0a9ac
  1. 105
      .gitattributes
  2. 144
      action/editer_menu.php
  3. 110
      action/editer_menus_entree.php
  4. 72
      action/exporter_menu.php
  5. 19
      action/supprimer_menu.php
  6. 26
      balise/menus_afficher_entree.php
  7. 59
      base/menus_tables.php
  8. 58
      css/menuspip.css
  9. 75
      formulaires/editer_menu.html
  10. 122
      formulaires/editer_menu.php
  11. 40
      formulaires/editer_menus_entree.html
  12. 250
      formulaires/editer_menus_entree.php
  13. 83
      formulaires/inc-menus_entrees.html
  14. 11
      formulaires/inc-menus_entrees_inexistantes.html
  15. 23
      formulaires/inc-nouvelle_entree-1.html
  16. 38
      formulaires/inc-nouvelle_entree-2.html
  17. BIN
      images/export.png
  18. BIN
      images/menus-16.png
  19. BIN
      images/menus-24.png
  20. BIN
      images/menus-48.png
  21. BIN
      images/menus-nouveau-24.png
  22. BIN
      images/menus-nouveau-48.png
  23. BIN
      images/menus_accueil.png
  24. BIN
      images/menus_action_ajouter.png
  25. BIN
      images/menus_action_bas.png
  26. BIN
      images/menus_action_haut.png
  27. BIN
      images/menus_action_modifier.png
  28. BIN
      images/menus_action_supprimer.png
  29. BIN
      images/menus_articles_rubrique.png
  30. BIN
      images/menus_groupes_mots.png
  31. BIN
      images/menus_lien.png
  32. BIN
      images/menus_logout.png
  33. BIN
      images/menus_mapage.png
  34. BIN
      images/menus_mots.png
  35. BIN
      images/menus_objet.png
  36. BIN
      images/menus_page_speciale.png
  37. BIN
      images/menus_rubriques.png
  38. BIN
      images/menus_secteurlangue.png
  39. BIN
      images/menus_texte_libre.png
  40. 184
      inc/menus.php
  41. 19
      inc/menus_autoriser.php
  42. 7
      inclure/barre-nav.html
  43. 21
      inclure/menu.html
  44. 7
      inclure/nav.html
  45. 18
      lang/menus.xml
  46. 169
      lang/menus_ca.php
  47. 169
      lang/menus_de.php
  48. 169
      lang/menus_en.php
  49. 169
      lang/menus_es.php
  50. 169
      lang/menus_fr.php
  51. 169
      lang/menus_it.php
  52. 169
      lang/menus_ru.php
  53. 169
      lang/menus_sk.php
  54. 14
      lang/paquet-menus_de.php
  55. 14
      lang/paquet-menus_en.php
  56. 20
      lang/paquet-menus_fr.php
  57. 14
      lang/paquet-menus_it.php
  58. 11
      menu.html
  59. 13
      menus/accueil.html
  60. 8
      menus/accueil.xml
  61. 47
      menus/articles_rubrique.html
  62. 12
      menus/articles_rubrique.xml
  63. 15
      menus/deconnecter.html
  64. 8
      menus/deconnecter.xml
  65. 20
      menus/espace_prive.html
  66. 10
      menus/espace_prive.xml
  67. 64
      menus/groupe_mots.html
  68. 11
      menus/groupe_mots.xml
  69. 10
      menus/lien.html
  70. 10
      menus/lien.xml
  71. 15
      menus/mapage.html
  72. 8
      menus/mapage.xml
  73. 47
      menus/mots.html
  74. 11
      menus/mots.xml
  75. 37
      menus/objet.html
  76. 12
      menus/objet.xml
  77. 12
      menus/page_speciale.html
  78. 10
      menus/page_speciale.xml
  79. 12
      menus/page_speciale_zajax.html
  80. 13
      menus/page_speciale_zajax.xml
  81. 217
      menus/rubriques.html
  82. 26
      menus/rubriques.xml
  83. 2
      menus/secteurlangue.html
  84. 21
      menus/secteurlangue.xml
  85. 12
      menus/texte_libre.html
  86. 8
      menus/texte_libre.xml
  87. 54
      menus_administrations.php
  88. 25
      menus_fonctions.php
  89. 139
      menus_ieconfig.php
  90. 9
      menus_options.php
  91. 31
      menus_pipelines.php
  92. 6
      noisettes/menu.html
  93. 16
      noisettes/menu.yaml
  94. 33
      paquet.xml
  95. 84
      plugin.xml
  96. 56
      prive/exec/menus_editer.html
  97. 20
      prive/exec/menus_tous.html
  98. 25
      prive/squelettes/contenu/menus_editer.html
  99. 20
      prive/squelettes/contenu/menus_tous.html
  100. 19
      prive/squelettes/navigation/menus_editer.html
  101. Some files were not shown because too many files have changed in this diff Show More

105
.gitattributes vendored

@ -0,0 +1,105 @@
* text=auto !eol
action/editer_menu.php -text
action/editer_menus_entree.php -text
action/exporter_menu.php -text
action/supprimer_menu.php -text
balise/menus_afficher_entree.php -text
base/menus_tables.php -text
css/menuspip.css -text
formulaires/editer_menu.html -text
formulaires/editer_menu.php -text
formulaires/editer_menus_entree.html -text
formulaires/editer_menus_entree.php -text
formulaires/inc-menus_entrees.html -text
formulaires/inc-menus_entrees_inexistantes.html -text
formulaires/inc-nouvelle_entree-1.html -text
formulaires/inc-nouvelle_entree-2.html -text
images/export.png -text
images/menus-16.png -text
images/menus-24.png -text
images/menus-48.png -text
images/menus-nouveau-24.png -text
images/menus-nouveau-48.png -text
images/menus_accueil.png -text
images/menus_action_ajouter.png -text
images/menus_action_bas.png -text
images/menus_action_haut.png -text
images/menus_action_modifier.png -text
images/menus_action_supprimer.png -text
images/menus_articles_rubrique.png -text
images/menus_groupes_mots.png -text
images/menus_lien.png -text
images/menus_logout.png -text
images/menus_mapage.png -text
images/menus_mots.png -text
images/menus_objet.png -text
images/menus_page_speciale.png -text
images/menus_rubriques.png -text
images/menus_secteurlangue.png -text
images/menus_texte_libre.png -text
inc/menus.php -text
inc/menus_autoriser.php -text
inclure/barre-nav.html -text
inclure/menu.html -text
inclure/nav.html -text
lang/menus.xml -text
lang/menus_ca.php -text
lang/menus_de.php -text
lang/menus_en.php -text
lang/menus_es.php -text
lang/menus_fr.php -text
lang/menus_it.php -text
lang/menus_ru.php -text
lang/menus_sk.php -text
lang/paquet-menus_de.php -text
lang/paquet-menus_en.php -text
lang/paquet-menus_fr.php -text
lang/paquet-menus_it.php -text
/menu.html -text
menus/accueil.html -text
menus/accueil.xml -text
menus/articles_rubrique.html -text
menus/articles_rubrique.xml -text
menus/deconnecter.html -text
menus/deconnecter.xml -text
menus/espace_prive.html -text
menus/espace_prive.xml -text
menus/groupe_mots.html -text
menus/groupe_mots.xml -text
menus/lien.html -text
menus/lien.xml -text
menus/mapage.html -text
menus/mapage.xml -text
menus/mots.html -text
menus/mots.xml -text
menus/objet.html -text
menus/objet.xml -text
menus/page_speciale_zajax.html -text
menus/page_speciale_zajax.xml -text
menus/rubriques.html -text
menus/rubriques.xml -text
menus/secteurlangue.html -text
menus/secteurlangue.xml -text
menus/texte_libre.html -text
menus/texte_libre.xml -text
/menus_administrations.php -text
/menus_fonctions.php -text
/menus_ieconfig.php -text
/menus_options.php -text
/menus_pipelines.php -text
noisettes/menu.html -text
noisettes/menu.yaml -text
/paquet.xml -text
/plugin.xml -text
prive/exec/menus_editer.html -text
prive/exec/menus_tous.html -text
prive/squelettes/contenu/menus_editer.html -text
prive/squelettes/contenu/menus_tous.html -text
prive/squelettes/navigation/menus_editer.html -text
prive/themes/spip/images/menu-exporter-24.png -text
prive/themes/spip/images/menus-16.png -text
prive/themes/spip/images/menus-24.png -text
saisies-vues/menu.html -text
saisies-vues/menus_multiple.html -text
saisies/menu.html -text
saisies/menus_multiple.html -text

144
action/editer_menu.php

@ -0,0 +1,144 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* Action de création / Modification d'un menu
* @param unknown_type $arg
* @return unknown_type
*/
function action_editer_menu_dist($arg=null) {
if (is_null($arg)){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
// si id_menu n'est pas un nombre, c'est une creation
if (!$id_menu = intval($arg)) {
$id_menu = insert_menu();
}
// Enregistre l'envoi dans la BD
if ($id_menu > 0) $err = menu_set($id_menu);
// S'il y a un fichier on tente d'importer son contenu
if ($_FILES['import']){
$fichier = $_FILES['import']['tmp_name'];
$yaml = '';
lire_fichier($fichier, $yaml);
// Si on a bien recupere une chaine on tente de la decoder
if ($yaml){
include_spip('inc/yaml');
$entrees = yaml_decode($yaml);
// Si le decodage marche on importe alors le contenu
if (is_array($entrees)){
menus_importer($entrees, $id_menu);
}
}
}
if (_request('redirect')) {
$redirect = parametre_url(urldecode(_request('redirect')),
'id_menu', $id_menu, '&') . $err;
include_spip('inc/headers');
redirige_par_entete($redirect);
}
else
return array($id_menu,$err);
}
/**
* Appelle la fonction de modification d'un menu
*
* @param int $id_menu
* @param unknown_type $set
* @return $err
*/
function menu_set($id_menu, $set=null) {
$err = '';
$c = array();
foreach (array(
'titre',
'identifiant',
'css'
) as $champ)
$c[$champ] = _request($champ,$set);
include_spip('inc/modifier');
revision_menu($id_menu, $c);
return $err;
}
/**
* Crée un nouveau menu et retourne son ID
*
* @return int id_menu
*/
function insert_menu() {
$champs = array('titre'=>''); // eviter le bug de req/sqlite < 2.1.3
// Envoyer aux plugins
$champs = pipeline('pre_insertion',
array(
'args' => array(
'table' => 'spip_menus',
),
'data' => $champs
)
);
$id_menu = sql_insertq("spip_menus");
return $id_menu;
}
/**
* Enregistre une révision de menu
*
* @param int $id_menu
* @param array $c
* @return
*/
function revision_menu ($id_menu, $c=false) {
$invalideur = "id='id_menu/$id_menu'";
modifier_contenu('menu', $id_menu,
array(
'nonvide' => array('titre' => _T('info_sans_titre')),
'invalideur' => $invalideur
),
$c);
return ''; // pas d'erreur
}
function menus_importer($entrees, $id_menu){
// On lit chaque entree de premier niveau
foreach ($entrees as $cle => $entree){
// On ajoute cette entree
$id_menus_entree = sql_insertq(
'spip_menus_entrees',
array(
'id_menu' => $id_menu,
'rang' => ($cle+1), // les entrees sont dans l'ordre des rangs
'type_entree' => $entree['type_entree'],
'parametres' => serialize($entree['parametres'])
)
);
// S'il existe un sous-menu pour cette entree on le cree
if (is_array($entree['sous_menu'])){
$id_sous_menu = sql_insertq(
'spip_menus',
array(
'id_menus_entree' => $id_menus_entree
)
);
// Puis dedans on importe les entrees correspondantes
menus_importer($entree['sous_menu'], $id_sous_menu);
}
}
}
?>

110
action/editer_menus_entree.php

@ -0,0 +1,110 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* Action de création / Modification d'une entrée de menu
* @param unknown_type $arg
* @return unknown_type
*/
function action_editer_menus_entree_dist($arg=null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
// si id_menus_entree n'est pas un nombre, c'est une creation
if (!$id_menus_entree = intval($arg)) {
$id_menu = _request('id_menu_nouvelle_entree') ? _request('id_menu_nouvelle_entree') : _request('id_menu');
if(intval($id_menu)){
$id_menus_entree = insert_menus_entree($id_menu);
}
}
// Enregistre l'envoi dans la BD
if ($id_menus_entree > 0)
$err = menus_entree_set($id_menus_entree);
if (_request('redirect')) {
$redirect = parametre_url(urldecode(_request('redirect')),
'id_menus_entree', $id_menus_entree, '&') . $err;
include_spip('inc/headers');
redirige_par_entete($redirect);
}
else
return array($id_menus_entree,$err);
}
/**
* Crée une nouvelle entree de menu et retourne son ID
*
* @return int id_menus_entree
*/
function insert_menus_entree($id_menu) {
// Envoyer aux plugins
$champs = pipeline('pre_insertion',
array(
'args' => array(
'table' => 'spip_menus_entrees',
),
'data' => $champs
)
);
$id_menus_entree = sql_insertq("spip_menus_entrees",array('id_menu'=>$id_menu));
return $id_menus_entree;
}
/**
* Appelle la fonction de modification d'une entrée de menu
*
* @param int $id_menu_entree
* @param unknown_type $set
* @return $err
*/
function menus_entree_set($id_menus_entree, $set=null) {
$err = '';
$c = array();
$c['id_menu'] = _request('id_menu_nouvelle_entree');
foreach (array(
'rang',
'type_entree',
'parametres'
) as $champ)
$c[$champ] = _request($champ, $set);
$c['parametres'] = is_array($c['parametres']) ? $c['parametres'] : array();
$c['parametres'] = serialize($c['parametres']);
include_spip('inc/menus');
$entrees = menus_lister_disponibles();
$infos = $entrees[$c['type_entree']];
include_spip('inc/modifier');
revision_menus_entree($id_menus_entree, $c);
return $err;
}
/**
* Enregistre une révision d'entree de menu
*
* @param int $id_menus_entree
* @param array $c
* @return
*/
function revision_menus_entree ($id_menus_entree, $c=false) {
$invalideur = "id='id_menus_entree/$id_menus_entree'";
modifier_contenu('menus_entree', $id_menus_entree,
array(
'invalideur' => $invalideur
),
$c);
return ''; // pas d'erreur
}
?>

72
action/exporter_menu.php

@ -0,0 +1,72 @@
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
function action_exporter_menu_dist(){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$id_menu = intval($arg);
$export = '';
if ($id_menu > 0){
include_spip('base/abstract_sql');
include_spip('inc/yaml');
// On récupère l'identifiant du menu pour le nom de fichier
$identifiant = sql_getfetsel(
'identifiant',
'spip_menus',
'id_menu = '.$id_menu
);
// On calcule le tableau des entrees
$entrees = exporter_menu_recursif($id_menu);
// On envode en yaml
$export = yaml_encode($entrees);
}
Header("Content-Type: text/x-yaml;");
Header("Content-Disposition: attachment; filename=menu-$identifiant.yaml");
Header("Content-Length: ".strlen($export));
echo $export;
exit();
}
function exporter_menu_recursif($id_menu){
$entrees = sql_allfetsel(
'id_menus_entree, type_entree, parametres',
'spip_menus_entrees',
'id_menu = '.$id_menu,
'',
'rang'
);
// Pour chaque entree on nettoie et on ajoute le sous-menu eventuel
foreach ($entrees as $cle => $entree){
// On remet au propre les parametres
$entrees[$cle]['parametres'] = unserialize($entree['parametres']);
// On regarde s'il existe un sous-menu
$id_sous_menu = intval(sql_getfetsel(
'id_menu',
'spip_menus',
'id_menus_entree = '.$entree['id_menus_entree']
));
// Si le menu existe, il faut l'ajouter au tableau
if ($id_sous_menu > 0){
$entrees[$cle]['sous_menu'] = exporter_menu_recursif($id_sous_menu);
}
// On enleve id_menus_entree car on en a pas besoin
unset($entrees[$cle]['id_menus_entree']);
}
return $entrees;
}
?>

19
action/supprimer_menu.php

@ -0,0 +1,19 @@
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
function action_supprimer_menu_dist(){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$id_menu = intval($arg);
if ($id_menu > 0){
include_spip('inc/menus');
menus_supprimer_menu($id_menu);
}
}
?>

26
balise/menus_afficher_entree.php

@ -0,0 +1,26 @@
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
function balise_MENUS_AFFICHER_ENTREE_dist($p) {
$contexte = interprete_argument_balise(1,$p);
$id_menus_entree = champ_sql('id_menus_entree', $p);
$type_entree = champ_sql('type_entree', $p);
$parametres = champ_sql('parametres', $p);
// Par défaut ça affiche le mode du menu public
if ($contexte != "'appel_formulaire'")
$contexte = "'appel_menu'";
$p->code = "(!$id_menus_entree) ? _T('zbug_champ_hors_motif', array('champ'=>'AFFICHER_ENTREE', 'motif'=>'MENUS_ENTREES')) : recuperer_fond(
'menus/'.$type_entree,
array_merge(unserialize($parametres), array($contexte=>true, env=>\$Pile[0]))
)";
return $p;
}
?>

59
base/menus_tables.php

@ -0,0 +1,59 @@
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
function menus_declarer_tables_interfaces($interface){
// 'spip_' dans l'index de $tables_principales
$interface['table_des_tables']['menus']='menus';
$interface['table_des_tables']['menus_entrees']='menus_entrees';
// Titres
$interface['table_titre']['menus'] = 'titre, "" as lang';
return $interface;
}
function menus_declarer_tables_principales($tables_principales){
//-- Table menus -----------------------------------------------------------
$menus = array(
"id_menu" => "bigint(21) NOT NULL",
"id_menus_entree" => "bigint(21) DEFAULT '0' NOT NULL",
"titre" => "text DEFAULT '' NOT NULL",
"identifiant" => "varchar(255) default '' not null",
"css" => "tinytext DEFAULT '' NOT NULL"
);
$menus_cles = array(
"PRIMARY KEY" => "id_menu",
"KEY id_menus_entree" => "id_menus_entree"
);
$tables_principales['spip_menus'] = array(
'field' => &$menus,
'key' => &$menus_cles
);
// Table menus_elements ----------------------------------------------------
$menus_entrees = array(
"id_menus_entree" => "bigint(21) NOT NULL",
"id_menu" => "bigint(21) DEFAULT '0' NOT NULL",
"rang" => "smallint DEFAULT '1' NOT NULL",
"type_entree" => "tinytext DEFAULT '' NOT NULL",
"parametres" => "text DEFAULT '' NOT NULL"
);
$menus_entrees_cles = array(
"PRIMARY KEY" => "id_menus_entree",
"KEY id_menu" => "id_menu"
);
$tables_principales['spip_menus_entrees'] = array(
'field' => &$menus_entrees,
'key' => &$menus_entrees_cles
);
return $tables_principales;
}
?>

58
css/menuspip.css

@ -0,0 +1,58 @@
.formulaire_editer_menu_entrees{
position:relative;
}
.formulaire_editer_menu_entrees .image_loading{
position:absolute;
top:50%;
left:50%;
}
.formulaire_spip ul.menus_entrees{
clear:both;
}
.formulaire_spip ul.menus_entrees ul.menus_entrees{
border-left:1px solid #ccc;
border-top:1px solid #ccc;
}
.formulaire_spip ul.menus_entrees li.entree{
clear:both;
padding-left : 34px;
padding-right:0;
padding-bottom:0;
background-position:5px 10px;
background-repeat:no-repeat;
border-bottom:1px solid #ccc;
}
.formulaire_spip ul.menus_entrees .ligne{
position:relative;
}
.formulaire_spip ul.menus_entrees .actions{
position:absolute;
right:5px;
top:5px;
text-align:right;
}
.formulaire_spip ul.menus_entrees .titre{
font-weight:bold;
line-height:29px;
}
.formulaire_spip ul.menus_entrees .infos{
font-size:0.9em;
margin-bottom:5px;
}
.formulaire_spip ul.menus_entrees .actions button{
border:none;
padding:0;
margin:0;
cursor:pointer;
}
.formulaire_spip ul.menus_entrees img{
vertical-align:middle;
}

75
formulaires/editer_menu.html

@ -0,0 +1,75 @@
<div class="formulaire_spip formulaire_editer [formulaire_(#ENV{form})][ formulaire_(#ENV{form})-#ENV{id_menu,nouveau}]">
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[(#ENV{editable})
<form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#ACTION_FORMULAIRE{#ENV{action}}
<ul>
<li class="fieldset">
<fieldset>
<h3 class="legend"><:menus:formulaire_partie_identification:></h3>
<ul>
#SET{obli,'obligatoire'}
#SET{name,titre}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<li class="editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}"><:menus:formulaire_titre:></label>
[<span class='erreur_message'>(#GET{erreurs})</span>]
<input type="text" class="text multilang" name="#GET{name}" id="#GET{name}" size="40" value="#ENV{#GET{name}}" />
</li>
#SET{name,identifiant}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<li class="editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}"><:menus:formulaire_identifiant:></label>
<div class="explication"><:menus:formulaire_identifiant_explication:></div>
[<span class='erreur_message'>(#GET{erreurs})</span>]
<input type="text" class="text" name="#GET{name}" id="#GET{name}" size="40" value="#ENV{#GET{name}}" />
</li>
#SET{name,css}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<li class="editer_[(#GET{name})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}"><:menus:formulaire_css:></label>
<div class="explication"><:menus:formulaire_css_explication:></div>
[<span class='erreur_message'>(#GET{erreurs})</span>]
<input type="text" class="text" name="#GET{name}" id="#GET{name}" size="40" value="#ENV{#GET{name}}" />
</li>
[(#REM) Seulement si c'est un nouveau et qu'il y a le plugin YAML)]
[(#ENV{nouveau}|oui)
[(#PLUGIN{yaml}|oui)
#SET{name,import}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<li class="editer_[(#GET{name})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}"><:menus:formulaire_importer:></label>
<div class="explication"><:menus:formulaire_importer_explication:></div>
[<span class='erreur_message'>(#GET{erreurs})</span>]
<input type="file" class="file" name="#GET{name}" id="#GET{name}" size="20" value="#ENV{#GET{name}}" />
</li>
]
]
</ul>
<p class='boutons'>
<input type='submit' class='submit' value='<:bouton_enregistrer:>' />
</p>
</fieldset>
</li>
</ul>
</div></form>
]
</div>
<script type="text/javascript">
$(function(){
$('.formulaire_#ENV{form}'+' .boutons').hide();
$('.formulaire_#ENV{form}'+' input')
.change(function(){$('.formulaire_#ENV{form}'+' .boutons').slideDown();})
.keydown(function(){$('.formulaire_#ENV{form}'+' .boutons').slideDown();});
});
</script>

122
formulaires/editer_menu.php

@ -0,0 +1,122 @@
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/editer');
function formulaires_editer_menu_charger($id_menu, $nouveau){
include_spip('base/abstract_sql');
include_spip('inc/autoriser');
$contexte = array();
$contexte['editable'] = true;
// Seulement si on a le droit de modifier les menus
if (autoriser('modifier', 'menu')){
$nouveau = ($nouveau == 'oui') ? true : false;
$id_menu = intval($id_menu) ? intval($id_menu) : false;
// Si on demande un id_menu
if ($id_menu){
// On désactive de toute façon le nouveau
$nouveau = false;
// On teste si le menu existe bien dans les menus principaux
$id_menu_ok = intval(sql_getfetsel(
'id_menu',
'spip_menus',
array(
array('=', 'id_menu', $id_menu),
array('=', 'id_menus_entree', 0)
)
));
// S'il n'existe pas
if (!$id_menu_ok){
$contexte['editable'] = false;
$contexte['message_erreur'] = _T('menus:erreur_menu_inexistant', array('id'=>$id_menu));
}
}
elseif (!$nouveau){
$contexte['editable'] = false;
$contexte['message_erreur'] = _T('menus:erreur_parametres');
}
// Si on peut bien éditer le menu, on déclare ce qu'il faut
if ($contexte['editable']){
$contexte['id_menu'] = $id_menu;
$contexte['nouveau'] = $nouveau;
// Les champs du menu principal
$contexte['titre'] = '';
$contexte['identifiant'] = '';
$contexte['css'] = '';
$contexte['import'] = '';
$valeurs = formulaires_editer_objet_charger('menu',$id_menu,0,0,'', '', '', '');
$contexte = array_merge($contexte, $valeurs);
// Déclarer l'action pour SPIP 2.0
$contexte['_action'] = array('editer_menu', $id_menu);
// On sait toujours si on est sur un menu déjà créé ou pas
$contexte['_hidden'] .= '<input type="hidden" name="id_menu" value="'.$id_menu.'" />';
}
}
else{
$contexte['editable'] = false;
$contexte['message_erreur'] = _T('menus:erreur_autorisation');
}
return $contexte;
}
function formulaires_editer_menu_verifier($id_menu, $nouveau){
include_spip('base/abstract_sql');
$erreurs = array();
$oblis = array('titre','identifiant');
$erreurs = formulaires_editer_objet_verifier('menu',$id_menu,$oblis);
$identifiant = _request('identifiant');
// On vérifie que l'identifiant est bon
if (!$erreurs['identifiant'] and !preg_match('/^[\w]+$/', $identifiant))
$erreurs['identifiant'] = _T('menus:erreur_identifiant_forme');
// On vérifie que l'identifiant n'est pas déjà utilisé
if (!$erreurs['identifiant']){
$deja = sql_getfetsel(
'id_menu',
'spip_menus',
array(
'identifiant = '.sql_quote($identifiant),
'id_menu > 0',
'id_menu !='.intval(_request('id_menu'))
)
);
if ($deja)
$erreurs['identifiant'] = _T('menus:erreur_identifiant_deja');
}
return $erreurs;
}
function formulaires_editer_menu_traiter($id_menu, $nouveau){
$res = formulaires_editer_objet_traiter('menu', $id_menu, 0, 0, '', '', '', '');
// Si ça va pas on errorise
if (!$res['id_menu']){
$res['message_erreur'] = _T('menus:erreur_mise_a_jour');
}
else{
// Si on est dans l'espace privé on force la redirection
if (_request('exec') == 'menus_editer')
$res['redirect'] = generer_url_ecrire('menus_editer', "id_menu=".$res['id_menu']);
}
// Dans tous les cas le formulaire est toujours éditable
$res['editable'] = true;
return $res;
}
?>

40
formulaires/editer_menus_entree.html

@ -0,0 +1,40 @@
<div class="formulaire_spip formulaire_editer [formulaire_(#ENV{form})][ formulaire_(#ENV{form})-#ENV{id_menu,nouveau}]">
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[(#ENV{editable})
<form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#ACTION_FORMULAIRE{#ENV{action}}
<ul>
<li class="fieldset">
<fieldset>
<h3 class="legend"><:menus:formulaire_partie_construction:></h3>
<input style="display:none;" type="submit" class="submit" name="enregistrer" value="<:bouton_enregistrer:>" />
#INCLURE{fond=formulaires/inc-menus_entrees, env}
</fieldset>
</li>
</ul>
</div></form>
]
</div>
<script type="text/javascript">
$(function(){
$('.entree .actions').hide();
$('.entree .ligne')
.hover(
function(){
$(this).find('.actions').show();
},
function(){
$(this).find('.actions').hide();
}
);
});
</script>

250
formulaires/editer_menus_entree.php

@ -0,0 +1,250 @@
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/menus');
include_spip('inc/editer');
include_spip('inc/actions');
function formulaires_editer_menus_entree_charger($id_menu,$id_menus_entree='new'){
/**
* On vérifie si nous ne sommes pas dans une modification
* Sinon c'est une création
*/
$id_menus_entree = intval(_request('modifier_entree')) ? _request('modifier_entree') : $id_menus_entree;
$valeurs = formulaires_editer_objet_charger('menus_entree',$id_menus_entree,0,0,'', '', '', '');
$valeurs['id_menu'] = $id_menu;
// Les champs pour les entrées
$valeurs['parametres'] = array();
// Des champs pour controler le formulaire
$valeurs['demander_nouvelle_entree'] = '';
$valeurs['id_menu_nouvelle_entree'] = '';
$valeurs['enregistrer'] = '';
// On a en permanence accès aux infos des types
$valeurs['types_entrees'] = menus_lister_disponibles();
// On sait toujours si on est sur un menu déjà créé ou pas
$valeurs['_hidden'] .= '<input type="hidden" name="id_menu" value="'.$id_menu.'" />';
return $valeurs;
}
function formulaires_editer_menus_entree_verifier($id_menu,$id_menus_entree='new'){
$erreurs = formulaires_editer_objet_verifier('menus_entree',$id_menus_entree,array());
// Si on demande une nouvelle entree pour un menu --------------------------
if ($id_menu = intval(_request('demander_nouvelle_entree'))){
// S'il n'y a pas encore de type d'entree de choisi
if (!($type_entree = _request('type_entree'))){
$erreurs['id_menu_nouvelle_entree'] = $id_menu;
// On charge les différents types d'entrées disponibles
$erreurs['entrees'] = menus_lister_disponibles();
if (_request('suivant'))
$erreurs['type'] = _T('menus:erreur_type_menu');
}
// Si on a choisi un type d'entree
else{
$erreurs['id_menu_nouvelle_entree'] = $id_menu;
$erreurs['type_entree'] = $type_entree;
// On charge les infos du type choisi
$entrees = menus_lister_disponibles();
$erreurs['infos_'.$type_entree] = $entrees[$type_entree];
}
}
// Si on veut modifier une entrée ------------------------------------------
if ($id_menus_entree = intval(_request('modifier_entree'))){
// On va chercher l'existant de cette entrée
$entree = sql_fetsel(
'type_entree, parametres',
'spip_menus_entrees',
'id_menus_entree = '.$id_menus_entree
);
$type_entree = $entree['type_entree'];
$parametres = unserialize($entree['parametres']);
$erreurs = array_merge($erreurs, $parametres);
$erreurs['id_menus_entree'] = $id_menus_entree;
$erreurs['type_entree'] = $type_entree;
// On charge les infos du type choisi
$entrees = menus_lister_disponibles();
$erreurs['infos_'.$type_entree] = $entrees[$type_entree];
}
// Si on valide une entree pour un menu ------------------------------------
if (($id_menu = intval(_request('id_menu_nouvelle_entree')) or $id_menus_entree = intval(_request('id_menus_entree'))) and _request('enregistrer')){
$type_entree = _request('type_entree');
$parametres_envoyes = _request('parametres');
$entrees = menus_lister_disponibles();
$infos = $entrees[$type_entree];
// On teste que chaque paramètre obligatoire est bien renseigné
foreach ($infos['parametres'] as $nom=>$parametre){
if ($parametre['obligatoire']){
if (!$parametres_envoyes[$nom]){
if ($id_menu)
$erreurs['id_menu_nouvelle_entree'] = $id_menu;
if ($id_menus_entree)
$erreurs['id_menus_entree'] = $id_menus_entree;
$erreurs['type_entree'] = $type_entree;
$erreurs['infos_'.$type_entree] = $infos;
$erreurs['parametres'][$nom] = _T('info_obligatoire');
}
}
}
}
return $erreurs;
}
function formulaires_editer_menus_entree_traiter($id_menu,$id_menus_entree='new'){
$retours = array();
// Si on valide une entree pour un menu ------------------------------------
if (($id_menu = intval(_request('id_menu_nouvelle_entree')) or $id_menus_entree = intval(_request('id_menus_entree'))) and _request('enregistrer')){
$res = formulaires_editer_objet_traiter('menus_entree', $id_menus_entree, 0, 0, '', '', '', '');
if (!$res['id_menus_entree'])
$retours['message_erreur'] = _T('menus:erreur_mise_a_jour');
}
// Si on demande la supression d'une entrée --------------------------------
if ($id_menus_entree = intval(_request('supprimer_entree'))){
$ok = menus_supprimer_entree($id_menus_entree);
if (!$ok)
$retours['message_erreur'] = _T('menus:erreur_mise_a_jour');
}
// Si on demande à déplacer une entrée -------------------------------------
if ($params = _request('deplacer_entree')){
preg_match('/^([\d]+)-(bas|haut)$/', $params, $params);
array_shift($params);
list($id_menus_entree, $sens) = $params;
$id_menus_entree = intval($id_menus_entree);
// On récupère des infos sur le placement actuel
$entree = sql_fetsel(
'id_menu, rang',
'spip_menus_entrees',
'id_menus_entree = '.$id_menus_entree
);
$id_menu = intval($entree['id_menu']);
$rang_actuel = intval($entree['rang']);
// On teste si ya une entrée suivante
$dernier_rang = intval(sql_getfetsel(
'rang',
'spip_menus_entrees',
'id_menu = '.$id_menu,
'',
'rang desc',
'0,1'
));
// Tant qu'on ne veut pas faire de tour complet
if (!($sens == 'bas' and $rang_actuel == $dernier_rang) and !($sens == 'haut' and $rang_actuel == 1)){
// Alors on ne fait qu'échanger deux entrées
$rang_echange = ($sens == 'bas') ? ($rang_actuel + 1) : ($rang_actuel - 1);
$ok = sql_updateq(
'spip_menus_entrees',
array(
'rang' => $rang_actuel
),
'id_menu = '.$id_menu.' and rang = '.$rang_echange
);
if ($ok)
$ok = sql_updateq(
'spip_menus_entrees',
array(
'rang' => $rang_echange
),
'id_menus_entree = '.$id_menus_entree
);
}
// Sinon on fait un tour complet en déplaçant tout
else{
if ($sens == 'bas'){
// Tout le monde descend d'un rang
$ok = sql_update(
'spip_menus_entrees',
array(
'rang' => 'rang + 1'
),
'id_menu = '.$id_menu
);
// L'entrée passe tout en haut
if ($ok)
$ok = sql_updateq(
'spip_menus_entrees',
array(
'rang' => 1
),
'id_menus_entree = '.$id_menus_entree
);
}
else{
// Tout le monde monte d'un rang
$ok = sql_update(
'spip_menus_entrees',
array(
'rang' => 'rang - 1'
),
'id_menu = '.$id_menu
);
// L'entrée passe tout en bas
if ($ok)
$ok = sql_updateq(
'spip_menus_entrees',
array(
'rang' => $dernier_rang
),
'id_menus_entree = '.$id_menus_entree
);
}
}
if (!$ok) $retours['message_erreur'] = _T('menus:erreur_mise_a_jour');
}
// Si on veut faire un sous-menu -------------------------------------------
if ($id_menus_entree = intval(_request('demander_sous_menu'))){
$id_menu = sql_insertq(
'spip_menus',
array(
'id_menus_entree' => $id_menus_entree
)
);
if (!$id_menu) $retours['message_erreur'] = _T('menus:erreur_mise_a_jour');
}
// Si on veut supprimer un menu --------------------------------------------
if ($id_menu = intval(_request('supprimer_menu'))){
// Est-ce un menu ou un sous-menu ?
$sous_menu = intval(sql_getfetsel(
'id_menus_entree',
'spip_menus',
'id_menu = '.$id_menu
));
$ok = menus_supprimer_menu($id_menu);
if (!$ok) $retours['message_erreur'] = _T('menus:erreur_mise_a_jour');
if ($ok and !$sous_menu) $retours['redirect'] = generer_url_ecrire('menus_tous');
}
$retours['editable'] = true;
return $retours;
}
?>

83
formulaires/inc-menus_entrees.html

@ -0,0 +1,83 @@
#SET{rang_suivant,1}
<ul id="menu-#ENV{id_menu}" class="menus_entrees">
<BOUCLE_entrees(MENUS_ENTREES){id_menu}{par rang}>
<li class="entree"[ style="background-repeat:no-repeat;background-position:5px 10px;background-image:url((#ENV{types_entrees}|table_valeur{#TYPE_ENTREE}|table_valeur{icone}|image_reduire{24}|extraire_attribut{src}))"]>
<BOUCLE_test_modifier(CONDITION){si #ENV{erreurs}|table_valeur{id_menus_entree}|=={#ID_MENUS_ENTREE}|non}>
<div class="ligne">
<div class="description arial2">
#SET{supprimer_seulement,non}
[(#CHEMIN{menus/#TYPE_ENTREE.html}|oui)
#MENUS_AFFICHER_ENTREE{appel_formulaire}]
[(#CHEMIN{menus/#TYPE_ENTREE.html}|non)
#SET{supprimer_seulement,oui}
#INCLURE{fond=formulaires/inc-menus_entrees_inexistantes,appel_formulaire=oui,titre=#TYPE_ENTREE}
]
</div>
<div class="actions">
[(#REM) S'il y a déjà un sous-menu on ne l'affiche pas ?)]
<BOUCLE_sous_menu_test(MENUS){id_menus_entree}>
[(#REM) Rien]
</BOUCLE_sous_menu_test>
[(#GET{supprimer_seulement}|=={non}|oui)
[(#ENV{types_entrees}|table_valeur{#TYPE_ENTREE}|table_valeur{refuser_sous_menu}|non)
<button name="demander_sous_menu" value="#ID_MENUS_ENTREE" title="<:menus:formulaire_ajouter_sous_menu:>">
[<img height="24" width="24" src="(#CHEMIN{images/menus-24.png})" alt="" />]
</button>
]]
<//B_sous_menu_test>
[(#GET{supprimer_seulement}|=={non}|oui)
<button name="modifier_entree" value="#ID_MENUS_ENTREE" title="<:menus:formulaire_modifier_entree:>">
[<img height="24" width="24" src="(#CHEMIN{images/menus_action_modifier.png})" alt="" />]
</button>]
<button name="supprimer_entree" value="#ID_MENUS_ENTREE" title="<:menus:formulaire_supprimer_entree:>"
onclick="return confirm('<:menus:confirmer_supprimer_entree:>')">
[<img height="24" width="24" src="(#CHEMIN{images/menus_action_supprimer.png})" alt="" />]
</button>
[(#GET{supprimer_seulement}|=={non}|oui)
<button name="deplacer_entree" value="#ID_MENUS_ENTREE-bas" title="<:menus:formulaire_deplacer_bas:>">
[<img height="24" width="24" src="(#CHEMIN{images/menus_action_bas.png})" alt="" />]
</button>]
[(#GET{supprimer_seulement}|=={non}|oui)
<button name="deplacer_entree" value="#ID_MENUS_ENTREE-haut" title="<:menus:formulaire_deplacer_haut:>">
[<img height="24" width="24" src="(#CHEMIN{images/menus_action_haut.png})" alt="" />]
</button>]
</div>
<div class="nettoyeur"></div>
</div>
</BOUCLE_test_modifier>
#INCLURE{fond=formulaires/inc-nouvelle_entree-2, env, id_menus_entree=#ID_MENUS_ENTREE}
<//B_test_modifier>
[(#REM) Est-ce qu'il y a un sous-menu ?)]
<BOUCLE_sous_menu(MENUS){id_menus_entree}>
#INCLURE{fond=formulaires/inc-menus_entrees, env, id_menu, sous_menu=oui}
</BOUCLE_sous_menu>
</li>
#SET{rang_suivant,(#RANG|plus{1})}
</BOUCLE_entrees>
<li class="editer_entree fieldset">
#SET{id_menu_nouvelle_entree, (#ENV{erreurs}|table_valeur{id_menu_nouvelle_entree})}
#SET{type_entree, (#ENV{erreurs}|table_valeur{type_entree})}
<BOUCLE_pas_demande_entree(CONDITION){si #GET{id_menu_nouvelle_entree}|=={#ENV{id_menu}}|non}>
<div class="boutons">
[(#ENV{sous_menu}|non)<span class="image_loading"></span>]
[<button type="submit" class="submit link" name="supprimer_menu" value="#ENV{id_menu}">
[<img src="(#CHEMIN{images/menus_action_supprimer.png})" alt="" />]
(#ENV{sous_menu}|?{<:menus:formulaire_supprimer_sous_menu:>,''})
</button>]
<button type="submit" class="submit" name="demander_nouvelle_entree" value="#ENV{id_menu}">
[<img src="(#CHEMIN{images/menus_action_ajouter.png})" alt="" />]
<:menus:formulaire_ajouter_entree:>
</button>
</div>
</BOUCLE_pas_demande_entree>
[(#GET{type_entree}|non)
#INCLURE{fond=formulaires/inc-nouvelle_entree-1, env, id_menu_nouvelle_entree=#GET{id_menu_nouvelle_entree}}
]
[(#GET{type_entree}|oui)
#INCLURE{fond=formulaires/inc-nouvelle_entree-2, env, id_menu_nouvelle_entree=#GET{id_menu_nouvelle_entree}, rang_suivant=#GET{rang_suivant}}
]
<//B_pas_demande_entree>
</li>
</ul>

11
formulaires/inc-menus_entrees_inexistantes.html

@ -0,0 +1,11 @@
[(#SET{titre, <:menus:formulaire_supprimer_entree:>})]
[(#ENV{titre}|oui)
#SET{titre, #ENV*{titre}|typo}
]
[(#ENV{appel_formulaire}|oui)
<div class="erreur_message">
<div class="titre">#GET{titre}</div>
<div class="infos"><:menus:erreur_type_menu_inexistant:></div>
</div>
]

23
formulaires/inc-nouvelle_entree-1.html

@ -0,0 +1,23 @@
<ul>
<li class="editer_type[(#ENV**{erreurs}|table_valeur{type}|oui)erreur]">
<label><:menus:entree_choisir:></label>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{type})</span>]
<BOUCLE_types_entrees(POUR){tableau #ENV{erreurs}|table_valeur{entrees}}{par rang}>
<div class="choix menu_#CLE" id="choix_menu_#CLE" style="padding:3px;border-bottom:1px solid #eee;">
[(#VALEUR|table_valeur{icone}|image_reduire{24})]
<input type="radio" class="radio" name="type_entree" id="#CLE" value="#CLE" style="vertical-align:top;" />
<label for="#CLE">[(#VALEUR|table_valeur{nom})]</label>
</div>
</BOUCLE_types_entrees>
<span class='erreur_message'><:menus:erreur_aucun_type:></span>
<//B_types_entrees>
</li>
</ul>
<p class='boutons'>
<span class='image_loading'></span>
<input type="hidden" name="demander_nouvelle_entree" value="#ENV{id_menu_nouvelle_entree}" />
<input type="submit" class="submit link" name="demander_nouvelle_entree" value="<:icone_retour:>" />
<input type="submit" class="submit" name="suivant" value="<:bouton_suivant:>" />
</p>

38
formulaires/inc-nouvelle_entree-2.html

@ -0,0 +1,38 @@
#SET{type_entree, (#ENV{erreurs}|table_valeur{type_entree})}
#SET{infos, (#ENV{erreurs}|table_valeur{infos_#GET{type_entree}})}
<fieldset>
<legend>
[(#ENV{id_menus_entree}|non)
[(#GET{infos}|table_valeur{icone}|image_reduire{24})]
]
[<span style="vertical-align:middle;">(#GET{infos}|table_valeur{nom})</span>]
</legend>
<div class="explication">[(#GET{infos}|table_valeur{description})]</div>
<B_parametres>
<ul>
<BOUCLE_parametres(POUR){tableau #GET{infos}|table_valeur{parametres}}>
#SET{erreurs,(#ENV**{erreurs}|table_valeur{parametres}|table_valeur{#CLE})}
<li class="editer_texte[ (#GET{erreurs}|oui)erreur]">
<label for="#CLE">[(#VALEUR|table_valeur{label})] [(#VALEUR|table_valeur{obligatoire}|non)&#91;<:menus:formulaire_facultatif:>&#93;]</label>
[<span class='erreur_message'>(#GET{erreurs})</span>]
<input type="text" class="text[ (#VALEUR|table_valeur{class})]" name="parametres[#CLE]" value="[(#ENV{parametres}|table_valeur{#CLE}|sinon{#ENV{erreurs}|table_valeur{#CLE}}|entites_html)]" />
</li>
</BOUCLE_parametres>
</ul>
</B_parametres>
<p class='boutons'>
<span class='image_loading'></span>
[(#ENV{id_menu_nouvelle_entree}|oui)
<input type="hidden" name="id_menu_nouvelle_entree" value="#ENV{id_menu_nouvelle_entree}" />
<input type="hidden" name="rang" value="#ENV{rang_suivant}" />
]
[(#ENV{id_menus_entree}|oui)
<input type="hidden" name="id_menus_entree" value="#ENV{id_menus_entree}" />
]
<input type="hidden" name="type_entree" value="#GET{type_entree}" />
<input type="submit" class="submit link" value="<:bouton_annuler:>" />
<input type="submit" class="submit" name="enregistrer" value="<:bouton_enregistrer:>" />
</p>
</fieldset>

BIN
images/export.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
images/menus-16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 756 B

BIN
images/menus-24.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
images/menus-48.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
images/menus-nouveau-24.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
images/menus-nouveau-48.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
images/menus_accueil.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
images/menus_action_ajouter.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 B

BIN
images/menus_action_bas.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 942 B

BIN
images/menus_action_haut.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 883 B

BIN
images/menus_action_modifier.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
images/menus_action_supprimer.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

BIN
images/menus_articles_rubrique.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 922 B

BIN
images/menus_groupes_mots.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
images/menus_lien.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
images/menus_logout.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
images/menus_mapage.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
images/menus_mots.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
images/menus_objet.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
images/menus_page_speciale.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
images/menus_rubriques.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
images/menus_secteurlangue.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 825 B

BIN
images/menus_texte_libre.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

184
inc/menus.php

@ -0,0 +1,184 @@
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* Lister les types d'entrée de menus disponibles dans les dossiers menus/
*
* @staticvar array $resultats
* @param bool $informer
* @return array
*/
function menus_lister_disponibles($informer=true){
static $resultats = null;
$plugins_actifs = unserialize($GLOBALS['meta']['plugin']);
if (is_null($resultats[$informer])){
$resultats[$informer] = array();
// rechercher les skel du type truc.html
$match = ".+[.]html$";
// lister les entrées disponibles
$liste = find_all_in_path('menus/', $match);
if (count($liste)){
foreach($liste as $squelette=>$chemin) {
$type = preg_replace(',[.]html$,i', '', $squelette);
$dossier = str_replace($squelette, '', $chemin);
// On ne garde que les squelettes ayant un XML de config
if (file_exists("$dossier$type.xml")
AND (
$entree = !$informer OR ($entree = menus_charger_infos($dossier.$type))
)){
//on ne garde que les menus repondants aux necessites
$necessite = true;
if (! empty($entree['necessites']['plugin'])) {
/* la globale $plugins liste tout en majuscule */
$entree['necessites']['plugin'] = array_map("strtoupper", $entree['necessites']['plugin']);
foreach($entree['necessites']['plugin'] as $plugin) {
if ( ! array_key_exists($plugin,$plugins_actifs) )
$necessite = false;
}
}
if ($necessite)
$resultats[$informer][$type] = $entree;
}
}
}
$resultats[$informer] = pipeline('menus_lister_disponibles',array(
'args' => array(),
'data' => $resultats[$informer]
)
);
}
return $resultats[$informer];
}
/**
* Decrire un type de menu
*
* @staticvar array $infos
* @param string $type
* @return array
*/
function menus_informer($type){
static $infos = array();
if (!isset($infos[$type])){
$fichier = find_in_path("menus/$type.html");
$infos[$type] = menus_charger_infos($fichier);
}
return $infos[$type];
}
/**
* Charger les informations contenues dans le xml d'une entrée de menu
*
* @param string $type
* @param string $info
* @return array
*/
function menus_charger_infos($type, $info=""){
// on peut appeler avec le nom du squelette
$fichier = preg_replace(',[.]html$,i','',$type).".xml";
include_spip('inc/xml');
include_spip('inc/texte');
$entree = array();
if ($xml = spip_xml_load($fichier, false)){
if (count($xml['entree'])){
$xml = reset($xml['entree']);
$entree['nom'] = _T_ou_typo(spip_xml_aplatit($xml['nom']));
$entree['rang'] = intval(trim(spip_xml_aplatit($xml['rang'])));
$entree['rang'] = ($entree['rang'] ? $entree['rang'] : 1000);
$entree['description'] = isset($xml['description']) ? _T_ou_typo(spip_xml_aplatit($xml['description'])) : '';
$entree['icone'] = isset($xml['icone']) ? find_in_path(reset($xml['icone'])) : '';
$entree['refuser_sous_menu'] = isset($xml['refuser_sous_menu']);
// Décomposition des paramètres
$entree['parametres'] = array();
if (spip_xml_match_nodes(',^parametre,', $xml, $parametres)){
foreach (array_keys($parametres) as $parametre){
list($balise, $attributs) = spip_xml_decompose_tag($parametre);
$entree['parametres'][$attributs['nom']] = array(
'label' => $attributs['label'] ? _T($attributs['label']) : $attributs['nom'],
'obligatoire' => $attributs['obligatoire'] == 'oui' ? true : false,
'class' => $attributs['class'] ? $attributs['class'] : ''
);
}
}
//Décomposition des necessites
if (spip_xml_match_nodes(',^necessite,', $xml, $necessites)){
$entree['necessites']['plugin'] = array();
foreach (array_keys($necessites) as $necessite){
list($balise, $attributs) = spip_xml_decompose_tag($necessite);
array_push($entree['necessites'][$attributs['type']] , $attributs['nom']);
}
}
}
}
if (!$info)
return $entree;
else
return isset($entree[$info]) ? $entree[$info] : "";
}