Browse Source

SVP passe en extension

svn/root/tags/plugins/svp/0.73.2 v0.73.2
ben.spip@gmail.com 9 years ago
commit
452eb08c4f
102 changed files with 13268 additions and 0 deletions
  1. +48
    -0
      .gitattributes
  2. +60
    -0
      action/actionner.php
  3. +40
    -0
      action/actualiser_depot.php
  4. +29
    -0
      action/charger_plugins.php
  5. +73
    -0
      action/editer_depot.php
  6. +27
    -0
      action/supprimer_depot.php
  7. +88
    -0
      action/teleporter.php
  8. +220
    -0
      base/svp_declarer.php
  9. +63
    -0
      formulaires/admin_plugin.html
  10. +113
    -0
      formulaires/admin_plugin.php
  11. +32
    -0
      formulaires/ajouter_depot.html
  12. +69
    -0
      formulaires/ajouter_depot.php
  13. +76
    -0
      formulaires/charger_plugin.html
  14. +89
    -0
      formulaires/charger_plugin.php
  15. +80
    -0
      formulaires/configurer_svp.html
  16. +48
    -0
      formulaires/editer_depot.html
  17. +33
    -0
      formulaires/editer_depot.php
  18. +115
    -0
      formulaires/inc-admin_plugin.html
  19. +62
    -0
      formulaires/inc-confirmer_actions.html
  20. +78
    -0
      formulaires/inc-plugins_trouves.html
  21. +13
    -0
      formulaires/inc-select_categorie.html
  22. +6
    -0
      formulaires/inc-select_depot.html
  23. +20
    -0
      genie/svp_actualiser_depots.php
  24. +28
    -0
      genie/svp_taches_generales_cron.php
  25. +3557
    -0
      inc/pcltar.php
  26. +1061
    -0
      inc/svp_actionner.php
  27. +730
    -0
      inc/svp_decider.php
  28. +681
    -0
      inc/svp_depoter_distant.php
  29. +515
    -0
      inc/svp_depoter_local.php
  30. +301
    -0
      inc/svp_outiller.php
  31. +326
    -0
      inc/svp_phraser.php
  32. +217
    -0
      inc/svp_rechercher.php
  33. +46
    -0
      inc/where_compatible_spip.php
  34. +16
    -0
      lang/paquet-svp_fr.php
  35. +278
    -0
      lang/svp_fr.php
  36. +132
    -0
      lib/pcltar/pclerror.lib.php
  37. +454
    -0
      lib/pcltar/pcltrace.lib.php
  38. +493
    -0
      lib/pcltar/readme.txt
  39. +1
    -0
      modeles/svp_presenter_actions.html
  40. +28
    -0
      paquet.xml
  41. +53
    -0
      plugins/fusion_paquet.php
  42. +125
    -0
      plugins/fusion_plugin.php
  43. +58
    -0
      plugins/preparer_sql_paquet.php
  44. +215
    -0
      plugins/preparer_sql_plugin.php
  45. +12
    -0
      prive/objets/contenu/depot-enfants.html
  46. +28
    -0
      prive/objets/contenu/depot.html
  47. +9
    -0
      prive/objets/contenu/plugin-enfants.html
  48. +30
    -0
      prive/objets/contenu/plugin.html
  49. +29
    -0
      prive/objets/infos/depot.html
  50. +41
    -0
      prive/objets/infos/plugin.html
  51. +68
    -0
      prive/objets/liste/depots.html
  52. +68
    -0
      prive/objets/liste/paquets.html
  53. +55
    -0
      prive/objets/liste/plugins.html
  54. +36
    -0
      prive/squelettes/contenu/admin_plugin.html
  55. +43
    -0
      prive/squelettes/contenu/admin_plugin_fonctions.php
  56. +18
    -0
      prive/squelettes/contenu/charger_plugin.html
  57. +6
    -0
      prive/squelettes/contenu/configurer_svp.html
  58. +32
    -0
      prive/squelettes/contenu/depots.html
  59. +11
    -0
      prive/squelettes/extra/depot.html
  60. +16
    -0
      prive/squelettes/hierarchie/plugin.html
  61. +6
    -0
      prive/squelettes/inclure/voir_en_ligne.html
  62. +12
    -0
      prive/squelettes/navigation/admin_plugin.html
  63. +7
    -0
      prive/squelettes/navigation/admin_plugin_fonctions.php
  64. +10
    -0
      prive/squelettes/navigation/charger_plugin.html
  65. +20
    -0
      prive/squelettes/navigation/depots.html
  66. +28
    -0
      prive/squelettes/navigation/plugin.html
  67. +99
    -0
      prive/style_prive_plugin_svp.html
  68. BIN
      prive/themes/spip/images/depot-16.png
  69. BIN
      prive/themes/spip/images/depot-24.png
  70. BIN
      prive/themes/spip/images/depot-32.png
  71. BIN
      prive/themes/spip/images/depot-add-16.png
  72. BIN
      prive/themes/spip/images/depot-add-24.png
  73. BIN
      prive/themes/spip/images/depot-add-32.png
  74. BIN
      prive/themes/spip/images/fond-installe.png
  75. BIN
      prive/themes/spip/images/fond-obsolete.png
  76. BIN
      prive/themes/spip/images/fond-verrou.png
  77. BIN
      prive/themes/spip/images/paquet-24.png
  78. BIN
      prive/themes/spip/images/plugin-add-16.png
  79. BIN
      prive/themes/spip/images/plugin-add-24.png
  80. BIN
      prive/themes/spip/images/plugin-add-32.png
  81. BIN
      prive/themes/spip/images/svp-16.png
  82. BIN
      prive/themes/spip/images/svp-24.png
  83. BIN
      prive/themes/spip/images/svp-32.png
  84. BIN
      prive/themes/spip/images/svp-64.png
  85. BIN
      prive/themes/spip/images/update-16.png
  86. BIN
      prive/themes/spip/images/update-32.png
  87. BIN
      svp-16.png
  88. BIN
      svp-24.png
  89. BIN
      svp-32.png
  90. BIN
      svp-64.png
  91. +26
    -0
      svp_administrations.php
  92. +403
    -0
      svp_fonctions.php
  93. +101
    -0
      svp_pipelines.php
  94. +125
    -0
      teleporter/git.php
  95. +148
    -0
      teleporter/http.php
  96. +138
    -0
      teleporter/http_deballe_tgz.php
  97. +140
    -0
      teleporter/http_deballe_zip.php
  98. +103
    -0
      teleporter/svn.php
  99. +47
    -0
      tests/criteres.html
  100. +352
    -0
      tests/depot.xml

+ 48
- 0
.gitattributes View File

@ -0,0 +1,48 @@
* text=auto !eol
action/actionner.php -text
action/teleporter.php -text
formulaires/admin_plugin.html -text
formulaires/admin_plugin.php -text
formulaires/configurer_svp.html -text
formulaires/inc-admin_plugin.html -text
formulaires/inc-confirmer_actions.html -text
inc/pcltar.php -text
inc/svp_actionner.php -text
inc/svp_depoter_local.php -text
lib/pcltar/pclerror.lib.php -text
lib/pcltar/pcltrace.lib.php -text
lib/pcltar/readme.txt -text
modeles/svp_presenter_actions.html -text
prive/squelettes/contenu/admin_plugin.html -text
prive/squelettes/contenu/admin_plugin_fonctions.php -text
prive/squelettes/contenu/configurer_svp.html -text
prive/squelettes/navigation/admin_plugin.html -text
prive/squelettes/navigation/admin_plugin_fonctions.php -text
prive/themes/spip/images/depot-16.png -text
prive/themes/spip/images/depot-24.png -text
prive/themes/spip/images/depot-32.png -text
prive/themes/spip/images/depot-add-16.png -text
prive/themes/spip/images/depot-add-24.png -text
prive/themes/spip/images/depot-add-32.png -text
prive/themes/spip/images/fond-installe.png -text
prive/themes/spip/images/fond-obsolete.png -text
prive/themes/spip/images/fond-verrou.png -text
prive/themes/spip/images/paquet-24.png -text
prive/themes/spip/images/plugin-add-16.png -text
prive/themes/spip/images/plugin-add-24.png -text
prive/themes/spip/images/plugin-add-32.png -text
prive/themes/spip/images/svp-16.png -text
prive/themes/spip/images/svp-24.png -text
prive/themes/spip/images/svp-32.png -text
prive/themes/spip/images/svp-64.png -text
prive/themes/spip/images/update-16.png -text
prive/themes/spip/images/update-32.png -text
/svp-16.png -text
/svp-24.png -text
/svp-32.png -text
/svp-64.png -text
teleporter/git.php -text
teleporter/http.php -text
teleporter/http_deballe_tgz.php -text
teleporter/http_deballe_zip.php -text
teleporter/svn.php -text

