Reprise complète du code :

- nettoyage et optimisation de la partie config
- amélioration de la gestion de la boîte info
- gestion de la confirmation par modale
- suppression des vieilles fonctions (on est en SPIP3 maintenant)
- correction des LANG
- ajout de logs dans logs/duplicator

Je sais pas pourquoi les redirect déconnent pour l'instant, après l'action, mais on verra plus tard.
v1
xdjuj@apsulis.com 11 years ago
parent 062dd28113
commit 105f3b3a6b

15
.gitattributes vendored

@ -1,19 +1,12 @@
* text=auto !eol
/a_faire.txt -text
action/dupliquer.php -text
action/duplicator.php -text
/duplicator_options.php -text
/duplicator_pipeline.php -text
formulaires/configurer_duplicator.html -text
formulaires/duplicator_article_confirm.html -text
formulaires/duplicator_article_confirm.php -text
formulaires/duplicator_confirm.html -text
formulaires/duplicator_confirm.php -text
images/apsulis.png -text
images/duplicator.gif -text
inclure/duplicator_article.html -text
inclure/duplicator_rubrique.html -text
lang/duplicator_fr.php -text
lang/paquet-duplicator_fr.php -text
noisettes/bouton_duplicator.html -text
/paquet.xml -text
prive/squelettes/contenu/configurer_duplicator.html -text
prive/squelettes/contenu/duplicator.html -text
prive/squelettes/contenu/duplicator_article.html -text
theme/img/duplicator.png -text

@ -0,0 +1,54 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2012 *
* 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;
include_spip('inc/charsets'); # pour le nom de fichier
/**
* Dupliquer le contenu d'un objet
*
* @param null $id_objet
* @return void
*/
function action_duplicator_dist($args=null) {
if (is_null($args)){
$securiser_action = charger_fonction('securiser_action', 'inc');
$args = $securiser_action();
}
list($objet,$id_objet) = explode(':',$args);
if ( ($objet=="rubrique") && ($id=intval($id_objet)) ){
// On duplique la rubrique
spip_log("Duplication de la rubrique : $id.",'duplicator');
$nouvelle_rubrique = dupliquer_rubrique($id);
spip_log("Nouvelle rubrique créée : id_rubrique $nouvelle_rubrique.",'duplicator');
include_spip('inc/header');
if ($redirect = _request('redirect'))
redirige_par_entete(str_replace('&amp;','&',$redirect));
redirige_par_entete(generer_url_ecrire("rubriques","id_rubrique=".$nouvelle_rubrique, "&"));
}
if ( ($objet=="article") && ($id=intval($id_objet)) ){
// On duplique l article
$rub = sql_getfetsel('id_rubrique', 'spip_articles', 'id_article='. $id);
spip_log("Duplication de l'article : $id dans la rubrique $rub.",'duplicator');
$nouvel_article = dupliquer_article(intval($id),intval($rub));
spip_log("Nouvel article créé dans la rubrique $rub : id_article $nouvel_article.",'duplicator');
include_spip('inc/headers');
if ($redirect = _request('redirect'))
redirige_par_entete(str_replace('&amp;','&',$redirect));
redirige_par_entete(generer_url_ecrire("articles","id_article=".$nouvel_article, "&"));
}
}

