Browse Source

- Séparer les versions branches/v0 (pour SPIP 2.x) et trunk (v1 pour SPIP 3.x)

- Petite correction pour SPIP 3, car les liens de rubriques ont changé dans le BO par rapport à la v2 (bien vu Chourak)
v0
xdjuj@apsulis.com 10 years ago
commit
f5e0da86fd
  1. 14
      .gitattributes
  2. 4
      a_faire.txt
  3. 187
      action/dupliquer.php
  4. 21
      duplicator_pipeline.php
  5. 24
      formulaires/duplicator_article_confirm.html
  6. 56
      formulaires/duplicator_article_confirm.php
  7. 24
      formulaires/duplicator_confirm.html
  8. 47
      formulaires/duplicator_confirm.php
  9. BIN
      images/apsulis.png
  10. BIN
      images/duplicator.gif
  11. 26
      lang/duplicator_fr.php
  12. 29
      plugin.xml
  13. 9
      prive/exec/duplicator.html
  14. 9
      prive/exec/duplicator_article.html

14
.gitattributes vendored

@ -0,0 +1,14 @@
* text=auto !eol
/a_faire.txt -text
action/dupliquer.php -text
/duplicator_pipeline.php -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
lang/duplicator_fr.php -text
/plugin.xml -text
prive/exec/duplicator.html -text
prive/exec/duplicator_article.html -text

4
a_faire.txt

@ -0,0 +1,4 @@
- Rajouter des logs (spip_log) c’est sûrement plus propre
- Restreindre aux administrateurs
- Faire le distingo dupli article/rubrique (ouvrir la possibilité de ne copier QUE un article, dans ce cas changer le titrage dans colonne de gauche)
- Prendre en charge les traductions qui ne sont pas dans le même dossier (en cas de rubricage racine : langue1/langue2, suivre les liens entre articles pour dupliquer les rubriques "liées").

187
action/dupliquer.php