+ 60
- 0
action/actionner.php View File

@ -0,0 +1,60 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function action_actionner_dist() {
// droits
include_spip('inc/autoriser');
if (!autoriser('configurer', 'plugins')) {
include_spip('inc/minipres');
echo minipres();
exit;
}
include_spip('inc/svp_actionner');
include_spip('inc/headers');
$actionneur = new Actionneur();
$actionneur->get_actions();
if ($actionneur->one_action()) {
// si SVP a été enlevé des actifs, on redirige sur la fin...
// sinon cette page d'action/actionner devient introuvable.
// dans ce cas précis, les autres actions prévues venant après la desactivation de SVP
// ne pourront être traitees... SVP n'étant plus là !
if ($actionneur->tester_si_svp_desactive()) {
$url = _request('redirect');
} else {
$url = generer_action_auteur('actionner', '', _request('redirect'));
}
// en mode pas à pas, on affiche un bilan entre chaque action
// et on demande a l'utilistateur de cliquer pour realiser
// l'action suivante.
include_spip('inc/config');
if (lire_config('svp/mode_pas_a_pas') == 'oui') {
include_spip('inc/minipres');
$pres = $actionneur->presenter_actions();
$btn = "<a href='$url'>[ Action Suivante ]</a>";
$styles = "
<style type='text/css'>
#minipres #actionner .fail {color:#c30000;}
#minipres #actionner ul {margin-left: 0.5em;}
#minipres #actionner li {list-style-type:square; margin-left: 0.5em;}
</style>";
echo minipres( _T('svp:installation_en_cours'), $pres . '<br /><br />' . $btn . $styles);
die();
}
redirige_par_entete(str_replace('&amp;','&', $url));
}
include_spip('inc/svp_depoter_local');
svp_actualiser_paquets_locaux();
// retour
redirige_par_entete(_request('redirect'));
}
?>

+ 40
- 0
action/actualiser_depot.php View File

@ -0,0 +1,40 @@
<?php
/**
* Action de mises a jour en base de donnees des plugins du depot
*
*/
function action_actualiser_depot_dist(){
// Securisation: aucun argument attendu
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
// Verification des autorisations
if (!autoriser('webmestre')) {
include_spip('inc/minipres');
echo minipres();
exit();
}
// Actualisation des plugins du depot ou de tous les plugins suivant l'argument de l'action
// Le depot lui-meme n'est mis a jour que partiellement via le fichier XML une fois que
// la premiere insertion a ete effectuee. En effet, seules les infos non editables dans le prive
// peuvent etre actualisees lors de cette action
include_spip('inc/svp_depoter_distant');
if ($arg === 'tout') {
if ($ids_depots = sql_allfetsel('id_depot', 'spip_depots')) {
$ids_depots = array_map('reset', $ids_depots);
foreach ($ids_depots as $_id_depot)
svp_actualiser_depot($_id_depot);
// On consigne l'action
spip_log("ACTION ACTUALISER TOUS LES DEPOTS (manuel)", 'svp_actions.' . _LOG_INFO);
}
}
else if ($id_depot = intval($arg)) {
svp_actualiser_depot($id_depot);
// On consigne l'action
spip_log("ACTION ACTUALISER DEPOT (manuel) : id_depot = ". $id_depot, 'svp_actions.' . _LOG_INFO);
}
}
?>

+ 29
- 0
action/charger_plugins.php View File

@ -0,0 +1,29 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* Fonction qui
* @return
*/
function action_charger_plugins_dist() {
// Securisation: aucun argument attendu
include_spip('inc/minipres');
// Autorisation
if(!autoriser('webmestre')) {
echo minipres();
exit;
}
$plugins = _request('a_installer');
$logs = array();
foreach ($plugins as $_plugin) {
continue;
}
include_spip('exec/install');
echo minipres('Resultats installation', generer_form_ecrire('admin_plugin&voir=tous', serialize($logs) . bouton_suivant()));
exit;
}
?>

+ 73
- 0
action/editer_depot.php View File

@ -0,0 +1,73 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2009 *
* 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;
function action_editer_depot_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
// Verification des autorisations
if (!autoriser('webmestre')) {
include_spip('inc/minipres');
echo minipres();
exit();
}
// Le depot n'est jamais cree par une edition mais via le formulaire ajouter_depot
// On est toujours en presence d'une mise a jour pour cette action, l'id_depot
// doit donc etre renseigne sinon c'est une erreur
if ($id_depot = intval($arg)) {
// On teste si l'auteur est connecte. Si non on renvoie sur le formulaire login
$id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
if (!($id_auteur)) {
include_spip('inc/headers');
redirige_url_ecrire();
}
// On met a jour le depot avec les saisies
if (sql_updateq('spip_depots',
array('titre'=> _request('titre'),
'descriptif'=> _request('descriptif'),
'type'=> _request('type')),
'id_depot=' . sql_quote($id_depot)));
// Enregistre l'envoi dans la BD
// Dans le cas du depot rien n'est fait actuellement, on garde cette fonction
// par souci de coherence avec les autres editions d'objet et pour usage futur
$err = depots_set($id_depot);
if (!$err)
spip_log("ACTION MODIFIER DEPOT (manuel) : id_depot = ". $id_depot, 'svp_actions.' . _LOG_INFO);
}
return array($id_depot, $err);
}
// Appelle toutes les fonctions de modification d'un depot
// $err est de la forme '&trad_err=1'
// Cette fonction ne fait rien actuellement sur un depot
function depots_set($id_depot) {
$err = '';
// unifier $texte en cas de texte trop long
// - non utilisabe sur le descriptif aujourd'huiez
// Enregistrer les revisions
// - revisions_depot()
// Modifier le statut ?
// - instituer_depot()
return $err;
}
?>

+ 27
- 0
action/supprimer_depot.php View File

@ -0,0 +1,27 @@
<?php
/**
* Action de suppression en base de donnees du depot et de ses plugins
*
*/
function action_supprimer_depot_dist(){
// Securisation: aucun argument attendu
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
// Verification des autorisations
if (!autoriser('webmestre')) {
include_spip('inc/minipres');
echo minipres();
exit();
}
// Suppression du depot et de ses plugins
if ($id_depot = intval($arg)) {
include_spip('inc/svp_depoter_distant');
svp_supprimer_depot($id_depot);
spip_log("ACTION SUPPRIMER DEPOT (manuel) : id_depot = ". $id_depot, 'svp_actions.' . _LOG_INFO);
}
}
?>

+ 88
- 0
action/teleporter.php View File

@ -0,0 +1,88 @@
<?php
/**
* Plugin S.P
* Licence IV
* (c) 2011 vers l'infini et au dela
*/
/**
* Teleporter et deballer un composant
* @param string $methode
* http|git|svn|...
* @param string $source
* url source du composant
* @param string $dest
* chemin du repertoire ou deballer le composant. Inclus le dernier segment
* @param array $options
* revision => ''
* --ignore-externals
* @return bool\string
*/
function action_teleporter_composant_dist($methode,$source,$dest,$options=array()){
# Si definie a '', le chargeur est interdit ; mais on n'aurait de toutes
# facons jamais pu venir ici avec toutes les securisations faites :^)
if (!_DIR_PLUGINS_AUTO) die('jamais');
// verifier que la methode est connue
if (!$teleporter = charger_fonction($methode,"teleporter",true)){
spip_log("Methode $methode inconnue pour teleporter $source vers $dest","teleport"._LOG_ERREUR);
return _T('svp:erreur_teleporter_methode_inconue',array('methode' => $methode));
}
if (!$dest = teleporter_verifier_destination($d = $dest)){
spip_log("Rerpertoire $d non accessible pour teleporter $source vers $d","teleport"._LOG_ERREUR);
return _T('svp:erreur_teleporter_destination_erreur',array('dir' => $d));
#$texte = "<p>"._T('plugin_erreur_droit1',array('dest'=>$dest))."</p>"
# . "<p>"._T('plugin_erreur_droit2').aide('install0')."</p>";
}
# destination temporaire des fichiers si besoin
$options['dir_tmp'] = sous_repertoire(_DIR_CACHE, 'chargeur');
return $teleporter($methode,$source,$dest,$options);
}
/**
* Verifier et preparer l'arborescence jusqu'au repertoire parent
*
* @param string $dest
* @return bool|string
*/
function teleporter_verifier_destination($dest){
$dest = rtrim($dest,"/");
$final = basename($dest);
$base = dirname($dest);
$create = array();
// on cree tout le chemin jusqu'a dest non inclus
while (!is_dir($base)){
$create[] = basename($base);
$base = dirname($base);
}
while (count($create)){
if (!is_writable($base))
return false;
$base = sous_repertoire($base,array_pop($create));
if (!$base)
return false;
}
if (!is_writable($base))
return false;
return $base."/$final";
}
function teleporter_nettoyer_vieille_version($dest){
$old = "";
if (is_dir($dest)){
$dir = dirname($dest);
$base = basename($dest);
$old="$dir/.$base.bck";
if (is_dir($old))
supprimer_repertoire($old);
rename($dest,$old);
}
return $old;
}

