Browse Source

v1.7.0 : ajout d'une table de liens, passage en declarer_table_objets_sql, et une vraie liste d'objets pour les menus. Quelques soucis de chaînes de langue à régler

svn/root/tags/v1.7.25
tcharlss@bravecassine.com 4 years ago
parent
commit
3b2a1551c8
  1. 9
      .gitattributes
  2. 133
      base/menus_tables.php
  3. 10
      formulaires/configurer_menus.php
  4. 128
      formulaires/editer_menu.php
  5. 15
      inc/menus_autoriser.php
  6. 18
      lang/menus_fr.php
  7. 5
      menus_administrations.php
  8. 53
      menus_pipelines.php
  9. 11
      paquet.xml
  10. 16
      prive/objets/infos/menus_tous.html
  11. 45
      prive/objets/liste/menus.html
  12. 72
      prive/objets/liste/menus_associer.html
  13. 18
      prive/objets/liste/menus_associer_fonctions.php
  14. 60
      prive/objets/liste/menus_lies.html
  15. 17
      prive/objets/liste/menus_lies_fonctions.php
  16. 8
      prive/squelettes/contenu/menu_edit.html
  17. 9
      prive/squelettes/contenu/menus_tous.html
  18. 33
      prive/squelettes/navigation/menu_edit.html

9
.gitattributes vendored

@ -107,9 +107,16 @@ noisettes/menu-preview.html -text
noisettes/menu.html -text
noisettes/menu.yaml -text
/paquet.xml -text
prive/objets/infos/menus_tous.html -text
prive/objets/liste/menus.html -text
prive/objets/liste/menus_associer.html -text
prive/objets/liste/menus_associer_fonctions.php -text
prive/objets/liste/menus_lies.html -text
prive/objets/liste/menus_lies_fonctions.php -text
prive/squelettes/contenu/configurer_menus.html -text
prive/squelettes/contenu/menus_editer.html -text
prive/squelettes/contenu/menu_edit.html -text
prive/squelettes/contenu/menus_tous.html -text
prive/squelettes/navigation/menu_edit.html -text
prive/squelettes/navigation/menus_editer.html -text
prive/themes/spip/images/menu-16.png -text
prive/themes/spip/images/menu-24.png -text

133
base/menus_tables.php

@ -5,55 +5,118 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Déclaration des alias de tables et filtres automatiques de champs
*
* @pipeline declarer_tables_interfaces
* @param array $interfaces
* Déclarations d'interface pour le compilateur
* @return array
* Déclarations d'interface pour le compilateur
*/
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"
);
/**
* Déclaration des objets éditoriaux
*
* @pipeline declarer_tables_objets_sql
* @param array $tables
* Description des tables
* @return array
* Description complétée des tables
*/
function menus_declarer_tables_objets_sql($tables) {
$menus_cles = array(
'PRIMARY KEY' => 'id_menu',
'KEY id_menus_entree' => 'id_menus_entree'
// Menus
$tables['spip_menus'] = array(
'type' => 'menu',
'principale' => 'oui',
'field'=> 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"
),
'key' => array(
'PRIMARY KEY' => 'id_menu',
'KEY id_menu_entree' => 'id_menu_entree',
),
'titre' => 'titre AS titre, "" AS lang',
// 'date' => '',
'champs_editables' => array('titre', 'identifiant', 'css'),
'champs_versionnes' => array('titre', 'identifiant', 'css'),
'rechercher_champs' => array('titre' => 4),
'tables_jointures' => array('spip_menus_liens'),
// chaînes de langue
'texte_modifier' => 'menus:icone_modifier_menu',
'texte_creer' => 'menus:icone_creer_menu',
'texte_creer_associer' => 'menus:texte_creer_associer_menu',
'texte_ajouter' => 'menus:texte_ajouter_menu',
'texte_objets' => 'menus:titre_menus',
'texte_objet' => 'menus:titre_menu',
'texte_logo_objet' => 'menus:titre_logo_menu',
'info_aucun_objet' => 'menus:info_aucun_menu',
'info_1_objet' => 'menus:info_1_menu',
'info_nb_objets' => 'menus:info_nb_menus',
);
$tables_principales['spip_menus'] = array(
'field' => &$menus,
'key' => &$menus_cles
// Entrées de menus
$tables['spip_menus'] = array(
'type' => 'menu',
'principale' => '',
'field'=> 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"
),
'key' => array(
'PRIMARY KEY' => 'id_menu_entree',
'KEY id_menu' => 'id_menu',
),
// 'titre' => 'titre AS titre, "" AS lang',
// 'date' => '',
'champs_editables' => array('id_menu', 'rang', 'type_entree', 'parametres'),
'champs_versionnes' => array(),
'rechercher_champs' => array(),
'join' => array('id_menu' => 'id_menu'),
'tables_jointures' => array(),
);
// 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"
);
return $tables;
}
$menus_entrees_cles = array(
'PRIMARY KEY' => 'id_menus_entree',
'KEY id_menu' => 'id_menu'
);
/**
* Déclaration des tables secondaires (liaisons)
*
* @pipeline declarer_tables_auxiliaires
* @param array $tables
* Description des tables
* @return array
* Description complétée des tables
*/
function menus_declarer_tables_auxiliaires($tables) {
$tables_principales['spip_menus_entrees'] = array(
'field' => &$menus_entrees,
'key' => &$menus_entrees_cles
$tables['spip_menus_liens'] = array(
'field' => array(
'id_menu' => 'bigint(21) DEFAULT "0" NOT NULL',
'id_objet' => 'bigint(21) DEFAULT "0" NOT NULL',
'objet' => 'VARCHAR(25) DEFAULT "" NOT NULL',
'vu' => 'VARCHAR(6) DEFAULT "non" NOT NULL',
),
'key' => array(
'PRIMARY KEY' => 'id_menu,id_objet,objet',
'KEY id_menu' => 'id_menu',
)
);
return $tables_principales;
}
return $tables;
}

