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)
v1
xdjuj@apsulis.com 10 years ago
commit
7731d1778d
  1. 19
      .gitattributes
  2. 3
      a_faire.txt
  3. 189
      action/dupliquer.php
  4. 32
      duplicator_pipeline.php
  5. 28
      formulaires/configurer_duplicator.html
  6. 24
      formulaires/duplicator_article_confirm.html
  7. 56
      formulaires/duplicator_article_confirm.php
  8. 24
      formulaires/duplicator_confirm.html
  9. 47
      formulaires/duplicator_confirm.php
  10. BIN
      images/apsulis.png
  11. BIN
      images/duplicator.gif
  12. 2
      inclure/duplicator_article.html
  13. 2
      inclure/duplicator_rubrique.html
  14. 33
      lang/duplicator_fr.php
  15. 26
      lang/paquet-duplicator_fr.php
  16. 23
      paquet.xml
  17. 5
      prive/squelettes/contenu/configurer_duplicator.html
  18. 9
      prive/squelettes/contenu/duplicator.html
  19. 9
      prive/squelettes/contenu/duplicator_article.html

19
.gitattributes vendored

@ -0,0 +1,19 @@
* text=auto !eol
/a_faire.txt -text
action/dupliquer.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
/paquet.xml -text
prive/squelettes/contenu/configurer_duplicator.html -text
prive/squelettes/contenu/duplicator.html -text
prive/squelettes/contenu/duplicator_article.html -text

3
a_faire.txt

@ -0,0 +1,3 @@
- Rajouter des logs (spip_log) c’est sûrement plus propre
- Restreindre aux administrateurs
- 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").

189
action/dupliquer.php

@ -0,0 +1,189 @@
<?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_liens';
$where = array(
"id_objet=".$id,
"objet=".sql_quote($type)
);
$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_liens',
array(
'id_mot' => $valeur['id_mot'],
'id_objet' => $id,
'objet' => $type
)
);
}
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;
}

32
duplicator_pipeline.php

@ -0,0 +1,32 @@
<?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 (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/duplic_article')){
if (($id = intval($flux['args']['id'])) && ($type=='article')) {
$contexte = array('id_article'=>$id);
$flux["data"] .= recuperer_fond("inclure/duplicator_article", $contexte);
}
}
}
return $flux;
}
?>

28
formulaires/configurer_duplicator.html

@ -0,0 +1,28 @@
<div class="ajax formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}">
<h3 class="titrem"><:duplicator:configuration_duplicator:></h3>
[<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}'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#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>
</fieldset>
<div>
<input type='submit' class='submit' value='<:bouton_enregistrer:>' />
</div>
</form>
]
</div>

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{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>
]

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{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>
]

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

2
inclure/duplicator_article.html

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

2
inclure/duplicator_rubrique.html

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

33
lang/duplicator_fr.php

@ -0,0 +1,33 @@
<?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(
// C
'choix_type' => 'Sélectionner le ou les mode(s) de duplication',
'configuration_duplicator' => 'Configuration du Duplicator',
'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.",
'texte_duplicator' => "Appliquer la duplication aux articles et / ou aux rubriques"
);

26
lang/paquet-duplicator_fr.php

@ -0,0 +1,26 @@
<?php
// Ceci est un fichier langue de SPIP -- This is a SPIP language file
/// Fichier produit par PlugOnet
// Module: paquet-duplicator
// Langue: fr
// Date: 18-07-2012 22:42:37
// Items: 2
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
// D
'duplicator_description' => 'Ce plugin permet de dupliquer une rubrique et son contenu depuis l\'espace privé en ajoutant un bouton dans la navigation de gauche dans l\'espace privé 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és, ses articles (contenu + statut + mots clefs) et ses logos
La nouvelle rubrique est créée au même niveau que la rubrique copiée.',
'duplicator_slogan' => 'Dupliquer une rubrique et son contenu',
);
?>

23
paquet.xml

@ -0,0 +1,23 @@
<paquet
prefix="duplicator"
categorie="edition"
version="1.0.1"
etat="test"
compatibilite="[3.0.0;3.0.*]"
logo="images/apsulis.png"
documentation="http://www.spip-contrib.net/Plugin-Duplicator"
>
<nom>Duplicator</nom>
<!-- Dupliquer une rubrique et son contenu -->
<auteur lien="http://demo.apsulis.com">Apsulis</auteur>
<copyright>2010</copyright>
<licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL 3</licence>
<pipeline nom="boite_infos" inclure="duplicator_pipeline.php" />
<menu nom="configurer_duplicator" titre="duplicator:configuration_duplicator" parent="menu_configuration" icone="images/duplicator.gif" />
</paquet>

5
prive/squelettes/contenu/configurer_duplicator.html

@ -0,0 +1,5 @@
<h1 class="grostitre"><:duplicator:configuration_duplicator:></h1>
<div class="ajax">
#FORMULAIRE_CONFIGURER_DUPLICATOR
</div>

9
prive/squelettes/contenu/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/squelettes/contenu/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