+ 220
- 0
base/svp_declarer.php View File

@ -0,0 +1,220 @@
<?php
// Declaration des tables pourles nouveaux objets de SVP:
// - depot : table spip_depots
// - plugin : table spip_plugins
// - paquet : table spip_paquets
//
function svp_declarer_tables_objets_sql($tables) {
// Table des depots
$tables['spip_depots'] = array(
// Base de donnees
'table_objet' => 'depots',
'type' => 'depot',
'field' => array(
"id_depot" => "bigint(21) NOT NULL",
"titre" => "text DEFAULT '' NOT NULL",
"descriptif" => "text DEFAULT '' NOT NULL",
"type" => "varchar(10) DEFAULT '' NOT NULL",
"url_serveur" => "varchar(255) DEFAULT '' NOT NULL", // url du serveur svn ou git
"url_brouteur" => "varchar(255) DEFAULT '' NOT NULL", // url de l'interface de gestion du repository (trac, redmine...)
"url_archives" => "varchar(255) DEFAULT '' NOT NULL", // url de base des zips
"url_commits" => "varchar(255) DEFAULT '' NOT NULL", // url du flux rss des commits du serveur svn ou git
"xml_paquets" => "varchar(255) DEFAULT '' NOT NULL", // chemin complet du fichier xml du depot
"sha_paquets" => "varchar(40) DEFAULT '' NOT NULL",
"nbr_paquets" => "integer DEFAULT 0 NOT NULL",
"nbr_plugins" => "integer DEFAULT 0 NOT NULL",
"nbr_autres" => "integer DEFAULT 0 NOT NULL", // autres contributions, non plugin
"maj" => "timestamp"),
'key' => array(
"PRIMARY KEY" => "id_depot"),
'tables_jointures' => array('id_plugin' => 'depots_plugins'),
'principale' => 'oui',
// Titre, date et gestion du statut
'titre' => "titre, '' AS lang",
// Edition, affichage et recherche
'page' => 'depot',
'url_voir' => 'depot',
'url_edit' => 'depot_edit',
'editable' => 'oui',
'champs_editables' => array('titre', 'descriptif'),
'icone_objet' => 'depot',
// Textes standard
'texte_retour' => 'icone_retour',
'texte_modifier' => 'svp:bouton_modifier_depot',
'texte_creer' => '',
'texte_creer_associer' => '',
'texte_signale_edition' => '',
'texte_objet' => 'svp:titre_depot',
'texte_objets' => 'svp:titre_depots',
'info_aucun_objet' => 'svp:info_aucun_depot',
'info_1_objet' => 'svp:info_1_depot',
'info_nb_objets' => 'svp:info_nb_depots',
'texte_logo_objet' => 'svp:titre_logo_depot',
);
// Table des plugins
$tables['spip_plugins'] = array(
// Base de donnees
'table_objet' => 'plugins',
'type' => 'plugin',
'field' => array(
"id_plugin" => "bigint(21) NOT NULL",
"prefixe" => "varchar(30) DEFAULT '' NOT NULL",
"nom" => "text DEFAULT '' NOT NULL",
"slogan" => "text DEFAULT '' NOT NULL",
"categorie" => "varchar(100) DEFAULT '' NOT NULL",
"tags" => "text DEFAULT '' NOT NULL",
"vmax" => "varchar(24) DEFAULT '' NOT NULL", // version la plus elevee des paquets du plugin
"date_crea" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // la plus ancienne des paquets du plugin
"date_modif" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // la plus recente des paquets du plugin
"compatibilite_spip" => "varchar(24) DEFAULT '' NOT NULL", // union des intervalles des paquets du plugin
"branches_spip" => "varchar(255) DEFAULT '' NOT NULL"), // union des branches spip supportees par les paquets du plugin
'key' => array(
"PRIMARY KEY" => "id_plugin",
"KEY" => "prefixe"),
'tables_jointures' => array('id_depot' => 'depots_plugins'),
'principale' => 'oui',
// Titre, date et gestion du statut
'titre' => "prefixe AS titre, '' AS lang",
// Edition, affichage et recherche
'page' => 'plugin',
'url_voir' => 'plugin',
'editable' => 'non',
'champs_editables' => array(),
'rechercher_champs' => array('prefixe' => 8, 'nom' => 8, 'slogan' => 4),
'rechercher_jointures' => array('paquet' => array('auteur' => 8, 'description' => 2)),
'icone_objet' => 'plugin',
// Textes standard
'texte_retour' => 'icone_retour',
'texte_modifier' => '',
'texte_creer' => '',
'texte_creer_associer' => '',
'texte_signale_edition' => '',
'texte_objet' => 'svp:titre_plugin',
'texte_objets' => 'svp:titre_plugins',
'info_aucun_objet' => 'svp:info_aucun_plugin',
'info_1_objet' => 'svp:info_1_plugin',
'info_nb_objets' => 'svp:info_nb_plugins',
'texte_logo_objet' => 'svp:titre_logo_plugin',
);
$tables['spip_paquets'] = array(
// Base de donnees
'table_objet' => 'paquets',
'type' => 'paquet',
'field' => array(
"id_paquet" => "bigint(21) NOT NULL",
"id_plugin" => "bigint(21) NOT NULL",
"logo" => "varchar(255) DEFAULT '' NOT NULL", // chemin du logo depuis la racine du plugin
"version" => "varchar(24) DEFAULT '' NOT NULL",
"version_base" => "varchar(24) DEFAULT '' NOT NULL",
"compatibilite_spip" => "varchar(24) DEFAULT '' NOT NULL",
"branches_spip" => "varchar(255) DEFAULT '' NOT NULL", // branches spip supportees (cf meta)
"description" => "text DEFAULT '' NOT NULL",
"auteur" => "text DEFAULT '' NOT NULL",
"credit" => "text DEFAULT '' NOT NULL",
"licence" => "text DEFAULT '' NOT NULL",
"copyright" => "text DEFAULT '' NOT NULL",
"lien_doc" => "text DEFAULT '' NOT NULL", // lien vers la documentation
"lien_demo" => "text DEFAULT '' NOT NULL", // lien vers le site de demo
"lien_dev" => "text DEFAULT '' NOT NULL", // lien vers le site de dev
"etat" => "varchar(16) DEFAULT '' NOT NULL",
"etatnum" => "int(1) DEFAULT 0 NOT NULL", // 0 aucune indication - 1 exp - 2 dev - 3 test - 4 stable
"dependances" => "text DEFAULT '' NOT NULL",
"date_crea" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
"date_modif" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
"id_depot" => "bigint(21) DEFAULT 0 NOT NULL", // 0 pour un paquet local
"nom_archive" => "VARCHAR(255) DEFAULT '' NOT NULL", // nom du zip du paquet, depuis l'adresse de la zone
"nbo_archive" => "integer DEFAULT 0 NOT NULL", // taille de l'archive en octets
"maj_archive" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date de mise a jour de l'archive
"src_archive" => "VARCHAR(255) DEFAULT '' NOT NULL", // source de l'archive sur le depot
"traductions" => "text DEFAULT '' NOT NULL", // tableau serialise par module des langues traduites et de leurs traducteurs
"actif" => "varchar(3) DEFAULT 'non' NOT NULL", // est actif ? oui / non
"installe" => "varchar(3) DEFAULT 'non' NOT NULL", // est desinstallable ? oui / non
"recent" => "int(2) DEFAULT 0 NOT NULL", // a ete utilise recemment ? > 0 : oui
"maj_version" => "VARCHAR(255) DEFAULT '' NOT NULL", // version superieure existante (mise a jour possible)
"superieur" => "varchar(3) DEFAULT 'non' NOT NULL", // superieur : version plus recente disponible (distant) d'un plugin (actif?) existant
"obsolete" => "varchar(3) DEFAULT 'non' NOT NULL", // obsolete : version plus ancienne (locale) disponible d'un plugin local existant
"constante" => "VARCHAR(30) DEFAULT '' NOT NULL", // nom de la constante _DIR_(PLUGINS|EXTENSIONS|PLUGINS_SUPP)
"signature" => "VARCHAR(32) DEFAULT '' NOT NULL"), // hash MD5 d'un paquet
'key' => array(
"PRIMARY KEY" => "id_paquet",
"KEY id_plugin" => "id_plugin"),
'join' => array(
"id_paquet" => "id_paquet",
"id_plugin" => "id_plugin"),
'principale' => 'oui',
// Titre, date et gestion du statut
'titre' => "nom_archive AS titre, '' AS lang",
// Edition, affichage et recherche
'page' => 'paquet',
'url_voir' => '',
'editable' => 'non',
'champs_editables' => array(),
'rechercher_champs' => array(),
'rechercher_jointures' => array(),
'icone_objet' => 'paquet',
// Textes standard
'texte_retour' => '',
'texte_modifier' => '',
'texte_creer' => '',
'texte_creer_associer' => '',
'texte_signale_edition' => '',
'texte_objet' => 'svp:titre_paquet',
'texte_objets' => 'svp:titre_paquets',
'info_aucun_objet' => 'svp:info_aucun_paquet',
'info_1_objet' => 'svp:info_1_paquet',
'info_nb_objets' => 'svp:info_nb_paquets',
'texte_logo_objet' => '',
);
return $tables;
}
function svp_declarer_tables_auxiliaires($tables_auxiliaires) {
// Tables de liens entre plugins et depots : spip_depots_plugins
$spip_depots_plugins = array(
"id_depot" => "bigint(21) NOT NULL",
"id_plugin" => "bigint(21) NOT NULL"
);
$spip_depots_plugins_key = array(
"PRIMARY KEY" => "id_depot, id_plugin"
);
$tables_auxiliaires['spip_depots_plugins'] =
array('field' => &$spip_depots_plugins, 'key' => &$spip_depots_plugins_key);
return $tables_auxiliaires;
}
function svp_declarer_tables_interfaces($interface) {
// Les tables : permet d'appeler une boucle avec le *type* de la table uniquement
$interface['table_des_tables']['depots'] = 'depots';
$interface['table_des_tables']['plugins'] = 'plugins';
$interface['table_des_tables']['paquets'] = 'paquets';
$interface['table_des_tables']['depots_plugins'] = 'depots_plugins';
// Les traitements
// - table spip_plugins
$interface['table_des_traitements']['SLOGAN']['plugins'] = _TRAITEMENT_RACCOURCIS;
// - table spip_paquets
$interface['table_des_traitements']['DESCRIPTION']['paquets'] = _TRAITEMENT_RACCOURCIS;
return $interface;
}
?>