@ -1,10 +1,13 @@
<?php
/***************************************************************************\
* Plugin Duplicator pour Spip 2.0
* Licence GPL (c) 2010 - Apsulis
* Duplication de rubriques et d'articles
* Plugin Vider Rubrique pour Spip 3.0
* Licence GPL (c) 2012 - Apsulis
* Suppression de tout le contenu d'une rubrique
*
\***************************************************************************/
function trim_value(&$value){$value = trim($value);}
/**
@ -27,7 +30,7 @@ function dupliquer_article($article,$rubrique){
);
$infos = sql_allfetsel($champs, $from, $where);
// On choisi les champs que l'on veut conserver
$champs_dupliques = explode(",", lire_config('duplicator/art_champs'));
$champs_dupliques = explode(",", lire_config('duplicator/config/art_champs'));
array_walk($champs_dupliques, 'trim_value');
if (empty($champs_dupliques)) $champs_dupliques = array(
@ -88,7 +91,7 @@ function dupliquer_rubrique($rubrique,$cible=null,$titre=' (copie)'){
include_spip('action/editer_rubrique');
include_spip('inc/config');
// On lit la rubrique qui va etre dupliqué
// On lit la rubrique qui va etre dupliquée
$champs = array('*');
$from = 'spip_rubriques';
$where = array(
@ -96,7 +99,7 @@ function dupliquer_rubrique($rubrique,$cible=null,$titre=' (copie)'){
);
$infos = sql_allfetsel($champs, $from, $where);
// On choisi les champs que l'on veut conserver
$champs_dupliques = explode(",", lire_config('duplicator/rub_champs'));
$champs_dupliques = explode(",", lire_config('duplicator/config/rub_champs'));
array_walk($champs_dupliques, 'trim_value');
if (empty($champs_dupliques)) $champs_dupliques = array(

@ -13,20 +13,19 @@ function duplicator_boite_infos($flux){
$type = $flux['args']['type'];
if(autoriser("webmestre")){
if (lire_config('duplicator/duplic_rubrique')){
if (($id = intval($flux['args']['id'])) && ($type=='rubrique')) {
$contexte = array('id_rubrique'=>$id);
$flux["data"] .= recuperer_fond("inclure/duplicator_rubrique", $contexte);
if ( (lire_config('duplicator/config/duplic_rubrique')=="oui") ){
if ( ($id = intval($flux['args']['id'])) && ($type=='rubrique') ) {
$contexte = array('id_objet'=>$id,'objet'=>$type);
$flux["data"] .= recuperer_fond("noisettes/bouton_duplicator", $contexte);
}
}
if (lire_config('duplicator/duplic_article')){
if (($id = intval($flux['args']['id'])) && ($type=='article')) {
$contexte = array('id_article'=>$id);
$flux["data"] .= recuperer_fond("inclure/duplicator_article", $contexte);
if ( (lire_config('duplicator/config/duplic_article')=="oui") ){
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;
}
?>
}

@ -9,12 +9,20 @@
#ACTION_FORMULAIRE{#ENV{action}}
<fieldset><legend><:duplicator:texte_duplicator:></legend>
<label for="sizeLimit"><:duplicator:choix_type:></label>
<p>
<input type="checkbox" name="duplic_article" [checked="(#ENV{duplic_article}|!={''}|?{'checked'})"] /> Duplication sur les articles<br />
<input type="checkbox" name="duplic_rubrique" [checked="(#ENV{duplic_rubrique}|!={''}|?{'checked'})"] /> Duplication sur les rubriques
</p>
<ul>
<li class="editer editer_facteur_filtres[ (#ENV**{erreurs}|table_valeur{facteur_filtres}|oui)erreur]">
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{facteur_smtp_secure})</span>]
<label><:duplicator:choix_type:></label>
<div class="choix">
<input type="checkbox" name="duplic_rubrique" class="checkbox" value="oui" id="duplic_rubrique"[(#ENV{duplic_rubrique,''}|=={oui}|oui)checked="checked"]/>
<label for="duplic_rubrique"><:duplicator:dupli_rub:></label>
</div>
<div class="choix">
<input type="checkbox" name="duplic_article" class="checkbox" value="oui" id="duplic_article"[(#ENV{duplic_article,''}|=={oui}|oui)checked="checked"]/>
<label for="duplic_article"><:duplicator:dupli_art:></label>
</div>
</li>
</ul>
</fieldset>
<fieldset><legend><:duplicator:choix_champs:></legend>
@ -22,21 +30,20 @@
<li>
<p class="explication"><:duplicator:aide_choix_champs:></p>
<label for="art_champs_1"><:duplicator:label_art_champs:></label>
<textarea name="art_champs" id="art_champs" cols="60" rows="10">[(#CONFIG{duplicator/art_champs})]</textarea>
<textarea name="art_champs" id="art_champs" cols="60" rows="2">[(#CONFIG{duplicator/art_champs})]</textarea>
</li>
<li>
<p class="explication"><:duplicator:aide_choix_champs:></p>
<label for="rub_champs_1"><:duplicator:label_rub_champs:></label>
<textarea name="rub_champs" id="rub_champs" cols="60" rows="10">[(#CONFIG{duplicator/rub_champs})]</textarea>
<textarea name="rub_champs" id="rub_champs" cols="60" rows="2">[(#CONFIG{duplicator/rub_champs})]</textarea>
</li>
</ul>
</fieldset>
<div>
<input type='submit' class='submit' value='<:bouton_enregistrer:>' />
</div>
<input type="hidden" name="_meta_casier" value="duplicator/config" />
<p class='boutons'><span class='image_loading'>&nbsp;</span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p>
</form>
]
</div>

@ -1,24 +0,0 @@
[<div style='color:red; text-align: center;padding:10px; border: 1px solid red; font-weight: bold'>
<p><strong>(#ENV*{message_ok}|table_valeur{message})</strong></p>
<p><a href="[(#URL_ECRIRE{article}|parametre_url{'id_article',[(#ENV*{message_ok}|table_valeur{cible})]})]" title="Rafraichir">[(#ENV*{message_ok}|table_valeur{type_retour})]</a></p>
<p><small>Utilisiez-vous SPIP Sondages ? <a href="[(#URL_ECRIRE{admin_plugin})]">Pensez à le réactiver !</a></small></p>
</div>]
[(#EDITABLE)
<div style='color:red; text-align: center;padding:10px; border: 1px solid red; font-weight: bold'>
<h2>/!\ ATTENTION /!\</h2>
[(#PLUGIN{sondages}|oui)
<p>Cette fonctionnalité n'est pas compatible avec le plugin SPIP Sondages !</p>
<p><a href="[(#URL_ECRIRE{admin_plugin})]">Vous devez le désactiver</a> le temps de réaliser votre duplication.</p>
]
[(#PLUGIN{sondages}|non)
<p>L'article et ses mots clefs seront dupliqués dans la même rubrique.</p>
<p>Cette opération ne peut être annulée.</p>
<form action="[(#ENV{action})]" method="post" accept-charset="utf-8">
#ACTION_FORMULAIRE{#ENV{action}}
<input type="submit" value="<:duplicator:message_annuler:>" name='annuler' /> <input type="submit" value="<:duplicator:message_confirmer:>" name='confirmer' />
</form>
]
</div>
]

@ -1,56 +0,0 @@
<?php
/***************************************************************************\
* Plugin Duplicator pour Spip 2.0
* Licence GPL (c) 2010 - Apsulis
* Duplication de rubriques et d'articles
*
\***************************************************************************/
function formulaires_duplicator_article_confirm_charger_dist(){
$valeurs = array();
return $valeurs;
}
function formulaires_duplicator_article_confirm_verifier_dist($article){
$erreurs = array();
if (!$article)
$erreurs['message_erreur'] = 'Une erreur est survenue.';
return $erreurs;
}
function formulaires_duplicator_article_confirm_traiter_dist($article){
if(_request('confirmer')){
include_spip('action/dupliquer');
// On duplique l article
$champs = array('id_rubrique');
$where = array(
'id_article='.$article
);
$res = sql_select($champs, "spip_articles", $where);
$r = sql_fetch($res);
$rubrique = $r['id_rubrique'];
spip_log("ID RUBRIQUE : $rubrique");
spip_log("ID ARTICLE : $article");
$nouvel_article = dupliquer_article(intval($article),intval($rubrique));
$message = array('message_ok'=>array(
'message'=>_T('duplicator:operation_executee'),
'cible'=>$nouvel_article,
'type_retour'=>_T('duplicator:operation_retour_ok_article')
));
}
if(_request('annuler')){
$message = array('message_ok'=>array(
'message'=>_T('duplicator:operation_annulee'),
'cible'=>$article,
'type_retour'=>_T('duplicator:operation_retour_ko_article')
));
}
return $message;
}

