diff --git a/action/dupliquer_objet.php b/action/dupliquer_objet.php
index c860061..df599cd 100644
--- a/action/dupliquer_objet.php
+++ b/action/dupliquer_objet.php
@@ -32,23 +32,32 @@ function action_dupliquer_objet_dist($objet = null, $id_objet = null) {
if ($objet and $id_objet) {
include_spip('inc/config');
include_spip('base/objets');
- $table_objet = table_objet($objet);
+ $config = lire_config('duplicator', array());
+ $objet = objet_type($objet); // assurance
$modifications = array();
$options = array();
// S'il y a des champs précis à dupliquer pour cet objet, on rajoute aux options
- if ($champs = lire_config("duplicator/$table_objet/champs", array())) {
+ if (isset($config[$objet]['champs']) and $champs = $config[$objet]['champs']) {
$options['champs'] = $champs;
}
- // S'il y a un statut forcé
- if ($statut = lire_config("duplicator/$table_objet/statut", null)) {
+ // S'il y a un statut forcé pour cet objet
+ if (isset($config[$objet]['statut']) and $statut = $config[$objet]['statut']) {
$modifications['statut'] = $statut;
}
// Si on demande à dupliquer aussi les enfants
if ($enfants) {
$options['dupliquer_enfants'] = true;
+
+ // On cherche si seulement certains enfants sont acceptés à dupliquer pour cet objet
+ if (isset($config[$objet]['enfants']) and $enfants = $config[$objet]['enfants']) {
+ $options['enfants'] = array_map('objet_type', $config[$objet]['enfants']);
+ }
+
+ // Dans ce cas on passe aussi le tableau de toutes les options, avec "champs" et "enfants" qui seront pris en compte
+ $options['options_objets'] = $config;
}
// Si on a réussi à dupliquer
@@ -85,9 +94,13 @@ function action_dupliquer_objet_dist($objet = null, $id_objet = null) {
* - champs : liste des champs à dupliquer, sinon * par défaut
* - ajout_titre : ajouter une chaine à la fin du titre
* - dupliquer_liens : booléen précisant si on duplique les liens ou pas, par défaut oui
- * - dupliquer_enfants : booléen précisant si on duplique les enfants ou pas, par défaut non
* - liens : liste d'objets liables dont on veut dupliquer les liens
* - liens_exclus : liste d'objets liables dont on ne veut pas dupliquer les liens
+ * - dupliquer_enfants : booléen précisant si on duplique les enfants ou pas, par défaut non
+ * - enfants : liste d'objets d'enfants acceptés pour la duplication en cascade
+ * - options_objets : tableau indexé par objet, avec pour chacun un tableau des options précédentes
+ * Cela permet de passer en cascade aux enfants certaines options qui ne sont pas forcément les mêmes que dans l'appel de départ
+ * 'article' => array('champs'=>array(…), 'enfants'=>array(…))
* @return int
* Retourne l'identifiant du duplicata
*/
@@ -168,8 +181,18 @@ function objet_dupliquer($objet, $id_objet, $modifications=array(), $options=arr
and include_spip('base/objets_parents')
and $enfants_methodes = type_objet_info_enfants($objet)
and $enfants = objet_trouver_enfants($objet, $id_objet)
+ // S'il n'y a pas de config d'enfants alors tous, sinon seulement les enfants autorisés
+ and (
+ !isset($options['enfants'])
+ or $options['enfants'] == 'tous'
+ or (
+ $enfants_autorises = ($options['enfants'] ? $options['enfants'] : array())
+ and $enfants_autorises = array_flip(array_map('objet_type', $enfants_autorises))
+ and $enfants = array_intersect_key($enfants, $enfants_autorises)
+ )
+ )
) {
- // On parcourt tous les types d'enfants
+ // On parcourt tous les types d'enfants autorisés
foreach ($enfants as $objet_enfant => $ids) {
if (is_array($ids)) {
foreach ($ids as $id_enfant) {
@@ -180,6 +203,11 @@ function objet_dupliquer($objet, $id_objet, $modifications=array(), $options=arr
unset($options_enfant['champs']);
unset($options_enfant['ajout_titre']);
+ // S'il existe des options d'objets, on utilise
+ if (isset($options['options_objets'][$objet_enfant])) {
+ $options_enfant = array_merge($options_enfant, $options['options_objets'][$objet_enfant]);
+ }
+
// Les modifications nécessaires pour mettre le bon parent suivant la méthode
if (isset($enfants_methodes[$objet_enfant]['champ'])) {
$modifications_enfant[$enfants_methodes[$objet_enfant]['champ']] = $id_objet_duplicata;
diff --git a/duplicator_administrations.php b/duplicator_administrations.php
index d09e72d..163b13e 100644
--- a/duplicator_administrations.php
+++ b/duplicator_administrations.php
@@ -62,22 +62,22 @@ function duplicator_maj_1_0_0() {
if (isset($config['rub_champs']) and $champs = $config['rub_champs']) {
$champs = explode(',', $champs);
$champs = array_map('trim', $champs);
- $nouvelle_config['rubriques']['champs'] = $champs;
+ $nouvelle_config['rubrique']['champs'] = $champs;
}
if (isset($config['art_champs']) and $champs = $config['art_champs']) {
$champs = explode(',', $champs);
$champs = array_map('trim', $champs);
- $nouvelle_config['articles']['champs'] = $champs;
+ $nouvelle_config['article']['champs'] = $champs;
}
// Config des autorisations : non on prend par défaut plutôt, qui n'existait pas avant, donc ça on ne le migre pas
// Config du statut
if (isset($config['duplic_article_etat_pub']) and $config['duplic_article_etat_pub'] == 'oui') {
- $nouvelle_config['articles']['statut'] = '';
+ $nouvelle_config['article']['statut'] = '';
}
else {
- $nouvelle_config['articles']['statut'] = 'prepa';
+ $nouvelle_config['article']['statut'] = 'prepa';
}
// Et on enregistre
diff --git a/duplicator_pipelines.php b/duplicator_pipelines.php
index a8fc78f..ab64edd 100755
--- a/duplicator_pipelines.php
+++ b/duplicator_pipelines.php
@@ -46,27 +46,5 @@ function duplicator_boite_infos($flux){
}
}
- //~ if(autoriser("dupliquer", "rubrique")){
- //~ if (($id = intval($flux['args']['id'])) && ($type=='rubrique')){
- //~ $contexte = array('id_objet'=>$id,'objet'=>$type);
- //~ $flux["data"] .= recuperer_fond("noisettes/bouton_duplicator", $contexte);
- //~ }
- //~ }
-
- //~ if(autoriser("dupliquer", "article")){
- //~ if (($id = intval($flux['args']['id'])) && ($type=='article')){
- //~ $contexte = array('id_objet'=>$id,'objet'=>$type);
- //~ $flux["data"] .= recuperer_fond("noisettes/bouton_duplicator", $contexte);
- //~ }
- //~ }
-
return $flux;
}
-
-function duplicator_jqueryui_plugins($plugins){
- if (test_espace_prive()){
- $plugins[] = "jquery.ui.dialog";
- }
-
- return $plugins;
-}
diff --git a/formulaires/configurer_duplicator.php b/formulaires/configurer_duplicator.php
index 84a730d..cfbbde3 100644
--- a/formulaires/configurer_duplicator.php
+++ b/formulaires/configurer_duplicator.php
@@ -39,13 +39,12 @@ function formulaires_configurer_duplicator_saisies_dist() {
// On boucle sur tous les objets possibles
foreach ($declaration_objets as $table_objet_sql=>$declaration_objet) {
- $table_objet = table_objet($table_objet_sql);
- $objet = objet_type($table_objet);
+ $objet = objet_type($table_objet_sql);
$groupe_objet = array(
'saisie' => 'fieldset',
'options' => array(
- 'nom' => "groupe_$table_objet",
+ 'nom' => "groupe_$objet",
'label' => _T($declaration_objet['texte_objets']),
'pliable' => 'oui',
'plie' => 'oui',
@@ -66,19 +65,19 @@ function formulaires_configurer_duplicator_saisies_dist() {
$groupe_objet['saisies'][] = array(
'saisie' => 'case',
'options' => array(
- 'nom' => "${table_objet}[personnaliser_champs]",
+ 'nom' => "${objet}[personnaliser_champs]",
'label_case' => _T('duplicator:configurer_personnaliser_champs_label'),
- 'valeur_forcee' => (isset($config[$table_objet]['champs']) and $config[$table_objet]['champs']) ? 'on' : '',
+ 'valeur_forcee' => (isset($config[$objet]['champs']) and $config[$objet]['champs']) ? 'on' : '',
),
);
$groupe_objet['saisies'][] = array(
'saisie' => 'checkbox',
'options' => array(
- 'nom' => "${table_objet}[champs]",
+ 'nom' => "${objet}[champs]",
'label' => _T('duplicator:configurer_champs_label'),
'data' => $champs,
- 'defaut' => isset($config[$table_objet]['champs']) ? $config[$table_objet]['champs'] : array(),
- 'afficher_si' => "@${table_objet}[personnaliser_champs]@ == 'on'",
+ 'defaut' => isset($config[$objet]['champs']) ? $config[$objet]['champs'] : array(),
+ 'afficher_si' => "@${objet}[personnaliser_champs]@ == 'on'",
),
);
}
@@ -91,11 +90,11 @@ function formulaires_configurer_duplicator_saisies_dist() {
$groupe_objet['saisies'][] = array(
'saisie' => 'selection',
'options' => array(
- 'nom' => "${table_objet}[statut]",
+ 'nom' => "${objet}[statut]",
'label' => _T('duplicator:configurer_statut_label'),
'option_intro' => _T('duplicator:configurer_statut_option_intro'),
'data' => $statuts,
- 'defaut' => isset($config[$table_objet]['statut']) ? $config[$table_objet]['statut'] : '',
+ 'defaut' => isset($config[$objet]['statut']) ? $config[$objet]['statut'] : '',
),
);
}
@@ -104,7 +103,7 @@ function formulaires_configurer_duplicator_saisies_dist() {
$groupe_objet['saisies'][] = array(
'saisie' => 'selection',
'options' => array(
- 'nom' => "${table_objet}[autorisation]",
+ 'nom' => "${objet}[autorisation]",
'label' => _T('duplicator:configurer_autorisation_label'),
'option_intro' => _T('duplicator:configurer_autorisation_option_intro'),
'data' => array(
@@ -112,7 +111,7 @@ function formulaires_configurer_duplicator_saisies_dist() {
'administrateur' => _T('duplicator:configurer_autorisation_choix_administrateur'),
'redacteur' => _T('duplicator:configurer_autorisation_choix_redacteur'),
),
- 'defaut' => isset($config[$table_objet]['autorisation']) ? $config[$table_objet]['autorisation'] : '',
+ 'defaut' => isset($config[$objet]['autorisation']) ? $config[$objet]['autorisation'] : '',
),
);
@@ -124,19 +123,19 @@ function formulaires_configurer_duplicator_saisies_dist() {
$groupe_objet['saisies'][] = array(
'saisie' => 'case',
'options' => array(
- 'nom' => "${table_objet}[personnaliser_enfants]",
+ 'nom' => "${objet}[personnaliser_enfants]",
'label_case' => _T('duplicator:configurer_personnaliser_enfants_label'),
- 'valeur_forcee' => (isset($config[$table_objet]['objets_enfants']) and $config[$table_objet]['objets_enfants']) ? 'on' : '',
+ 'defaut' => isset($config[$objet]['personnaliser_enfants']) ? $config[$objet]['personnaliser_enfants'] : '',
),
);
$groupe_objet['saisies'][] = array(
'saisie' => 'choisir_objets',
'options' => array(
- 'nom' => "${table_objet}[objets_enfants]",
+ 'nom' => "${objet}[enfants]",
'exclus' => $enfants_exclus,
- 'label' => _T('duplicator:configurer_objets_enfants_label'),
- 'defaut' => isset($config[$table_objet]['objets_enfants']) ? $config[$table_objet]['objets_enfants'] : array(),
- 'afficher_si' => "@${table_objet}[personnaliser_enfants]@ == 'on'",
+ 'label' => _T('duplicator:configurer_enfants_label'),
+ 'defaut' => isset($config[$objet]['enfants']) ? $config[$objet]['enfants'] : array(),
+ 'afficher_si' => "@${objet}[personnaliser_enfants]@ == 'on'",
),
);
}
@@ -153,8 +152,8 @@ function formulaires_configurer_duplicator_verifier_dist() {
// Pour chaque type d'objets
$declaration_objets = lister_tables_objets_sql();
foreach ($declaration_objets as $table_objet_sql=>$declaration_objet) {
- $table_objet = table_objet($table_objet_sql);
- $config_objet = _request($table_objet);
+ $objet = objet_type($table_objet_sql);
+ $config_objet = _request($objet);
// Si on a décoché la personnalisation des champs, on vide la config des champs
if (!$config_objet['personnaliser_champs']) {
@@ -163,11 +162,15 @@ function formulaires_configurer_duplicator_verifier_dist() {
// Si on a décoché la personnalisation des enfants, on vide la config des enfants
if (!$config_objet['personnaliser_enfants']) {
- unset($config_objet['objets_enfants']);
+ $config_objet['enfants'] = 'tous';
+ }
+ else {
+ // Le hidden pourri dans la saisie inc-choisir-enfants qu'il faut virer
+ $config_objet['enfants'] = array_filter($config_objet['enfants']);
}
// On remet dans la course
- set_request($table_objet, $config_objet);
+ set_request($objet, $config_objet);
}
return array();
diff --git a/lang/duplicator_fr.php b/lang/duplicator_fr.php
index b0ac339..655c148 100755
--- a/lang/duplicator_fr.php
+++ b/lang/duplicator_fr.php
@@ -23,8 +23,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'configurer_autorisation_label' => 'Autorisation minimale',
'configurer_autorisation_option_intro' => 'Autorisation par défaut',
'configurer_champs_label' => 'Champs à dupliquer',
+ 'configurer_enfants_label' => 'Quels contenus enfants seront dupliqués ?',
'configurer_explication_objets_texte' => 'Même si seulement les contenus ci-dessus seront proposés dans l’interface, tous les types de contenus peuvent potentiellement être dupliqués s’ils sont enfants d’autres contenus. On permet donc de configurer en permanence l’ensemble des types de contenus, et non seulement ceux choisis pour les boutons.',
- 'configurer_objets_enfants_label' => 'Quels contenus enfants seront dupliqués ?',
'configurer_objets_explication' => 'Le plugin va ajouter des boutons sur la page d’admin de ces contenus pour permettre de les dupliquer et parfois de dupliquer aussi leurs enfants s’il y en a.',
'configurer_objets_label' => 'Contenus à dupliquer dans l’interface',
'configurer_personnaliser_champs_label' => 'Personnaliser les champs à dupliquer pour ces contenus',
diff --git a/paquet.xml b/paquet.xml
index 4d486a9..539cdea 100755
--- a/paquet.xml
+++ b/paquet.xml
@@ -21,7 +21,6 @@
-