+ 63
- 0
formulaires/admin_plugin.html View File

@ -0,0 +1,63 @@
<div class="formulaire_spip formulaire_admin_plugin" id="formulaire_admin_plugin">
<h3 class="titrem">[(#CHEMIN_IMAGE{plugin-24.gif}|balise_img{icone plugin-24,cadre-icone})]<:plugins_liste:></h3>
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
<form method="post" action="#ENV{action}">
<INCLURE{fond=formulaires/inc-confirmer_actions, env} />
#ACTION_FORMULAIRE{#ENV{action}}
<div class="liste-plugins">
<fieldset>
<p class="explication">
[(#ENV{verrouille}|=={oui}|?{
<:svp:info_admin_plugin_verrouille:>,
[(#VAL{svp:info_admin_plugin}|concat{[_actif_(#ENV{actif, oui})], [_verrou_(#ENV{verrouille, non})]}|_T)]}
)]
</p>
<INCLURE{fond=formulaires/inc-admin_plugin,env} />
</fieldset>
</div>
<div class="actions_multiples">
[<fieldset class="boutons">(#VAL{'_DIR_EXTENSIONS'}|in_array{#ENV{constante,#ARRAY}}|non)
<p class="cocher">
<a href="#" id="select_tous"><:svp:tout_cocher:></a><span class="sep"> | </span>
<a href="#" id="select_aucun"><:svp:tout_decocher:></a><span class="sep"> | </span>
<a href="#" id="select_up"><:svp:tout_cocher_up:></a>
</p>
<select class="action" name="action_globale">
[(#ENV{actif}|=={oui}|non)<option value="on"><:svp:bouton_activer:></option>]
[(#ENV{actif}|=={non}|non)<option value="off"><:svp:bouton_desactiver:></option>]
<option value="up"><:svp:bouton_up:></option>
[(#ENV{actif}|=={non}|non)<option value="stop"><:svp:bouton_desinstaller:></option>]
</select>
<input type="submit" class="submit" name="appliquer" value="<:svp:bouton_appliquer:>" />
</fieldset>]
<script type="text/javascript">
//<![CDATA[
jQuery(function(){
jQuery("#select_tous").click(function(){
jQuery("input.select_plugin").attr("checked",true);
return false;
});
jQuery("#select_aucun").click(function(){
jQuery("input.select_plugin").attr("checked",false);
return false;
});
var cocher_plugins_up = function(){
if (jQuery(".plugins li.item.up").length != 0) {
jQuery("#select_up").click(function(){
jQuery(".plugins li.item.up input.select_plugin").attr("checked",true);
return false;
});
} else {
jQuery("#select_up").hide();
jQuery("#select_up").prev(".sep").hide();
}
}
cocher_plugins_up();
onAjaxLoad(cocher_plugins_up);
});
//]]>
</script>
</div>
</form>
</div>

+ 113
- 0
formulaires/admin_plugin.php View File

@ -0,0 +1,113 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function formulaires_admin_plugin_charger_dist($voir='actif', $verrouille='non'){
$valeurs = array();
// actualiser la liste des paquets locaux systematiquement
include_spip('inc/svp_depoter_local');
svp_actualiser_paquets_locaux();
$valeurs['actif'] = 'oui';
if ($voir == 'inactif')
$valeurs['actif'] = 'non';
if ($voir == 'tous')
$valeurs['actif'] = '';
$valeurs['constante'] = array('_DIR_PLUGINS','_DIR_PLUGINS_SUPPL');
if ($verrouille == 'oui')
$valeurs['constante'] = array('_DIR_EXTENSIONS');
if ($verrouille == 'tous')
$valeurs['constante'] = array();
$valeurs['verrouille'] = $verrouille;
$valeurs['actions'] = array();
$valeurs['ids_paquet'] = _request('ids_paquet');
$valeurs['_todo'] = _request('_todo');
return $valeurs;
}
function formulaires_admin_plugin_verifier_dist($voir='actif', $verrouille='non'){
$erreurs = array();
if (_request('annuler_actions')) {
// Requete : Annulation des actions d'installation en cours
// -- On vide la liste d'actions en cours
set_request('_todo', '');
} elseif (_request('valider_actions')) {
// ...
} else {
$a_actionner = array();
// actions globales...
if ($action_globale = _request('action_globale') AND _request('appliquer')) {
$ids_paquet = _request('ids_paquet');
if (!is_array($ids_paquet)) {
$erreurs['message_erreur'] = _T('svp:message_erreur_aucun_plugin_selectionne');
} else {
foreach ($ids_paquet as $i) {
$a_actionner[$i] = $action_globale;
}
}
// action unitaire
} else {
$actions = _request('actions');
// $actions[type][id] = Texte
// -> $a_actionner[id] = type
foreach ($actions as $action => $p) {
foreach ($p as $i => $null) {
$a_actionner[$i] = $action;
}
}
}
// lancer les verifications
if (!$a_actionner)
$erreurs['message_erreur'] = _T('svp:message_erreur_aucun_plugin_selectionne');
else {
// On fait appel au decideur pour determiner la liste exacte des commandes apres
// verification des dependances
include_spip('inc/svp_decider');
svp_decider_verifier_actions_demandees($a_actionner, $erreurs);
}
}
return $erreurs;
}
function formulaires_admin_plugin_traiter_dist($voir='actif', $verrouille='non'){
$retour = array();
if (_request('valider_actions')) {
#refuser_traiter_formulaire_ajax();
// Ajout de la liste des actions à l'actionneur
// c'est lui qui va effectuer rellement les actions
// lors de l'appel de action/actionner
$actions = unserialize(_request('_todo'));
include_spip('inc/svp_actionner');
svp_actionner_traiter_actions_demandees($actions, $retour);
}
$retour['editable'] = true;
return $retour;
}
/**
* Filtre pour simplifier la creation des actions du formulaire
* [(#ID_PAQUET|svp_nom_action{desactiver})]
* actions[desactiver][24]
**/
function filtre_svp_nom_action($id_paquet, $action) {
return "actions[$action][$id_paquet]";
}
?>

+ 32
- 0
formulaires/ajouter_depot.html View File

@ -0,0 +1,32 @@
<div class="formulaire_spip formulaire_ajouter_depot" id="formulaire_ajouter_depot">
<h3 class="titrem">[(#CHEMIN_IMAGE{depot-add-24.png}|balise_img{icone ajouter_depot-24,cadre-icone})]<:svp:titre_form_ajouter_depot:></h3>
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
<!-- <br class='bugajaxie' /> -->
[(#ENV{editable})
<form method="post" action="#ENV{action}">
[(#REM) <!-- declarer les hidden qui declencheront le service du formulaire
parametre : url d'action --> ]
#ACTION_FORMULAIRE{#ENV{action}}
<div>
<p class="explication"><:svp:info_ajouter_depot:></p>
<ul>
<li class="editer_xml_paquets obligatoire[(#ENV{erreurs}|table_valeur{xml_paquets}|oui) erreur]">
<label for="xml_paquets"><:svp:label_xml_depot:></label>
<p class="explication">
<:svp:info_fichier_depot:>
<a class="spip_out" title="<:svp:bulle_ajouter_spipzone:>" href="http://files.spip.org/spip-zone/archives.xml" onclick="$('#xml_paquets').attr('value',$(this).attr('href')).focus();return false;"><:svp:info_adresse_spipzone:></a>
</p>
[<span class="erreur_message">(#ENV{erreurs}|table_valeur{xml_paquets})</span>]
<input type="text" name="xml_paquets" id="xml_paquets" value="[http://files.spip.org/spip-zone/archives.xml(#VAL{depot}|svp_compter|table_valeur{depot}|=={0}|oui)]" class="text" />
</li>
</ul>
<p class="boutons">
<input type="submit" class="submit" value="<:bouton_ajouter:>" />
</p>
</div>
</form>
]
</div>

+ 69
- 0
formulaires/ajouter_depot.php View File

@ -0,0 +1,69 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function formulaires_ajouter_depot_charger_dist(){
// On ne renvoie pas les valeurs saisies mais on fait un raz systematique
return array();
}
function formulaires_ajouter_depot_verifier_dist(){
$erreurs = array();
$xml = _request('xml_paquets');
if (!$xml) {
// L'url est obligatoire
$erreurs['xml_paquets'] = _T('svp:message_nok_champ_obligatoire');
}
elseif (!svp_verifier_adresse_depot($xml)) {
// L'url n'est pas correcte, le fichier xml n'a pas ete trouve
$erreurs['xml_paquets'] = _T('svp:message_nok_url_depot_incorrecte', array('url' => $xml));
}
elseif (sql_countsel('spip_depots','xml_paquets='.sql_quote(trim($xml)))) {
// L'url est deja ajoutee
$erreurs['xml_paquets'] = _T('svp:message_nok_depot_deja_ajoute', array('url' => $xml));
}
return $erreurs;
}
function formulaires_ajouter_depot_traiter_dist(){
include_spip('inc/svp_depoter_distant');
$retour = array();
$xml = _request('xml_paquets');
// On ajoute le depot et ses plugins dans la base
// On traite le cas d'erreur fichier ($retour['message_erreur']) non conforme
// - si la syntaxe xml est incorrecte
// - ou si le depot ne possede pas au moins un plugin
$ok = svp_ajouter_depot($xml, $erreur);
// Determination des messages de retour
if (!$ok)
$retour['message_erreur'] = $erreur;
else {
$retour['message_ok'] = _T('svp:message_ok_depot_ajoute', array('url' => $xml));
spip_log("ACTION AJOUTER DEPOT (manuel) : url = ". $xml, 'svp_actions.' . _LOG_INFO);
}
$retour['editable'] = true;
return $retour;
}
/**
* Teste la validite d'une url d'un depot de paquets
*
* @param string $url
* @return boolean
*/
// $url => url du fichier xml de description du depot
function svp_verifier_adresse_depot($url){
include_spip('inc/distant');
return (!$xml = recuperer_page($url)) ? false : true;
}
?>

+ 76
- 0
formulaires/charger_plugin.html View File

@ -0,0 +1,76 @@
<div class="formulaire_spip formulaire_charger_plugin" id="formulaire_charger_plugin">
<h3 class="titrem">[(#CHEMIN_IMAGE{plugin-add-24.png}|balise_img{icone ajouter_plugin-24,cadre-icone})]<:plugin_titre_automatique_ajouter:></h3>
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
<BOUCLE_depot_existe(DEPOTS) {0,1}>
<form method="post" action="#ENV{action}">
<INCLURE{fond=formulaires/inc-confirmer_actions, env} />
[(#REM) <!-- declarer les hidden qui declencheront le service du formulaire
parametre : url d'action --> ]
#ACTION_FORMULAIRE{#ENV{action}}
<input type="hidden" name="exclusion" class='hidden' value="oui" />
<div class="liste-recherche">
<fieldset>
<legend><:svp:legende_rechercher_plugins:></legend>
<p class="explication"><:svp:info_charger_plugin{version=#SPIP_VERSION}:></p>
<ul>
<li class="editer_phrase obligatoire[(#ENV{erreurs}|table_valeur{phrase}|oui) erreur]">
<label for="phrase"><:svp:label_critere_phrase:></label>
<p class="explication"><:svp:info_critere_phrase:></p>
[<span class="erreur_message">(#ENV{erreurs}|table_valeur{phrase})</span>]
<input type="text" name="phrase" id="phrase" value="#ENV{phrase}" class="text" placeholder="<:svp:placeholder_phrase:>" />
</li>
<li class="editer_categorie obligatoire[(#ENV{erreurs}|table_valeur{categorie}|oui) erreur]">
<label for="categorie"><:svp:label_critere_categorie:></label>
[<span class="erreur_message">(#ENV{erreurs}|table_valeur{categorie})</span>]
<INCLURE{fond=formulaires/inc-select_categorie, categorie=#ENV{categorie}, env} />
</li>
<li class="editer_etat obligatoire[(#ENV{erreurs}|table_valeur{etat}|oui) erreur]">
<label for="etat"><:svp:label_critere_etat:></label>
[<span class="erreur_message">(#ENV{erreurs}|table_valeur{etat})</span>]
<select name="etat" id="etat">
<option value="tout_etat"[ (#ENV{etat,stable}|=={tout_etat}|oui)selected="selected"]><:svp:option_etat_tout:></option>
<option value="stable"[ (#ENV{etat,stable}|=={stable}|oui)selected="selected"]><:plugin_etat_stable|ucfirst:></option>
<option value="test"[ (#ENV{etat,stable}|=={test}|oui)selected="selected"]><:plugin_etat_test|ucfirst:></option>
<option value="dev"[ (#ENV{etat,stable}|=={dev}|oui)selected="selected"]><:plugin_etat_developpement|ucfirst:></option>
<option value="experimental"[ (#ENV{etat,stable}|=={experimental}|oui)selected="selected"]><:plugin_etat_experimental|ucfirst:></option>
</select>
</li>
<li class="editer_depot obligatoire[(#ENV{erreurs}|table_valeur{depot}|oui) erreur]">
<label for="depot"><:svp:label_critere_depot:></label>
[<span class="erreur_message">(#ENV{erreurs}|table_valeur{depot})</span>]
<INCLURE{fond=formulaires/inc-select_depot, env} />
</li>
<li class="editer_doublon obligatoire[(#ENV{erreurs}|table_valeur{doublon}|oui) erreur]">
<label for="doublon"><:svp:label_critere_doublon:></label>
[<span class="erreur_message">(#ENV{erreurs}|table_valeur{doublon})</span>]
<select name="doublon" id="doublon">
<option value="non"[ (#ENV{doublon}|=={non}|oui)selected="selected"]><:svp:option_doublon_non:></option>
<option value="oui"[ (#ENV{doublon}|=={oui}|oui)selected="selected"]><:svp:option_doublon_oui:></option>
</select>
</li>
</ul>
</fieldset>
<p class="boutons recherche"><input type="submit" name="rechercher" class="submit" value="<:info_rechercher:>" /></p>
</div>
[(#ENV{phrase}|ou{#ENV{depot}}|ou{#ENV{categorie}}|ou{#ENV{etat}|ou{#ENV{doublon}}}|oui)
<div class="liste-plugins">
<fieldset>
<legend><:svp:legende_installer_plugins:></legend>
<INCLURE{fond=formulaires/inc-plugins_trouves, plugins=#ENV*{message_ok}|table_valeur{plugins}, env} />
</fieldset>
<p class="boutons actions"[(#ENV{ids_paquet}|non) style="display:none"]><input type="submit" name="installer" class="submit" value="<:svp:bouton_installer:>" /></p>
</div>]
</form>
</BOUCLE_depot_existe>
#BOITE_OUVRIR{'','notice'}
<p><:svp:message_nok_aucun_depot_disponible:></p>
#BOITE_FERMER
<//B_depot_existe>
</div>

+ 89
- 0
formulaires/charger_plugin.php View File

@ -0,0 +1,89 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function formulaires_charger_plugin_charger_dist(){
return array(
'phrase' => _request('phrase'),
'categorie' => _request('categorie'),
'etat' => _request('etat'),
'depot' => _request('depot'),
'doublon' => _request('doublon'),
'exclusion' => _request('exclusion'),
'ids_paquet' => _request('ids_paquet'),
'_todo' => _request('_todo'));
}
function formulaires_charger_plugin_verifier_dist(){
$erreurs = array();
$a_installer = array();
if (_request('annuler_actions')) {
// Requete : Annulation des actions d'installation en cours
// -- On vide la liste d'actions en cours
set_request('_todo', '');
} elseif (_request('valider_actions')) {
} elseif (_request('rechercher')) {
// annuler les selections si nouvelle recherche
set_request('ids_paquet', array());
} else {
// Requete : Installation d'un ou de plusieurs plugins
// -- On construit le tableau des ids de paquets conformement a l'interface du decideur
if (_request('installer')) {
// L'utilisateur a demande une installation multiple de paquets
// -- on verifie la liste des id_paquets uniquement
if ($id_paquets = _request('ids_paquet')) {
foreach ($id_paquets as $_id_paquet)
$a_installer[$_id_paquet] = 'geton';
}
}
else {
// L'utilisateur a demande l'installation d'un paquet en cliquant sur le bouton en regard
// du resume du plugin -> installer_paquet
if ($install = _request('installer_paquet'))
if ($id_paquet = key($install))
$a_installer[$id_paquet] = 'geton';
}
if (!$a_installer)
$erreurs = _T('svp:message_nok_aucun_plugin_selectionne');
else {
// On fait appel au decideur pour determiner la liste exacte des commandes apres
// verification des dependances
include_spip('inc/svp_decider');
svp_decider_verifier_actions_demandees($a_installer, $erreurs);
}
}
return $erreurs;
}
function formulaires_charger_plugin_traiter_dist(){
$retour = array();
if (_request('rechercher') OR _request('annuler_actions')) {
}
elseif (_request('valider_actions')) {
#refuser_traiter_formulaire_ajax();
// Ajout de la liste des actions à l'actionneur
// c'est lui qui va effectuer rellement les actions
// lors de l'appel de action/actionner
$actions = unserialize(_request('_todo'));
include_spip('inc/svp_actionner');
svp_actionner_traiter_actions_demandees($actions, $retour);
}
$retour['editable'] = true;
return $retour;
}
?>

+ 80
- 0
formulaires/configurer_svp.html View File

@ -0,0 +1,80 @@
<div class='formulaire_spip formulaire_configurer formulaire_configurer_#FORM' id='formulaire_configurer_#FORM'>
<h3 class='titrem'><:svp:titre_form_configurer_svp:></h3>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<form method="post" action="#SELF"><div>
#ACTION_FORMULAIRE
<fieldset>
<legend><:svp:fieldset_fonctionnement:></legend>
<ul>
#SET{name,mode_runtime}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label><:svp:config_activer_runtime:></label>
<div class='explication'><:svp:config_activer_runtime_explication:></div>[
<span class='erreur_message'>(#GET{erreurs})</span>
]<div class="choix">
<input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui"
[(#ENV{#GET{name}}|!={non}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label>
</div>
<div class="choix">
<input type="radio" name="#GET{name}" id="#GET{name}_non" value="non"
[(#ENV{#GET{name}}|=={non}|oui)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label>
</div>
</li>
<ul>
</fieldset>
<fieldset>
<legend><:svp:fieldset_debug:></legend>
<ul>
#SET{name,mode_pas_a_pas}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label><:svp:config_activer_pas_a_pas:></label>
<div class='explication'><:svp:config_activer_pas_a_pas_explication:></div>[
<span class='erreur_message'>(#GET{erreurs})</span>
]<div class="choix">
<input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui"
[(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label>
</div>
<div class="choix">
<input type="radio" name="#GET{name}" id="#GET{name}_non" value="non"
[(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label>
</div>
</li>
#SET{name,mode_log_verbeux}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label><:svp:config_activer_log_verbeux:></label>
<div class='explication'><:svp:config_activer_log_verbeux_explication:></div>[
<span class='erreur_message'>(#GET{erreurs})</span>
]<div class="choix">
<input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui"
[(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label>
</div>
<div class="choix">
<input type="radio" name="#GET{name}" id="#GET{name}_non" value="non"
[(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label>
</div>
</li>
#SET{name,autoriser_activer_paquets_obsoletes}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label><:svp:config_autoriser_activer_paquets_obsoletes:></label>
<div class='explication'><:svp:config_autoriser_activer_paquets_obsoletes_explication:></div>[
<span class='erreur_message'>(#GET{erreurs})</span>
]<div class="choix">
<input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui"
[(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label>
</div>
<div class="choix">
<input type="radio" name="#GET{name}" id="#GET{name}_non" value="non"
[(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label>
</div>
</li>
<ul>
</fieldset>
<p class='boutons'><input class='submit' type="submit" name="_cfg_ok" value="<:bouton_enregistrer:>" /></p>
</div></form>
</div>

+ 48
- 0
formulaires/editer_depot.html View File

@ -0,0 +1,48 @@
<div class="formulaire_spip formulaire_editer formulaire_editer_depot formulaire_editer_depot-#ENV{id_depot}">
<!-- <br class='bugajaxie' /> -->
[<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}' enctype='multipart/form-data'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#ACTION_FORMULAIRE{#ENV{action}}
<ul>
<li class="editer_titre obligatoire[(#ENV**{erreurs}|table_valeur{titre}|oui) erreur]">
<label for="titre"><:info_titre:></label>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{titre})</span>]
<input type='text' class='text' name='titre' id='titre'[ lang='(#LANGUE)'] value="[(#ENV**{titre,#VAL{<:svp:titre_nouveau_depot:>}})]"
[(#ENV{titre,''}|non)onfocus="if(!antifocus){this.value='';antifocus=true;}"]/>
</li>
<li class="editer_descriptif[ (#ENV**{erreurs}|table_valeur{descriptif}|oui) erreur]">
<label for="descriptif"><:info_descriptif:></label>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{descriptif})</span>]
<textarea name='descriptif' id='descriptif'[ lang='(#LANGUE)'] rows='12' cols='40'>[(#ENV**{descriptif})]</textarea>
</li>
<li class="fieldset">
<fieldset><ul>
<li class="editer_type[(#ENV**{erreurs}|table_valeur{type}|oui) erreur]">
<label><:svp:label_type_depot:></label>
<div class="choix">
<input type="radio" value="svn" id="type_svn" class="radio" name="type" [(#ENV{type, svn}|=={svn}|oui) checked="checked"] />
<label for="type_svn"><:svp:label_type_depot_svn:></label>
</div>
<div class="choix">
<input type="radio" value="git" id="type_git" class="radio" name="type" [(#ENV{type, svn}|=={git}|oui) checked="checked"] />
<label for="type_git"><:svp:label_type_depot_git:></label>
</div>
<div class="choix">
<input type="radio" value="manuel" id="type_manuel" class="radio" name="type" [(#ENV{type, svn}|=={manuel}|oui) checked="checked"] />
<label for="type_manuel"><:svp:label_type_depot_manuel:></label>
</div>
</li>
</ul></fieldset>
</li>
</ul>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
<p class='boutons'><input type='submit' name="save" class='submit' value='<:bouton_enregistrer:>' /></p>
</div></form>
]
</div>

+ 33
- 0
formulaires/editer_depot.php View File

@ -0,0 +1,33 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/editer');
// http://doc.spip.org/@inc_editer_article_dist
function formulaires_editer_depot_charger_dist($id_depot, $redirect){
$valeurs = formulaires_editer_objet_charger('depot', $id_depot, 0, 0, $redirect, 'depots_edit_config');
return $valeurs;
}
function formulaires_editer_depot_verifier_dist($id_depot, $redirect){
$erreurs = formulaires_editer_objet_verifier('depot', $id_depot, array('titre'));
return $erreurs;
}
// http://doc.spip.org/@inc_editer_article_dist
function formulaires_editer_depot_traiter_dist($id_depot, $redirect){
return formulaires_editer_objet_traiter('depot', $id_depot, 0, 0, $redirect);
}
function depots_edit_config($row)
{
global $spip_ecran, $spip_lang;
$config = $GLOBALS['meta'];
$config['lignes'] = ($spip_ecran == "large") ? 8 : 5;
$config['langue'] = $spip_lang;
return $config;
}
?>

+ 115
- 0
formulaires/inc-admin_plugin.html View File

@ -0,0 +1,115 @@
#SET{vspip, #EVAL{$GLOBALS['spip_version_branche']}}
<B_plugins>
<div class="liste plugins">
<ul class="liste-items">
<BOUCLE_plugins(PAQUETS plugins){tout}{par multi nom, prefixe}{!par constante, actif}{id_depot=0}{actif ?}{constante ?IN #ENV{constante}}>
#SET{incompatible, #COMPATIBILITE_SPIP|plugin_version_compatible{#GET{vspip}}|non}
<li class="item[ (#ACTIF|=={oui}|?{actif,inactif})][(#OBSOLETE|=={oui}|ou{#GET{incompatible}}|oui) disabled][(#CONSTANTE|=={_DIR_EXTENSIONS}|oui) verrou][(#MAJ_VERSION|oui) up]"[ id="(#PREFIXE|strtolower)-#COMPTEUR_BOUCLE"]>
[(#OBSOLETE|=={non}|et{#CONSTANTE|!={_DIR_EXTENSIONS}}|et{#GET{incompatible}|non}|oui)
<div class="check">
<input type="checkbox" class="checkbox select_plugin" name="ids_paquet[(#VAL{91}|chr)][(#VAL{93}|chr)]" value="#ID_PAQUET" />
</div>]
[(#REM) <!-- Resume du plugin -->]
<div class="resume">
<h3 class="nom"><a[ href="(#VERSION)"] rel="info">[(#NOM|extraire_multi)]</a></h3>
<span class="version">[(#VERSION)]</span>
<span class="etat">[ - (#ETAT)]</span>
[<span class="information"> - (#OBSOLETE|=={oui}|oui)<:svp:info_plugin_obsolete:></span>]
[<span class="information"> - (#GET{incompatible}|oui)<:svp:info_plugin_incompatible:></span>]
<div class="short">[(#SLOGAN|extraire_multi|typo)]</div>
[(#LOGO|oui)<div class="icon">
[(#ACTIF|=={oui}|?{
#CONSTANTE|constant|concat{#SRC_ARCHIVE/#LOGO}|image_reduire{32},
#CONSTANTE|constant|concat{#SRC_ARCHIVE/#LOGO}|image_reduire{32}|image_sepia{#dddddd}
})]
</div>]
</div>
<div class="actions">
[(#REM) on peut desactiver un plugin - qu'il soit obsolete ou pas ]
[(#CONSTANTE|!={_DIR_EXTENSIONS}|et{#GET{incompatible}|non}|oui)
[(#ACTIF|=={oui}|oui)
<input type="submit" name="[(#ID_PAQUET|svp_nom_action{off})]" class="submit" value="<:svp:bouton_desactiver:>" />
[(#INSTALLE|=={oui}|et{#AUTORISER{webmestre}}|oui)
<input type="submit" name="[(#ID_PAQUET|svp_nom_action{stop})]" class="submit" value="<:svp:bouton_desinstaller:>" />
]
]
]
[(#OBSOLETE|=={non}|et{#CONSTANTE|!={_DIR_EXTENSIONS}}|et{#GET{incompatible}|non}|oui)
[(#ACTIF|=={oui}|non)
<input type="submit" name="[(#ID_PAQUET|svp_nom_action{on})]" class="submit" value="<:svp:bouton_activer:>" />
]
[(#MAJ_VERSION|oui)
<input type="submit" name="[(#ID_PAQUET|svp_nom_action{up})]" class="submit" value="<:svp:bouton_up:>" />
]
]
[(#REM) si la configuration le permet, on peut activer un plugin obsolete ]
[(#OBSOLETE|=={oui}|et{#CONSTANTE|!={_DIR_EXTENSIONS}}|et{#GET{incompatible}|non}|oui)
[(#ACTIF|=={oui}|non|et{#CONFIG{svp/autoriser_activer_paquets_obsoletes}|=={oui}})
<input type="submit" name="[(#ID_PAQUET|svp_nom_action{on})]" class="submit" value="<:svp:bouton_activer:>" />
]
]
[(#ACTIF|=={oui}|non|et{[(#SRC_ARCHIVE|couper{5}|=={auto/})]})
<input type="submit" name="[(#ID_PAQUET|svp_nom_action{kill})]" class="submit" value="<:svp:bouton_supprimer:>" />
]
[(#CONSTANTE|=={_DIR_EXTENSIONS}|oui)
<span class="information"><:svp:info_verrouille:></span>
]
</div>
[(#ACTIF|=={oui}|oui) #SET{prefixe,#PREFIXE|strtolower}
[(#INCLURE{fond=prive/squelettes/inclure/cfg,script=configurer_#GET{prefixe},nom=#NOM})]
]
[(#MAJ_VERSION|oui)
[(#CHEMIN_IMAGE{update-16.png}|balise_img{<:svp:plugin_info_up:>,picto_up}|inserer_attribut{title,<:svp:plugin_info_up{version=#MAJ_VERSION}:>})]
]
[(#OBSOLETE|=={oui}|ou{#GET{incompatible}}|oui)
[(#OBSOLETE|=={oui}|oui) [(#SET{err, <:svp:info_plugin_obsolete:>})]]
[(#GET{incompatible}|oui) [(#SET{err, <:svp:info_plugin_incompatible:>})]]
[(#CHEMIN_IMAGE{plugin-dis-16.png}|balise_img{#GET{err}, picto_err}|inserer_attribut{title, #GET{err}})]
]
<div class="details" style="display:none">
<dl class="description">
<dd class="desc">
[(#DESCRIPTION|extraire_multi|propre)]
[<em class="site">
<a href="(#LIEN_DOC)" class="spip_out" title="<:svp:bulle_aller_documentation:>"><:en_savoir_plus:></a>
</em>]
</dd>
[<dt class="auteurs"><:public:par_auteur:></dt>
<dd class="auteurs">(#AUTEUR*|svp_afficher_credits)</dd>]
[<dt class="licence"><:intitule_licence:></dt>
<dd class="licence">(#LICENCE|svp_afficher_credits{','})</dd>]
</dl>
[(#AUTORISER{webmestre}|oui)
<dl class="tech">
<dt><:version:></dt>
<dd>#VERSION[ SVN [(#VAL{91}|chr)](#CONSTANTE|constant|concat{#SRC_ARCHIVE/}|version_svn_courante|abs|sinon{''})[(#VAL{93}|chr)]]</dd>
<dt><:repertoire_plugins:></dt>
<dd>[(#CONSTANTE|constant|concat{#SRC_ARCHIVE/}|joli_repertoire)]</dd>
[<dt><:plugin_info_necessite:></dt>
<dd>(#DEPENDANCES|svp_afficher_dependances{necessite}|supprimer_tags)</dd>]
</dl>
</div>]
</li>
</BOUCLE_plugins>
</ul>
</div>
</B_plugins>
<script type="text/javascript">
//<![CDATA[
jQuery(function(){
jQuery('.plugins li.item a[rel=info]').click(function(){
var li = jQuery(this).parents('li').eq(0);
if (jQuery('div.details',li).toggle().is(':visible'))
li.addClass('on');
else
li.removeClass('on');
return false;
});
jQuery('.plugins li.item input.checkbox').change(function(){
jQuery(this).parents('form').eq(0).find('.boutons').slideDown();
});
});
//]]>
</script>

+ 62
- 0
formulaires/inc-confirmer_actions.html View File

@ -0,0 +1,62 @@
<input type="hidden" name="_todo" class='hidden' value="[(#ENV{_todo})]" />
[<div class="reponse_formulaire reponse_formulaire_erreur">
(#ENV**{erreurs}|table_valeur{decideur_erreurs}|foreach{svp_presenter_actions})
</div>]
[<div id="charger_plugin_confirm">
<div class="reponse_formulaire reponse_formulaire_ok">
<strong><:svp:actions_demandees:></strong>
<ul>(#ENV**{erreurs}|table_valeur{decideur_demandes}|foreach{svp_presenter_actions})</ul>
</div>
[<div class="reponse_formulaire reponse_formulaire_ok">
<strong><:svp:actions_necessaires:></strong>
<ul>(#ENV**{erreurs}|table_valeur{decideur_propositions}|foreach{svp_presenter_actions})</ul>
</div>]
<p class="boutons">
<input type="submit" name="annuler_actions" class="submit annuler_actions" value="<:bouton_annuler:>" />
<input type="submit" name="valider_actions" class="submit valider_actions" value="<:bouton_valider:>" />
</p>
<script type="text/javascript">
[(#REM)
Fonctionnement du JS.
- overlayClose // pas de click en dehors des éléments prévus
- onComplete // le chargement et fait : si l'on clique les boutons du formulaire
// mis dans la modale, on leur ajoute une classe 'fire'
// et on lance la fermeture de la boite
- onCleanup // avant la fermeture... on verifie que 'fire' est bien là
// sinon c'est qu'on a appuyé ESC ou cliqué X
// dans ce cas on met 'fire' sur annuler
- onClose // apres la fermeture, on clique le bouton ayant 'fire'
]
<!--
(function($){
$(function(){
if ($.modalbox !== 'undefined') {
$.modalboxload('#charger_plugin_confirm', {
overlayClose: false, // pas de click en dehors
onComplete: function() {
$('#cboxLoadedContent .boutons .submit').click(function(){
$(this).addClass('fire'); $.mediaboxClose();
});
},
onCleanup: function() {
if (!$('#charger_plugin_confirm .boutons .submit.fire').length) {
$('#charger_plugin_confirm .boutons .submit.annuler_actions').addClass('fire');
}
$('#charger_plugin_confirm').hide();
},
onClose: function() { $('#charger_plugin_confirm .submit.fire').click(); }
});
}
});
})(jQuery);
-->
</script>
</div>]

+ 78
- 0
formulaires/inc-plugins_trouves.html View File

@ -0,0 +1,78 @@
[(#SET{plugins,#ARRAY})]
[(#ENV{phrase}|ou{#ENV{depot}}|ou{#ENV{categorie}}|ou{#ENV{etat}}|ou{#ENV{exclusion}}|ou{#ENV{doublon}}|oui)
[(#SET{plugins,[(#ENV{phrase}|construire_recherche_plugins{#ENV{categorie}, #ENV{etat}, #ENV{depot}, #ENV{exclusion}, #ENV{doublon}})]})]
[(#SET{nb,[(#GET{plugins}|count)]})]
[(#SET{tri,[(#GET{phrase}|?{score,nom})]})]
[(#GET{nb}|oui)<p class="explication"><:svp:message_ok_plugins_trouves{nb_plugins=#GET{nb},tri=#GET{tri}}:></p>]
[(#GET{nb}|non)<p class="explication"><:svp:message_ok_aucun_plugin_trouve:></p>]
]
<B_plugins_trouves>
<div class="liste plugins distants">
<ul class="liste-items">
<BOUCLE_plugins_trouves(DATA) {source table, #GET{plugins}}>
<li class="item[(#VALEUR{installe}|oui) installe]"[ id="(#VALEUR{prefixe}|strtolower)-#COMPTEUR_BOUCLE-#VALEUR{score}"]>
[(#REM) <!-- Checkbox action multiple -->]
[(#VALEUR{installe}|non)
<div class="check">
<input type="checkbox" class="checkbox" name="ids_paquet[(#VAL{91}|chr)][(#VAL{93}|chr)]" value="#ID_PAQUET"
[(#ID_PAQUET|in_any{#ENV{ids_paquet}}) checked="checked"] />
</div>
]
[(#REM) <!-- Resume du plugin -->]
<div class="resume">
<h3 class="nom"><a[ href="(#VALEUR{version})"] rel="info">[(#VALEUR{nom}|extraire_multi)]</a></h3>
<span class="version">[(#VALEUR{version})]</span>
<span class="etat">[ - (#VALEUR{etat})]</span>
[<span class="information"> - (#VALEUR{installe}|oui)<:svp:info_plugin_installe:></span>]
<div class="short">[(#VALEUR{slogan}|extraire_multi)]</div>
<div class="icon">[(#VALEUR{logo}|image_reduire{32})]</div>
</div>
[(#REM) <!-- Details du plugin -->]
<div class="details" style="display:none">
<dl>
<dd class="desc">
[(#VALEUR{description}|extraire_multi|propre)]
[<em class="site">
<a href="(#LIEN_DOC)" class="spip_out" title="<:svp:bulle_aller_documentation:>"><:en_savoir_plus:></a>
</em>]
</dd>
[<dt class="auteurs"><:public:par_auteur:></dt>
<dd class="auteurs">(#AUTEUR*|svp_afficher_credits)</dd>]
[<dt class="licence"><:intitule_licence:></dt>
<dd class="licence">(#LICENCE|svp_afficher_credits{','})</dd>]
</dl>
</div>
</li>
</BOUCLE_plugins_trouves>
</ul>
</div>
</B_plugins_trouves>
<script type="text/javascript">
//<![CDATA[
jQuery(function(){
jQuery('.plugins li.item a[rel=info]').click(function(){
var li = jQuery(this).parents('li').eq(0);
if (jQuery('div.details',li).toggle().is(':visible'))
li.addClass('on');
else
li.removeClass('on');
return false;
});
[(#REM) Déplier le bouton 'installer' et mettre le submit en premier dans le form
pour que l'appuie de la touche entree valide.
Le supprimer si l'on change un critere de recherche. ]
jQuery('.plugins li.item input.checkbox').change(function(){
$form = jQuery(this).parents('form').eq(0);
if (!$form.find('> input.submit').length) {
$form.find('.boutons.actions').slideDown().find('input.submit').clone().addClass('invisible').prependTo($form);
$form.find('.liste-recherche').change(function(){
jQuery(this).parents('form').eq(0).find('> input.submit').remove();
});
}
});
});
//]]>
</script>

+ 13
- 0
formulaires/inc-select_categorie.html View File

@ -0,0 +1,13 @@
<B_categories>
<select name="categorie" id="categorie">
<option value="toute_categorie"[ (#ENV{categorie}|=={toute_categorie}|oui)selected="selected"]>
<:svp:option_categorie_toute:>
</option>
<BOUCLE_categories(DATA) {source table, #SVP_CATEGORIES}>
[(#CLE|!={aucune}|oui)
<option value="#CLE"[ (#ENV{categorie}|=={#CLE}|oui)selected="selected"]>
#VALEUR
</option>]
</BOUCLE_categories>
</select>
</B_categories>

+ 6
- 0
formulaires/inc-select_depot.html View File

@ -0,0 +1,6 @@
<select name="depot" id="depot">
<option value="tout_depot"[ (#ENV{depot}|=={tout_depot}|oui)selected="selected"]><:svp:option_depot_tout:></option>
<BOUCLE_depots(DEPOTS) {par titre}>
<option[ value="(#ID_DEPOT)"][ (#ENV{depot}|=={#ID_DEPOT}|oui)selected="selected"]>#TITRE</option>
</BOUCLE_depots>
</select>

+ 20
- 0
genie/svp_actualiser_depots.php View File

@ -0,0 +1,20 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function genie_svp_actualiser_depots_dist ($last) {
include_spip('inc/svp_depoter_distant');
// On recupere en base de donnees tous les depots a mettre a jour
if ($resultats = sql_select('id_depot', 'spip_depots')) {
// On boucle sur chaque depot en appelant la fonction d'actualisation
while ($depot = sql_fetch($resultats)) {
svp_actualiser_depot($depot['id_depot']);
spip_log("ACTION ACTUALISER DEPOT (automatique) : id_depot = ". $depot['id_depot'], 'svp_actions.' . _LOG_INFO);
}
}
return 1;
}
?>

+ 28
- 0
genie/svp_taches_generales_cron.php View File

@ -0,0 +1,28 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
// Mise a jour automatique des depots (CRON)
// - Flag de declenchement
if (!defined('_SVP_CRON_ACTUALISATION_DEPOTS')) {
define('_SVP_CRON_ACTUALISATION_DEPOTS', true);
}
// - Periode d'actualisation en nombre d'heures (de 1 a 24)
if (!defined('_SVP_PERIODE_ACTUALISATION_DEPOTS')) {
define('_SVP_PERIODE_ACTUALISATION_DEPOTS', 6);
}
function svp_taches_generales_cron($taches_generales) {
// Ajout de la tache CRON de mise a jour reguliere de tous les depots de la base
// Par defaut, toutes les 6h
// Conditionnee a la variable de configuration
if (_SVP_CRON_ACTUALISATION_DEPOTS)
$taches_generales['svp_actualiser_depots'] = _SVP_PERIODE_ACTUALISATION_DEPOTS*3600;
return $taches_generales;
}
?>

+ 3557
- 0
inc/pcltar.php
File diff suppressed because it is too large
View File


+ 1061
- 0
inc/svp_actionner.php
File diff suppressed because it is too large
View File


+ 730
- 0
inc/svp_decider.php View File

@ -0,0 +1,730 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('plugins/installer'); // pour spip_version_compare()
include_spip('inc/svp_rechercher'); // svp_verifier_compatibilite_spip()
# include_spip('inc/plugin'); // plugin_version_compatible() [inclu dans svp_rechercher]
class Decideur