@ -1,24 +0,0 @@
[<div style='color:red; text-align: center;padding:10px; border: 1px solid red; font-weight: bold'>
<p><strong>(#ENV*{message_ok}|table_valeur{message})</strong></p>
<p><a href="[(#URL_ECRIRE{rubrique}|parametre_url{'id_rubrique',[(#ENV*{message_ok}|table_valeur{cible})]})]" title="Rafraichir">[(#ENV*{message_ok}|table_valeur{type_retour})]</a></p>
<p><small>Utilisiez-vous SPIP Sondages ? <a href="[(#URL_ECRIRE{admin_plugin})]">Pensez à le réactiver !</a></small></p>
</div>]
[(#EDITABLE)
<div style='color:red; text-align: center;padding:10px; border: 1px solid red; font-weight: bold'>
<h2>/!\ ATTENTION /!\</h2>
[(#PLUGIN{sondages}|oui)
<p>Cette fonctionnalité n'est pas compatible avec le plugin SPIP Sondages !</p>
<p><a href="[(#URL_ECRIRE{admin_plugin})]">Vous devez le désactiver</a> le temps de réaliser votre duplication.</p>
]
[(#PLUGIN{sondages}|non)
<p>Ses sous-rubriques, articles et mots clefs seront également dupliqués.</p>
<p>Cette opération ne peut être annulée.</p>
<form action="[(#ENV{action})]" method="post" accept-charset="utf-8">
#ACTION_FORMULAIRE{#ENV{action}}
<input type="submit" value="<:duplicator:message_annuler:>" name='annuler' /> <input type="submit" value="<:duplicator:message_confirmer:>" name='confirmer' />
</form>
]
</div>
]

@ -1,47 +0,0 @@
<?php
/***************************************************************************\
* Plugin Duplicator pour Spip 2.0
* Licence GPL (c) 2010 - Apsulis
* Duplication de rubriques et d'articles
*
\***************************************************************************/
function formulaires_duplicator_confirm_charger_dist(){
$valeurs = array();
return $valeurs;
}
function formulaires_duplicator_confirm_verifier_dist($rubrique){
$erreurs = array();
if (!$rubrique)
$erreurs['message_erreur'] = 'Une erreur est survenue.';
return $erreurs;
}
function formulaires_duplicator_confirm_traiter_dist($rubrique){
if(_request('confirmer')){
include_spip('action/dupliquer');
// On duplique la rubrique
$nouvelle_rubrique = dupliquer_rubrique($rubrique);
$message = array('message_ok'=>array(
'message'=>_T('duplicator:operation_executee'),
'cible'=>$nouvelle_rubrique,
'type_retour'=>_T('duplicator:operation_retour_ok')
));
}
if(_request('annuler')){
$message = array('message_ok'=>array(
'message'=>_T('duplicator:operation_annulee'),
'cible'=>$rubrique,
'type_retour'=>_T('duplicator:operation_retour_ko')
));
}
return $message;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

@ -1,2 +0,0 @@
[(#URL_ECRIRE{duplicator_article,id_objet=#ENV{id_article}}|parametre_url{type,article}|icone_horizontale{<:duplicator:icone_dupliquer_article:>,duplicator.gif})]

@ -1,2 +0,0 @@
[(#URL_ECRIRE{duplicator,id_objet=#ENV{id_rubrique}}|parametre_url{type,rubrique}|icone_horizontale{<:duplicator:icone_dupliquer:>,duplicator.gif})]

@ -11,20 +11,26 @@
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A
'aide_choix_champs' => 'Champs sql séparés par une "," .Laisser vide pour sélectionner les champs principaux.',
'aide_choix_champs' => 'Liste des noms des champs SQL s&eacute;par&eacute;s par des ","<br/><em>Laisser vide pour s&eacute;lectionner tous les champs principaux.</em>',
'action_dupliquer_article' => "Dupliquer cet article",
'action_dupliquer_rubrique' => "Dupliquer cette rubrique",
// C
'choix_type' => 'Sélectionner le ou les mode(s) de duplication',
'choix_champs' => 'Choisir les champs à dupliquer',
'choix_type' => 'S&eacute;lectionner le ou les mode(s) de duplication',
'choix_champs' => 'Choisir les champs &agrave; dupliquer',
'configuration_duplicator' => 'Configuration du Duplicator',
'configuration_duplicator' => 'Configuration de Duplicator',
// D
'dupli_art' => "Duplication sur les articles",
'dupli_rub' => "Duplication sur les rubriques",
// I
'icone_dupliquer' => 'Dupliquer la rubrique',
// L
'label_art_champs' => 'Liste des champs à dupliquer pour chaque article :',
'label_rub_champs' => 'Liste des champs à dupliquer pour chaque rubrique :',
'label_art_champs' => 'Liste des champs &agrave; dupliquer pour chaque article :',
'label_rub_champs' => 'Liste des champs &agrave; dupliquer pour chaque rubrique :',
// M
@ -41,5 +47,5 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'operation_retour_ok_article' => "Se rendre dans l'article dupliqu&eacute;.",
'operation_retour_ko_article' => "Retour aux articles.",
'texte_duplicator' => "Appliquer la duplication aux articles et / ou aux rubriques"
'texte_duplicator' => "Appliquer la duplication aux rubriques et/ou articles"
);

@ -0,0 +1,34 @@
#SET{message,"&Ecirc;tes-vous s&ucirc;r de vouloir dupliquer tout le contenu de cette rubrique ?"}
[(#OBJET|=={article}|oui)
#SET{message,"&Ecirc;tes-vous s&ucirc;r de vouloir dupliquer cet article ?"}
]
<script>
jQuery(function() {
jQuery(document).on('click','.dupliquer a', function(e) {
lien = jQuery(this).attr('href');
jQuery('<div></div>')
.html('<p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>#GET{message}</p>')
.dialog({
resizable: false,
modal: true,
buttons: {
"Confirmer": function() {
window.location.href = lien;
jQuery(this).dialog( "close" );
},
"Annuler": function() {
jQuery(this).dialog( "close" );
}
}
});
e.preventDefault();
});
});
</script>
<span class="icone s24 horizontale dupliquer">
[(#OBJET|=={rubrique}|oui)
<a href="[(#URL_ACTION_AUTEUR{duplicator,#OBJET:#ID_OBJET,#URL_ECRIRE{rubrique,id_rubrique=#ID_OBJET}})]"><img src="#CHEMIN{theme/img/duplicator.png}" width='24' height='24' /><b><:duplicator:action_dupliquer_rubrique:></b></a>
][(#OBJET|=={article}|oui)
<a href="[(#URL_ACTION_AUTEUR{duplicator,#OBJET:#ID_OBJET,#URL_ECRIRE{article,id_article=#ID_OBJET}})]"><img src="#CHEMIN{theme/img/duplicator.png}" width='24' height='24' /><b><:duplicator:action_dupliquer_article:></b></a>
]
</span>

@ -1,11 +1,11 @@
<paquet
prefix="duplicator"
categorie="edition"
version="1.1.0"
version="1.2.0"
etat="test"
compatibilite="[3.0.0;3.0.*]"
logo="images/apsulis.png"
documentation="http://www.spip-contrib.net/Plugin-Duplicator"
logo="theme/img/duplicator.png"
documentation="http://www.spip-contrib.net/?article3354"
>
<nom>Duplicator</nom>
@ -19,5 +19,5 @@
<pipeline nom="boite_infos" inclure="duplicator_pipeline.php" />
<menu nom="configurer_duplicator" titre="duplicator:configuration_duplicator" parent="menu_configuration" icone="images/duplicator.gif" />
<!-- <menu nom="configurer_duplicator" titre="duplicator:configuration_duplicator" parent="menu_configuration" icone="theme/img/duplicator.png" /> -->
</paquet>

@ -1,9 +0,0 @@
#SET{tri,#ENV{tri}|sinon{nom}}
#SET{ordre,#ENV{ordre}|sinon{''}}
<h1 class="grostitre">Dupliquer une rubrique</h1>
<h2>Duplication de la rubrique [(#ENV{id_objet})] (<BOUCLE_NomRub(RUBRIQUES){id_rubrique=#ENV{id_objet}}>#TITRE</BOUCLE_NomRub>)</h2>
<div class="ajax">#FORMULAIRE_DUPLICATOR_CONFIRM{#ENV{id_objet}}</div>

@ -1,9 +0,0 @@
#SET{tri,#ENV{tri}|sinon{nom}}
#SET{ordre,#ENV{ordre}|sinon{''}}
<h1 class="grostitre">Dupliquer un article</h1>
<h2>Duplication de l'article [(#ENV{id_objet})] (<BOUCLE_NomArt(ARTICLES){id_article=#ENV{id_objet}}{statut IN prop,prepa,publie,refuse,poubelle}>#TITRE</BOUCLE_NomArt>)</h2>
<div class="ajax">#FORMULAIRE_DUPLICATOR_ARTICLE_CONFIRM{#ENV{id_objet}}</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Loading…
Cancel
Save