10
formulaires/configurer_menus.php

@ -36,6 +36,16 @@ function formulaires_configurer_menus_saisies_dist() {
'li_class' => 'pleine_largeur',
'defaut' => lire_config('menus/entrees_masquees', array())
)
),
// Objets
array(
'saisie' => 'choisir_objets',
'options' => array(
'nom' => 'objets',
'label' => _T('menus:configurer_objets_label'),
'explication' => _T('menus:configurer_objets_explication'),
'defaut' => lire_config('menus/objets', array()),
)
)
);

128
formulaires/editer_menu.php

@ -7,7 +7,57 @@ if (!defined('_ECRIRE_INC_VERSION')) {
include_spip('inc/editer');
function formulaires_editer_menu_charger($id_menu, $nouveau) {
/**
* Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
*
* @param int|string $id_menu
* Identifiant du menu. 'new' pour un nouveau menu.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le menu créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un menu source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du menu, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return string
* Hash du formulaire
*/
function formulaires_editer_menu_identifier_dist($id_menu = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
return serialize(array(intval($id_menu), $associer_objet));
}
/**
* Chargement du formulaire d'édition de menu
*
* Déclarer les champs postés et y intégrer les valeurs par défaut
*
* @uses formulaires_editer_objet_charger()
*
* @param int|string $id_menu
* Identifiant du menu. 'new' pour un nouveau menu.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le menu créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un menu source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du menu, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Environnement du formulaire
*/
function formulaires_editer_menu_charger($id_menu = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
include_spip('base/abstract_sql');
include_spip('inc/autoriser');
$contexte = array();
@ -15,11 +65,11 @@ function formulaires_editer_menu_charger($id_menu, $nouveau) {
// Seulement si on a le droit de modifier les menus
if (autoriser('modifier', 'menu')) {
$nouveau = ($nouveau == 'oui') ? true : false;
$nouveau = intval($id_menu) ? false : true;
$id_menu = intval($id_menu) ? intval($id_menu) : false;
// Si on demande un id_menu
if ($id_menu) {
if ($id_menu and !$nouveau) {
// On désactive de toute façon le nouveau
$nouveau = false;
@ -73,7 +123,32 @@ function formulaires_editer_menu_charger($id_menu, $nouveau) {
return $contexte;
}
function formulaires_editer_menu_verifier($id_menu, $nouveau) {
/**
* Vérifications du formulaire d'édition de menu
*
* Vérifier les champs postés et signaler d'éventuelles erreurs
*
* @uses formulaires_editer_objet_verifier()
*
* @param int|string $id_menu
* Identifiant du menu. 'new' pour un nouveau menu.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le menu créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un menu source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du menu, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Tableau des erreurs
*/
function formulaires_editer_menu_verifier($id_menu = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
include_spip('base/abstract_sql');
$erreurs = array();
@ -105,8 +180,33 @@ function formulaires_editer_menu_verifier($id_menu, $nouveau) {
return $erreurs;
}
function formulaires_editer_menu_traiter($id_menu, $nouveau) {
$res = formulaires_editer_objet_traiter('menu', $id_menu, 0, 0, '', '', array(), '');
/**
* Traitement du formulaire d'édition de menu
*
* Traiter les champs postés
*
* @uses formulaires_editer_objet_traiter()
*
* @param int|string $id_menu
* Identifiant du menu. 'new' pour un nouveau menu.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le menu créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un menu source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du menu, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Retours des traitements
*/
function formulaires_editer_menu_traiter($id_menu = 'new', $retour = '', $associer_objet = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$res = formulaires_editer_objet_traiter('menu', $id_menu, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
// Si ça va pas on errorise
if (!$res['id_menu']) {
@ -117,6 +217,22 @@ function formulaires_editer_menu_traiter($id_menu, $nouveau) {
$res['redirect'] = generer_url_ecrire('menus_editer', 'id_menu='.$res['id_menu']);
}
}
// Un lien a prendre en compte ?
if ($associer_objet and $id_menu = $res['id_menu']) {
list($objet, $id_objet) = explode('|', $associer_objet);
if ($objet and $id_objet and autoriser('modifier', $objet, $id_objet)) {
include_spip('action/editer_liens');
objet_associer(array('menu' => $id_menu), array($objet => $id_objet));
if (isset($retours['redirect'])) {
$retours['redirect'] = parametre_url($retours['redirect'], 'id_lien_ajoute', $id_menu, '&');
}
}
}
// Dans tous les cas le formulaire est toujours éditable
$res['editable'] = true;

15
inc/menus_autoriser.php

@ -19,3 +19,18 @@ function autoriser_menu_modifier_dist($faire, $type, $id, $qui, $opt) {
function autoriser_menus_tous_dist($faire, $type, $id, $qui, $opt) {
return autoriser('modifier', 'menu', $id, $qui, $opt);
}
/**
* Autorisation de lier/délier l'élément (menus)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_associermenus_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' and !$qui['restreint'];
}

18
lang/menus_fr.php

@ -7,9 +7,14 @@ if (!defined('_ECRIRE_INC_VERSION')) {
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A
'ajouter_lien_menu' => 'Ajouter ce menu',
// C
'configurer_entrees_masquees_explication' => 'Cochez les entrées que vous souhaitez <strong>masquer</strong> lors de la création d’un menu.',
'configurer_titre' => 'Configurer les entrées du plugin Menus',
'configurer_objets_label' => 'Contenus liés',
'configurer_objets_explication' => 'Choisissez les contenus auxquels on peut associer des menus',
'confirmer_supprimer_entree' => 'Voulez-vous vraiment supprimer cette entrée ?',
'confirmer_supprimer_sous_menu' => 'Voulez-vous vraiment supprimer ce sous-menu ?',
@ -143,6 +148,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'info_tri_alpha' => '(alphabétique)',
'info_tri_articles' => 'Tri des articles :',
'info_tri_num' => '(numérique)',
'info_1_menu' => 'Un menu',
'info_aucun_menu' => 'Aucun menu',
'info_nb_menus' => '@nb@ menus',
// N
'noisette_description' => 'Insère un menu défini avec le plugin Menus.',
@ -165,13 +173,21 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'nom_menu_secteurlangue' => 'Secteurs de langue',
'nom_menu_texte_libre' => 'Texte libre',
// R
'retirer_lien_menu' => 'Retirer ce menu',
'retirer_tous_liens_menus' => 'Retirer tous les menus',
'retirer_lien_objet' => 'Dissocier',
// T
'tous_les_articles' => '... Tous les articles',
'toutes_les_rubriques' => '... Toutes les rubriques',
'texte_ajouter_menu' => 'Ajouter un menu',
'texte_creer_associer_menu' => 'Créer et associer un menu',
'titre_objets_lies_menu' => 'Liés à ce menu',
// U
'utiles_explication' => 'Les squelettes actuels du site peuvent utiliser les menus suivants.',
'utiles_generer_menu' => 'Créer le menu <strong>@titre@ (<em>@identifiant@</em>)</strong>',
'utiles_generer_menus' => 'Créer <strong>tous</strong> les menus utiles',
'utiles_titre' => 'Menus utiles'
'utiles_titre' => 'Menus utiles',
);

5
menus_administrations.php

@ -40,6 +40,10 @@ function menus_upgrade($nom_meta_version_base, $version_cible) {
$maj['0.5.3'] = array(
array('menus_fusionne_critere_tri_num_alpha'),
);
// Ajout table de liens (où est passé le 0.5.4 ?)
$maj['0.5.5'] = array(
array('maj_tables', array('spip_menus_liens')),
);
include_spip('base/upgrade');
maj_plugin($nom_meta_version_base, $version_cible, $maj);
@ -148,6 +152,7 @@ function menus_vider_tables($nom_meta_version_base) {
// On efface les tables du plugin
sql_drop_table('spip_menus');
sql_drop_table('spip_menus_entrees');
sql_drop_table('spip_menus_liens');
// On efface la version enregistrée
effacer_meta($nom_meta_version_base);

53
menus_pipelines.php

@ -32,3 +32,56 @@ function menus_declarer_url_objets($array) {
$array[] = 'menu';
return $array;
}
/**
* Ajout de contenu sur certaines pages,
* notamment des formulaires de liaisons entre objets
*
* @pipeline affiche_milieu
* @param array $flux Données du pipeline
* @return array Données du pipeline
*/
function menus_affiche_milieu($flux) {
$texte = '';
$e = trouver_objet_exec($flux['args']['exec']);
include_spip('inf/config');
// Menus sur les objets configurés
if (
!$e['edition']
and in_array($e['table_objet_sql'], lire_config('menus/objets', array()))
) {
$texte .= recuperer_fond('prive/objets/editer/liens', array(
'table_source' => 'menus',
'objet' => $e['type'],
'id_objet' => $flux['args'][$e['id_table_objet']]
));
}
if ($texte) {
if ($p = strpos($flux['data'], '<!--affiche_milieu-->')) {
$flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
} else {
$flux['data'] .= $texte;
}
}
return $flux;
}
/**
* Optimiser la base de données
*
* Supprime les liens orphelins de l'objet vers quelqu'un et de quelqu'un vers l'objet.
*
* @pipeline optimiser_base_disparus
* @param array $flux Données du pipeline
* @return array Données du pipeline
*/
function menus_optimiser_base_disparus($flux) {
include_spip('action/editer_liens');
$flux['data'] += objet_optimiser_liens(array('menu'=>'*'), '*');
return $flux;
}

11
paquet.xml

@ -1,12 +1,12 @@
<paquet
prefix="menus"
categorie="navigation"
version="1.6.14"
version="1.7.0"
etat="stable"
compatibilite="[3.0.0;3.2.*]"
logo="prive/themes/spip/images/menu-32.png"
documentation="https://contrib.spip.net/Menus-3139"
schema="0.5.4"
schema="0.5.5"
>
<nom>Menus</nom>
@ -16,8 +16,11 @@
<traduire module="menus" reference="fr" gestionnaire="salvatore" />
<pipeline nom="declarer_tables_principales" inclure="base/menus_tables.php" />
<menu nom="configurer_ndk_squelettes" titre="ndk_squelettes:cfg_titre_menu" parent="menu_squelette" icone="images/config-16.png" />
<pipeline nom="declarer_tables_objets_sql" inclure="base/menus_tables.php" />
<pipeline nom="declarer_tables_interfaces" inclure="base/menus_tables.php" />
<pipeline nom="declarer_tables_auxiliaires" inclure="base/menus_tables.php" />
<pipeline nom="header_prive" inclure="menus_pipelines.php" />
<pipeline nom="pre_boucle" inclure="menus_pipelines.php" />
<pipeline nom="menus_lister_disponibles" inclure="menus_pipelines.php" />
@ -25,6 +28,8 @@
<pipeline nom="autoriser" inclure="inc/menus_autoriser.php" />
<pipeline nom="ieconfig" inclure="menus_ieconfig.php" />
<pipeline nom="ieconfig_metas" inclure="menus_ieconfig.php" />
<pipeline nom="affiche_milieu" inclure="menus_pipelines.php" />
<pipeline nom="optimiser_base_disparus" inclure="menus_pipelines.php" />
<!-- Déclaration des pipelines du plugin -->
<pipeline nom="menus_utiles" action="" />

16
prive/objets/infos/menus_tous.html

@ -0,0 +1,16 @@
<BOUCLE_menu(MENUS){id_menu=#ENV{id}}>
<div class="infos">
[(#SET{texte_objet,<:menu:titre_menu:>})]
<div class="numero"><:titre_cadre_numero_objet{objet=#GET{texte_objet}}:><p>#ID_MENU</p></div>
<div class='nb_elements'><!--nb_elements--></div>
[(#AUTORISER{supprimer, menu, #ID_MENU}|oui)
[(#BOUTON_ACTION{
[(#CHEMIN_IMAGE{menu-del-24.png}|balise_img{<:menu:supprimer_menu:>}|concat{' ',#VAL{<:menu:supprimer_menu:>}|wrap{<b>}}|trim)],
#URL_ACTION_AUTEUR{supprimer_menu, #ID_MENU, #URL_ECRIRE{menus}},
icone s24 horizontale danger menu-del-24, <:menu:confirmer_supprimer_menu:>})]
]
</div>
</BOUCLE_menu>

45
prive/objets/liste/menus.html

@ -0,0 +1,45 @@
[(#SET{defaut_tri,#ARRAY{
multi titre,1,
titre,1,
identifiant,1,
id_menu,1
}})
]
#SET{debut,#ENV{debutmenl,#EVAL{_request("debutmenl");}}}
<B_liste_menus>
[(#REM) En cas de pagination indirecte @32, il faut refaire le set car la boucle
a mis a jour la valeur avec la page reelle]
#SET{debut,#ENV{debutmenl,#EVAL{_request("debutmenl");}}}
#ANCRE_PAGINATION
<div class="liste-objets menus">
<table class="spip liste">
[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{menus:info_1_menu,menus:info_nb_menus}})</strong></caption>]
<thead>
<tr class="first_row">
<th class="titre" scope="col">[(#TRI{multi titre,<:menus:formulaire_titre:>,ajax})]</th>
<th class="titre" scope="col">[(#TRI{identifiant,<:menus:formulaire_identifiant:>,ajax})]</th>
<th class="action" scope="col"></th>
<th class="id" scope="col">[(#TRI{id_menu,#,ajax})]</th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_menus(MENUS){id_menu?}{identifiant?}{where?}
{tri #ENV{par,multi titre},#GET{defaut_tri}}{pagination #ENV{nb,10} menl}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})][ (#EXPOSE|unique)][ (#TITRE**|extraire_multi|initiale|=={#ENV{i}}|?{on}|unique)][(#ID_MENU|=={#ENV{id_lien_ajoute}}|oui)append]">
<td class="titre principal">[(#LOGO_MENU|image_reduire{20,20})]<a href="[(#URL_ECRIRE{menu_edit,id_menu=#ID_MENU})]">#TITRE</a></td>
<td class="identifiant secondaire">#IDENTIFIANT</td>
<td class="action">
[(#URL_ECRIRE{menu_edit,id_menu=#ID_MENU}|icone_horizontale{<:menus:editer_menus_editer:>,menu-24,edit})]
</td>
<td class="id"><a href="[(#URL_ECRIRE{menu_edit,id_menu=#ID_MENU})]">#ID_MENU</a></td>
</tr>
</BOUCLE_liste_menus>
</tbody>
</table>
[<p class="pagination">(#PAGINATION{prive})</p>]
</div>
</B_liste_menus>
<div class="liste-objets liste-objets-lies menus caption-wrap">
<strong class="caption">[(#ENV*{titre,<:menus:info_aucun_menu:>})]</strong>
</div>
<//B_liste_menus>

72
prive/objets/liste/menus_associer.html

@ -0,0 +1,72 @@
[(#SET{defaut_tri,#ARRAY{
multi titre,1,
identifiant,1,
id_menu,1
}})
]
#SET{exclus,#ENV**{exclus,#ENV{objet_source}|lister_objets_lies{#ENV{objet},#ENV{id_objet},#ENV{_objet_lien}}}}
#SET{debut,#ENV{debutmena,#EVAL{_request("debutmena");}}}
<B_liste_menus>
[(#REM) En cas de pagination indirecte @32, il faut refaire le set car la boucle
a mis a jour la valeur avec la page reelle]
#SET{debut,#ENV{debutmena,#EVAL{_request("debutmena");}}}
#SET{afficher_lettres,#TRI|=={'multi titre'}|oui}
#ANCRE_PAGINATION
<div class="liste-objets liste-objets-associer menus">
<table class="spip liste">
[<caption><span class="caption"><strong>(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{menus:info_1_menu,menus:info_nb_menus}})</strong>
<span class="recherche">
<label for="recherche-#ENV{id}"><:info_rechercher_02:></label>
<input type="text" class="recherche" name="recherche" id="recherche-#ENV{id}" value="#ENV{recherche}" />
<input type="submit" class="tout_voir" name="tout_voir" value="<:info_tout_afficher:>" />
</span>
</span>
</caption>]
<thead>
#SET{p,''}
<BOUCLE_lettre(MENUS){tout}{!id_menu IN #GET{exclus}}{where?}{recherche?}
{tri #ENV{par,multi titre},#GET{defaut_tri}}{id_menu==#GET{afficher_lettres}|?{'.*','A'}}>[
(#TITRE**|extraire_multi|initiale|unique|oui)
[(#SET{p,#GET{p}|concat{
#SELF|parametre_url{debutmena,@#ID_MENU}|ancre_url{paginationmena}|afficher_initiale{#TITRE**|extraire_multi|initiale{},#COMPTEUR_BOUCLE,#GET{debut},#ENV{nb,10}}
}})]
]#SAUTER{#ENV{nb,10}|moins{#COMPTEUR_BOUCLE|=={1}|?{2,1}}}</BOUCLE_lettre>[
(#SET{p,
#GET{p}|concat{
#REM|afficher_initiale{#REM,#TOTAL_BOUCLE,#GET{debut},#ENV{nb,10}}
}
})]</B_lettre>
[<tr><td colspan="3"><p class="pagination">(#GET{p})</p></td></tr>]
<tr class="first_row">
<th class="titre" scope="col">[(#TRI{multi titre,<:menus:formulaire_titre:>,ajax})]</th>
<th class="identifiant" scope="col">[(#TRI{identifiant,<:menus:formulaire_identifiant:>,ajax})]</th>
<th class="action" scope="col"></th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_menus(MENUS){!id_menu IN #GET{exclus}}{where?}{recherche?}
{tri #ENV{par,multi titre},#GET{defaut_tri}}{pagination #ENV{nb,10} mena}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})][ (#EXPOSE|unique)][ (#TITRE**|extraire_multi|initiale|=={#ENV{i}}|?{on}|unique)]">
<td class="titre">[(#LOGO_MENU|image_reduire{20,20})]<a href="[(#URL_ECRIRE{menu_edit,id_menu=#ID_MENU})]">#TITRE</a></td>
<td class="identifiant secondaire">#IDENTIFIANT</td>
<td class="action">
<button type="submit" class="button link add" name="ajouter_lien\[menu-#ID_MENU-#OBJET-#ID_OBJET\]" value="+"><:menu:ajouter_lien_menu:> [(#CHEMIN_IMAGE{ajouter-12.png}|balise_img{'+'})]</button>
</td>
</tr>
</BOUCLE_liste_menus>
</tbody>
</table>
[<p class="pagination">(#PAGINATION{prive})</p>]
</div>
</B_liste_menus>[(#ENV{recherche}|oui)
<div class="liste-objets liste-objets-associer menus caption-wrap">
<span class="caption"><strong>[(#VAL{info_recherche_auteur_zero}|_T{#ARRAY{cherche_auteur,#ENV{recherche}}})]</strong>
<span class="recherche">
<label for="recherche-#ENV{id}"><:info_rechercher_02:></label>
<input type="text" class="recherche" name="recherche" id="recherche-#ENV{id}" value="#ENV{recherche}" />
<input type="submit" class="tout_voir" name="tout_voir" value="<:info_tout_afficher:>" />
</span>
</span>
</div>
]<//B_liste_menus>

18
prive/objets/liste/menus_associer_fonctions.php

@ -0,0 +1,18 @@
<?php
/**
* Fonctions du squelette associé
*
* @plugin Menus
* @copyright 2018
* @author charles
* @licence GNU/GPL
* @package SPIP\Menus\Fonctions
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// pour initiale et afficher_initiale
include_spip('prive/objets/liste/auteurs_fonctions');

60
prive/objets/liste/menus_lies.html

@ -0,0 +1,60 @@
[(#SET{defaut_tri,#ARRAY{
multi titre,1,
identifiant,1,
id_menu,1
}})
]
#SET{selection,#ENV**{selection,#ENV{objet_source}|lister_objets_lies{#ENV{objet},#ENV{id_objet},#ENV{_objet_lien}}}}
#SET{debut,#ENV{debutmenl,#EVAL{_request("debutmenl");}}}
<B_liste_menus>
[(#REM) En cas de pagination indirecte @32, il faut refaire le set car la boucle
a mis a jour la valeur avec la page reelle]
#SET{debut,#ENV{debutmenl,#EVAL{_request("debutmenl");}}}
#SET{afficher_lettres,#TRI|=={'multi titre'}|oui}
#ANCRE_PAGINATION
<div class="liste-objets liste-objets-lies menus">
<table class="spip liste">
[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{menus:info_1_menu,menus:info_nb_menus}})</strong></caption>]
<thead>
#SET{p,''}
<BOUCLE_lettre(MENUS){tout}{id_menu IN #GET{selection}}{where?}
{tri #ENV{par,multi titre},#GET{defaut_tri}}{id_menu==#GET{afficher_lettres}|?{'.*','A'}}>[
(#TITRE**|extraire_multi|initiale|unique|oui)
[(#SET{p,#GET{p}|concat{
#SELF|parametre_url{debutmenl,@#ID_MENU}|ancre_url{paginationmenl}|afficher_initiale{#TITRE**|extraire_multi|initiale{},#COMPTEUR_BOUCLE,#GET{debut},#ENV{nb,10}}
}})]
]#SAUTER{#ENV{nb,10}|moins{#COMPTEUR_BOUCLE|=={1}|?{2,1}}}</BOUCLE_lettre>[
(#SET{p,
#GET{p}|concat{
#REM|afficher_initiale{#REM,#TOTAL_BOUCLE,#GET{debut},#ENV{nb,10}}
}
})]</B_lettre>
[<tr><td colspan="4"><p class="pagination">(#GET{p})</p></td></tr>]
<tr class="first_row">
<th class="titre" scope="col">[(#TRI{multi titre,<:menus:formulaire_titre:>,ajax})]</th>
<th class="action" scope="col"></th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_menus(MENUS){id_menu IN #GET{selection}}
{tri #ENV{par,multi titre},#GET{defaut_tri}}{pagination #ENV{nb,10} menl}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})][ (#EXPOSE|unique)][ (#TITRE**|extraire_multi|initiale|=={#ENV{i}}|?{on}|unique)][(#ID_MENU|=={#ENV{id_lien_ajoute}}|oui)append]">
<td class="titre">[(#LOGO_MENU|image_reduire{20,20})]<a href="[(#URL_ECRIRE{menu_edit,id_menu=#ID_MENU})]">#TITRE</a></td>
<td class="action">
[(#ENV{editable}|oui)
<button type="submit" class="button link delete" name="supprimer_lien\[menu-#ID_MENU-#OBJET-#ID_OBJET\]" value="X"><:menu:retirer_lien_menu:> [(#CHEMIN_IMAGE{supprimer-12.png}|balise_img{'X'})]</button>
]
</td>
</tr>
</BOUCLE_liste_menus>
</tbody>
</table>
[<p class="pagination">(#PAGINATION{prive})</p>]
[(#GRAND_TOTAL|>{3}|oui)<div class="action"><button type="submit" class="button link" name="supprimer_lien\[menu-*-#OBJET-#ID_OBJET\]" value="X"><:menu:retirer_tous_liens_menus:> [(#CHEMIN_IMAGE{supprimer-8.png}|balise_img{'X'})]</button></div>]
</div>
</B_liste_menus>
<div class="liste-objets liste-objets-lies menus caption-wrap">
<strong class="caption">[(#ENV*{titre,<:menu:info_aucun_menu:>})]</strong>
</div>
<//B_liste_menus>

17
prive/objets/liste/menus_lies_fonctions.php

@ -0,0 +1,17 @@
<?php
/**
* Fonctions du squelette associé
*
* @plugin Menus
* @copyright 2018
* @author charles
* @licence GNU/GPL
* @package SPIP\Menus\Fonctions
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// pour initiale et afficher_initiale
include_spip('prive/objets/liste/auteurs_fonctions');

8
prive/squelettes/contenu/menus_editer.html → prive/squelettes/contenu/menu_edit.html

@ -1,17 +1,17 @@
<div class="cadre-formulaire-editer">
<div class="entete-formulaire">
[(#URL_ECRIRE{menus_tous}|icone_verticale{<:retour:>,menus-24,'',left})]
[(#ENV{redirect,#URL_ECRIRE{menus_tous}}|icone_verticale{<:retour:>,menus-24,'',left})]
<:menus:formulaire_modifier_menu:>
<h1>
<BOUCLE_menu(MENUS){id_menu=#VAL{id_menu}|_request}>
#TITRE
</BOUCLE_menu>
[(#ENV{nouveau}|=={oui}|?{<:menus:formulaire_nouveau:>,#VAL{id_menu}|_request})]
[(#ENV{id_menu}|=={new}|?{<:menus:formulaire_nouveau:>,#VAL{id_menu}|_request})]
<//B_menu>
</h1>
</div>
#FORMULAIRE_EDITER_MENU{#ENV{id_menu,0}, #ENV{nouveau,''}}
#FORMULAIRE_EDITER_MENU{#ENV{id_menu,''},#ENV{redirect},#ENV{associer_objet}}
[(#ENV{id_menu,0}|intval|oui)
<div class="ajax">#FORMULAIRE_EDITER_MENUS_ENTREE{#ENV{id_menu}}</div>
]
@ -22,4 +22,4 @@
[<div class="actions">
(#URL_ACTION_AUTEUR{supprimer_menu,#ENV{id_menu},#URL_ECRIRE{menus_tous}}|icone_verticale{<:menus:formulaire_supprimer_menu:>,menus-24.png,del})
</div>]
]
]

9
prive/squelettes/contenu/menus_tous.html

@ -4,18 +4,19 @@
<B_menus_principaux>
<ul class="liste_items">
<BOUCLE_menus_principaux(MENUS){par titre}>
<BOUCLE_menus_principaux(MENUS){par titre}{si #GET{old}}>
<li class="item">#SET{auth,#AUTORISER{modifier,menu,#ID_MENU}}
[(#GET{auth}|oui)<a href="[(#URL_ECRIRE{menus_editer,id_menu=#ID_MENU})]">]#TITRE (#IDENTIFIANT)[(#GET{auth}|oui)</a>]
[(#GET{auth}|oui)<a href="[(#URL_ECRIRE{menu_edit,id_menu=#ID_MENU})]">]#TITRE (#IDENTIFIANT)[(#GET{auth}|oui)</a>]
<p class="actions">
[(#AUTORISER{modifier,menu,#ID_MENU}) <span class="lien_modifier">&#91;<a href="[(#URL_ECRIRE{menus_editer,id_menu=#ID_MENU})]"><:menus:editer_menus_editer:></a>&#93;</span>]
[(#AUTORISER{modifier,menu,#ID_MENU}) <span class="lien_modifier">&#91;<a href="[(#URL_ECRIRE{menu_edit,id_menu=#ID_MENU})]"><:menus:editer_menus_editer:></a>&#93;</span>]
</p>
</li>
</BOUCLE_menus_principaux>
</ul>
</B_menus_principaux>
<INCLURE{fond=prive/objets/liste/menus}, env />
[(#URL_ECRIRE{menus_editer}|parametre_url{nouveau,oui}|icone_verticale{<:menus:editer_menus_nouveau:>,menus-24.png,new,right})]
[(#URL_ECRIRE{menu_edit}|parametre_url{new,oui}|icone_verticale{<:menus:editer_menus_nouveau:>,menus-24.png,new,right})]
<div class="nettoyeur"></div>

33
prive/squelettes/navigation/menu_edit.html

@ -0,0 +1,33 @@
[(#ENV{id_menu,0}|intval|oui)
[(#BOITE_OUVRIR{'','info'})]
<div class="infos">
<div class="numero">
<:menus:info_numero_menu:>
<p>[(#ENV{id_menu})]</p>
</div>
[(#VAL{redirect}
|generer_url_action{type=menu&id=#ENV{id_menu}}
|parametre_url{var_mode,calcul}
|icone_horizontale{<:icone_voir_en_ligne:>,racine})]
[(#PLUGIN{yaml}|oui)
[(#URL_ACTION_AUTEUR{exporter_menu,#ENV{id_menu}}
|icone_horizontale{<:menus:editer_menus_exporter:>,menu-export-24.png})]
]
</div>
#BOITE_FERMER
]
<B_liens>
[(#BOITE_OUVRIR{[(#TOTAL_BOUCLE|singulier_ou_pluriel{medias:une_utilisation,medias:des_utilisations})], 'menu utilisations simple'})]
<ul class='liste_items'>
<BOUCLE_liens(menus_liens){id_menu}>
<li class='item #OBJET'>[(#CHEMIN_IMAGE{#OBJET|objet_info{icone_objet}|concat{-16.png}}|balise_img) ][(#ID_OBJET|generer_lien_entite{#OBJET})]
[(#AUTORISER{dissociermenus,#OBJET,#ID_OBJET}|oui)
[(#BOUTON_ACTION{<:menus:retirer_lien_objet:>,[(#URL_ACTION_AUTEUR{dissocier_menu,#ID_OBJET-#OBJET-#ID_MENU,#SELF})],ajax,'',''})]
]
</li>
</BOUCLE_liens>
</ul>
#BOITE_FERMER
</B_liens>
Loading…
Cancel
Save