@ -0,0 +1,187 @@
<?php
/***************************************************************************\
* Plugin Duplicator pour Spip 2.0
* Licence GPL (c) 2010 - Apsulis
* Duplication de rubriques et d'articles
*
\***************************************************************************/
/**
* Duplique un article dans la rubrique cible
* - Conserve le contenu de l'article source
* - Conserve les logos de l'article source
* - Conserve le statut de publication de l'article source
*/
function dupliquer_article($article,$rubrique){
include_spip('action/editer_article');
include_spip('inc/modifier_article');
include_spip('inc/modifier');
// On lit l'article qui va etre dupliqué
$champs = array('*');
$from = 'spip_articles';
$where = array(
"id_article=".$article
);
$infos = sql_allfetsel($champs, $from, $where);
// On choisi les champs que l'on veut conserver
// TODO éventuellement passer cette variable en CFG pour choisir depuis SPIP les champs à conserver ?
$champs_dupliques = array(
'surtitre','titre','soustitre','descriptif','chapo','texte','ps','accepter_forum','lang','langue_choisie','nom_site','url_site'
);
foreach ($champs_dupliques as $key => $value) {
$infos_de_l_article[$value] = $infos[0][$value];
}
// On cherche ses mots clefs
$mots_clefs_de_l_article = lire_les_mots_clefs($article,'article');
//////////////
// ON DUPLIQUE
//////////////
// On le clone avec les champs choisis ci-dessus, il sera NON publié par défaut
$id_article = insert_article($rubrique);
revision_article($id_article, $infos_de_l_article);
// On lui rend son statut
$maj_statut_article = sql_updateq("spip_articles", array('statut' => $infos[0]['statut']), "id_article=".$id_article);
// On lui remet ses mots clefs
remettre_les_mots_clefs($mots_clefs_de_l_article,$id_article,'article');
// On lui copie ses logos
dupliquer_logo($article,$id_article,'article',false);
dupliquer_logo($article,$id_article,'article',true);
return $id_article;
}
/**
* Duplique une rubrique dans la rubrique qui la contient
* - Conserve le contenu de la rubrique source
* - Conserve les mots clefs de la rubrique source
* - Conserve les articles de la rubrique source
*/
function dupliquer_rubrique($rubrique,$cible=null,$titre=' (copie)'){
include_spip('action/editer_rubrique');
// On lit la rubrique qui va etre dupliqué
$champs = array('*');
$from = 'spip_rubriques';
$where = array(
"id_rubrique=".$rubrique
);
$infos = sql_allfetsel($champs, $from, $where);
// On choisi les champs que l'on veut conserver
// TODO éventuellement passer cette variable en CFG pour choisir depuis SPIP les champs à conserver ?
$champs_dupliques = array(
'id_parent','titre','descriptif','texte','lang','langue_choisie'
);
foreach ($champs_dupliques as $key => $value) {
$infos_de_la_rubrique[$value] = $infos[0][$value];
}
// Si une cible est spécifiée, on ecrase le champ id_parent
if($cible) $infos_de_la_rubrique['id_parent'] = $cible;
$infos_de_la_rubrique['titre'] .= $titre;
// On cherche ses mots clefs
$mots_clefs_de_la_rubrique = lire_les_mots_clefs($rubrique,'rubrique');
// On cherche ses articles
$champs = array('id_article');
$from = 'spip_articles';
$where = array(
"id_rubrique=".$rubrique
);
$articles_de_la_rubrique = sql_allfetsel($champs, $from, $where);
// On cherche ses sous-rubriques
$champs = array('id_rubrique');
$from = 'spip_rubriques';
$where = array(
"id_parent=".$rubrique
);
$rubriques_de_la_rubrique = sql_allfetsel($champs, $from, $where);
//////////////
// ON DUPLIQUE
//////////////
$id_nouvelle_rubrique = insert_rubrique($infos_de_la_rubrique['id_parent']);
revisions_rubriques($id_nouvelle_rubrique,$infos_de_la_rubrique);
// On la publie (pour activer l'aperçu)
$maj_statut_rubrique = sql_updateq("spip_rubriques", array('statut' => 'publie'), "id_rubrique=".$id_nouvelle_rubrique);
// On lui remet ses mots clefs
remettre_les_mots_clefs($mots_clefs_de_la_rubrique,$id_nouvelle_rubrique,'rubrique');
// On lui remet ses articles
foreach($articles_de_la_rubrique as $champ => $valeur){
$id_article = dupliquer_article($valeur['id_article'],$id_nouvelle_rubrique);
}
// On lui copie ses logos
dupliquer_logo($rubrique,$id_nouvelle_rubrique,'rubrique',false);
dupliquer_logo($rubrique,$id_nouvelle_rubrique,'rubrique',true);
// On lui remet ses sous-rubrique (+ mots clefs + articles + sous rubriques)
foreach($rubriques_de_la_rubrique as $champ => $valeur){
$rubrique = $valeur['id_rubrique'];
$nouvelle_sous_rubrique = dupliquer_rubrique($rubrique,$id_nouvelle_rubrique,'');
}
return $id_nouvelle_rubrique;
}
function lire_les_mots_clefs($id,$type){
$champs = array('id_mot');
$from = 'spip_mots_'.$type.'s';
$where = array(
"id_$type=".$id
);
$mots_clefs = sql_allfetsel($champs, $from, $where);
return $mots_clefs;
}
function remettre_les_mots_clefs($mots,$id,$type){
foreach($mots as $champ => $valeur){
$n = sql_insertq(
'spip_mots_'.$type.'s',
array(
'id_mot' => $valeur['id_mot'],
'id_'.$type => $id
)
);
}
return true;
}
/* FONCTION HONTEUSEMENT ADAPTEE DE DOCUCOPIEUR ==> http://www.spip-contrib.net/DocuCopieur */
/* cette fonction realise la copie d'un logo d'article/rubrique et de son logo de survol */
/* vers le nouvel article/rubrique. */
function dupliquer_logo($id_source, $id_destination, $type='article', $bsurvol = false ){
include_spip('action/iconifier');
global $formats_logos;
if ( $bsurvol == true )
{
$logo_type = 'off'; // logo survol
} else $logo_type = 'on'; // logo
$chercher_logo = charger_fonction('chercher_logo', 'inc');
$logo_source = $chercher_logo($id_source, 'id_'.$type, $logo_type );
$logo_source = $logo_source[0];
if ( !file_exists($logo_source) ) return false;
$size = @getimagesize($logo_source);
$mime = !$size ? '': $size['mime'];
$source['name'] = basename($logo_source);
$source['type'] = $mime;
$source['tmp_name'] = $logo_source;
$source['error'] = 0;
$source['size'] = @filesize($logo_source);
action_spip_image_ajouter_dist(substr($type,0,3). $logo_type .$id_destination, 'local', $source );
return true;
}

21
duplicator_pipeline.php

@ -0,0 +1,21 @@
<?php
/***************************************************************************\
* Plugin Duplicator pour Spip 2.0
* Licence GPL (c) 2010 - Apsulis
* Duplication de rubriques et d'articles
*
\***************************************************************************/
function duplicator_boite_infos($flux){
$type = $flux['args']['type'];
if(autoriser("webmestre")){
if (($id = intval($flux['args']['id'])) && ($type=='rubrique'))
$flux['data'] .= icone_horizontale(_T('duplicator:icone_dupliquer'), generer_url_ecrire('duplicator',"id_objet=$id&type=$type"), "",_DIR_PLUGIN_DUPLICATOR."/images/duplicator.gif", false);
if (($id = intval($flux['args']['id'])) && ($type=='article'))
$flux['data'] .= icone_horizontale(_T('duplicator:icone_dupliquer_article'), generer_url_ecrire('duplicator_article',"id_objet=$id&type=$type"), "",_DIR_PLUGIN_DUPLICATOR."/images/duplicator.gif", false);
}
return $flux;
}
?>

24
formulaires/duplicator_article_confirm.html

@ -0,0 +1,24 @@
[<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{articles}|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>
]

56
formulaires/duplicator_article_confirm.php

@ -0,0 +1,56 @@
<?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;
}

24
formulaires/duplicator_confirm.html

@ -0,0 +1,24 @@
[<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{naviguer}|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>
]

47
formulaires/duplicator_confirm.php

@ -0,0 +1,47 @@
<?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;
}

BIN
images/apsulis.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
images/duplicator.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

26
lang/duplicator_fr.php

@ -0,0 +1,26 @@
<?php
/***************************************************************************\
* Plugin Duplicator pour Spip 2.0
* Licence GPL (c) 2010 - Apsulis
* Duplication de rubriques et d'articles
*
\***************************************************************************/
// Ceci est un fichier langue de SPIP -- This is a SPIP language file
$GLOBALS[$GLOBALS['idx_lang']] = array(
'icone_dupliquer' => 'Dupliquer la rubrique',
'message_annuler' => 'Annuler',
'message_confirmer' => 'Confirmer',
'operation_executee' => "L'op&eacute;ration a bien &eacute;t&eacute; ex&eacute;cut&eacute;e.",
'operation_annulee' => "L'op&eacute;ration a &eacute;t&eacute; annul&eacute;e.",
'operation_retour_ok' => "Se rendre dans la rubrique copi&eacute;e.",
'operation_retour_ko' => "Retour aux rubriques.",
'icone_dupliquer_article' => "Dupliquer l'article",
'operation_retour_ok_article' => "Se rendre dans l'article dupliqu&eacute;.",
'operation_retour_ko_article' => "Retour aux articles."
);

29
plugin.xml

@ -0,0 +1,29 @@
<plugin>
<nom>Duplicator</nom>
<slogan>Dupliquer une rubrique et son contenu</slogan>
<icon>images/apsulis.png</icon>
<auteur>[Apsulis->http://demo.apsulis.com]</auteur>
<licence>GPL &#169; 2010</licence>
<version>0.2.0</version>
<etat>test</etat>
<description>Ce plugin permet de dupliquer une rubrique et son contenu depuis l'espace priv&#233; en ajoutant un bouton dans la navigation de gauche dans l'espace priv&#233; des rubriques.
La duplication reprend :
-* les logos
-* les articles (leur contenu, leur statut, leurs mots clefs et logos)
-* les sous-rubriques (n niveaux), les mots clefs li&#233;s, ses articles (contenu + statut + mots clefs) et ses logos
La nouvelle rubrique est cr&#233;&#233;e au m&#234;me niveau que la rubrique copi&#233;e.
</description>
<lien>http://www.spip-contrib.net/Plugin-Duplicator</lien>
<prefix>duplicator</prefix>
<pipeline>
<nom>boite_infos</nom>
<inclure>duplicator_pipeline.php</inclure>
</pipeline>
<categorie>edition</categorie>
<necessite id="SPIP" version='[2.0.0;2.1.99]' />
</plugin>

9
prive/exec/duplicator.html

@ -0,0 +1,9 @@
#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>

9
prive/exec/duplicator_article.html

@ -0,0 +1,9 @@
#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>
Loading…
Cancel
Save