Browse Source

préparation pour l'import (pas encopre fonctionnel) : ajout des champs extras + objet chapitre

utilisation des compositions pour les différentes pages : émissions,
chroniques
master
chankalan 3 months ago
parent
commit
db8a2ffede
  1. 118
      action/supprimer_chapitre.php
  2. 216
      base/libreavous.php
  3. 66
      formulaires/editer_chapitre.html
  4. 137
      formulaires/editer_chapitre.php
  5. 66
      lang/chapitre_fr.php
  6. 14
      lang/paquet-libreavous_fr.php
  7. 99
      libreavous_administrations.php
  8. 121
      libreavous_autorisations.php
  9. 185
      libreavous_fonctions.php
  10. 99
      libreavous_pipelines.php
  11. 16
      paquet.xml
  12. 62
      prive/objets/contenu/chapitre.html
  13. 22
      prive/objets/infos/chapitre.html
  14. 34
      prive/objets/liste/chapitres.html
  15. 56
      prive/squelettes/contenu/chapitre.html
  16. 36
      prive/squelettes/contenu/chapitre_edit.html
  17. 10
      prive/squelettes/hierarchie/chapitre.html
  18. 1
      prive/squelettes/hierarchie/chapitre_edit.html
  19. 20
      saisies-vues/chapitres.html
  20. 13
      saisies/chapitres.html
  21. 69
      squelettes/content/article-chronique.html
  22. 108
      squelettes/content/article-emission.html
  23. 5
      squelettes/content/article-emission.xml
  24. 25
      squelettes/content/article.html
  25. 24
      squelettes/content/chronique.html
  26. 14
      squelettes/content/importer.html
  27. 3
      squelettes/content/rubrique-chroniques.html
  28. 6
      squelettes/content/rubrique-chroniques.xml
  29. 6
      squelettes/content/rubrique-emission.xml
  30. 3
      squelettes/content/rubrique-emissions.html
  31. 6
      squelettes/content/rubrique-emissions.xml
  32. 7
      squelettes/head/article-emission.html
  33. 3
      squelettes/javascript/podlove/embed.js
  34. 6
      squelettes/modeles/importer.html
  35. 6
      squelettes/modeles/rubrique_importer.html
  36. 6
      squelettes/scss/styles/_perso.scss

118
action/supprimer_chapitre.php

@ -0,0 +1,118 @@
<?php
/**
* Utilisation de l'action supprimer pour l'objet chapitre
*
* @plugin chapitre
* @copyright 2021
* @author chankalan,vcalame
* @licence GNU/GPL
* @package SPIP\Chapitre\Action
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Action pour supprimer un·e chapitre
*
* Vérifier l'autorisation avant d'appeler l'action.
*
* @example
* ```
* [(#AUTORISER{supprimer, chapitre, #ID_CHAPITRE}|oui)
* [(#BOUTON_ACTION{<:chapitre:supprimer_chapitre:/>,
* #URL_ACTION_AUTEUR{supprimer_chapitre, #ID_CHAPITRE, #URL_ECRIRE{chapitres}},
* danger, <:chapitre:confirmer_supprimer_chapitre:/>})]
* ]
* ```
*
* @example
* ```
* [(#AUTORISER{supprimer, chapitre, #ID_CHAPITRE}|oui)
* [(#BOUTON_ACTION{
* [(#CHEMIN_IMAGE{chapitre-del-24.png}|balise_img{<:chapitre:supprimer_chapitre:/>}|concat{' ',#VAL{<:chapitre:supprimer_chapitre:/>}|wrap{<b>}}|trim)],
* #URL_ACTION_AUTEUR{supprimer_chapitre, #ID_CHAPITRE, #URL_ECRIRE{chapitres}},
* icone s24 horizontale danger chapitre-del-24, <:chapitre:confirmer_supprimer_chapitre:/>})]
* ]
* ```
*
* @example
* ```
* if (autoriser('supprimer', 'chapitre', $id_chapitre)) {
* $supprimer_chapitre = charger_fonction('supprimer_chapitre', 'action');
* $supprimer_chapitre($id_chapitre);
* }
* ```
*
* @param null|int $arg
* Identifiant à supprimer.
* En absence de id utilise l'argument de l'action sécurisée.
**/
function action_supprimer_chapitre_dist($arg=null) {
$need_confirm = false;
if (is_null($arg)){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$need_confirm = true;
}
$arg = intval($arg);
if ($need_confirm){
$ok = confirmer_supprimer_chapitre_avant_action(_T('chapitre:confirmer_supprimer_chapitre'), _T('item_oui') . '! ' . _T('chapitre:supprimer_chapitre'));
}
// cas suppression
if (autoriser('supprimer', 'chapitre', $arg)) {
if ($arg) {
$objet = sql_fetsel('*', 'spip_chapitres', 'id_chapitre=' . sql_quote($arg));
$qui = (!empty($GLOBALS['visiteur_session']['id_auteur']) ? 'auteur #' . $GLOBALS['visiteur_session']['id_auteur'] : 'IP ' . $GLOBALS['ip']);
spip_log("SUPPRESSION chapitre#$arg par $qui : " . json_encode($objet), "suppressions" . _LOG_INFO_IMPORTANTE);
sql_delete('spip_chapitres', 'id_chapitre=' . sql_quote($arg));
// invalider le cache
include_spip('inc/invalideur');
suivre_invalideur("id='chapitre/$arg'");
}
else {
spip_log("action_supprimer_chapitre_dist $arg pas compris");
}
}
}
/**
* Confirmer avant suppression si on arrive par un bouton action
* @param string $titre
* @param string $titre_bouton
* @param string|null $url_action
* @return bool
*/
function confirmer_supprimer_chapitre_avant_action($titre, $titre_bouton, $url_action=null) {
if (!$url_action) {
$url_action = self();
$action = _request('action');
$url_action = parametre_url($url_action, 'action', $action, '&');
}
else {
$action = parametre_url($url_action, 'action');
}
$arg = parametre_url($url_action, 'arg');
$confirm = md5("$action:$arg:".realpath(__FILE__));
if (_request('confirm_action') === $confirm) {
return true;
}
$url_confirm = parametre_url($url_action, "confirm_action", $confirm, '&');
include_spip("inc/filtres");
$bouton_action = bouton_action($titre_bouton, $url_confirm);
$corps = "<div style='text-align:center;'>$bouton_action</div>";
include_spip("inc/minipres");
echo minipres($titre,$corps);
exit;
}

216
base/libreavous.php

@ -0,0 +1,216 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
// des champs extras sur les articles
function libreavous_declarer_champs_extras($champs = array()) {
// Table : spip_articles
if (isset($champs['spip_articles']) and !is_array($champs['spip_articles'])) {
$champs['spip_articles'] = array();
}
$champs['spip_articles']['podcast_code'] = array(
'saisie' => 'input',
'options' => array(
'nom' => 'podcast_code',
'label' => 'Code',
'type' => 'text',
'size' => '40',
'autocomplete' => 'defaut',
'sql' => 'text DEFAULT \'\' NOT NULL',
),
'verifier' => array(
),
);
$champs['spip_articles']['podcast_duree'] = array(
'saisie' => 'input',
'options' => array(
'nom' => 'podcast_duree',
'label' => 'Durée',
'type' => 'text',
'size' => '40',
'autocomplete' => 'defaut',
'sql' => 'text DEFAULT \'\' NOT NULL',
),
'verifier' => array(
),
);
$champs['spip_articles']['podcast_mp3'] = array(
'saisie' => 'input',
'options' => array(
'nom' => 'podcast_mp3',
'label' => 'Taille mp3',
'type' => 'text',
'size' => '40',
'autocomplete' => 'defaut',
'sql' => 'text DEFAULT \'\' NOT NULL',
),
'verifier' => array(
),
);
$champs['spip_articles']['podcast_ogg'] = array(
'saisie' => 'input',
'options' => array(
'nom' => 'podcast_ogg',
'label' => 'Taille Ogg',
'type' => 'text',
'size' => '40',
'autocomplete' => 'defaut',
'sql' => 'text DEFAULT \'\' NOT NULL',
),
'verifier' => array(
),
);
$champs['spip_articles']['podcast_transcription'] = array(
'saisie' => 'input',
'options' => array(
'nom' => 'podcast_transcription',
'label' => 'Lien transcription',
'type' => 'text',
'size' => '40',
'autocomplete' => 'defaut',
'sql' => 'text DEFAULT \'\' NOT NULL',
),
'verifier' => array(
),
);
$champs['spip_articles']['podcast_personnes'] = array(
'saisie' => 'textarea',
'options' => array(
'nom' => 'podcast_personnes',
'label' => 'Personnes participantes',
'rows' => '5',
'cols' => '40',
'sql' => 'text DEFAULT \'\' NOT NULL',
),
'verifier' => array(
),
);
$champs['spip_articles']['podcast_galeriephotos'] = array(
'saisie' => 'textarea',
'options' => array(
'nom' => 'podcast_galeriephotos',
'label' => 'Galerie Photos',
'rows' => '5',
'cols' => '40',
'sql' => 'text DEFAULT \'\' NOT NULL',
),
'verifier' => array(
),
);
$champs['spip_articles']['podcast_musique'] = array(
'saisie' => 'textarea',
'options' => array(
'nom' => 'podcast_musique',
'label' => 'Pauses musicales',
'rows' => '5',
'cols' => '40',
'sql' => 'text DEFAULT \'\' NOT NULL',
),
'verifier' => array(
),
);
$champs['spip_articles']['drupal_guid'] = array(
'saisie' => 'input',
'options' => array(
'nom' => 'drupal_guid',
'label' => 'GUID Drupral',
'type' => 'text',
'size' => '40',
'autocomplete' => 'defaut',
'sql' => 'text DEFAULT \'\' NOT NULL',
),
'verifier' => array(
),
);
$champs['spip_articles']['drupal_pubdate'] = array(
'saisie' => 'input',
'options' => array(
'nom' => 'drupal_pubdate',
'label' => 'PubDate Drupal',
'type' => 'text',
'size' => '40',
'autocomplete' => 'defaut',
'sql' => 'text DEFAULT \'\' NOT NULL',
),
'verifier' => array(
),
);
return $champs;
}
// un nouvel objet chapitre
/**
* Déclaration des alias de tables et filtres automatiques de champs
*
* @pipeline declarer_tables_interfaces
* @param array $interfaces
* Déclarations d'interface pour le compilateur
* @return array
* Déclarations d'interface pour le compilateur
*/
function libreavous_declarer_tables_interfaces($interfaces) {
$interfaces['table_des_tables']['chapitres'] = 'chapitres';
return $interfaces;
}
/**
* Déclaration des objets éditoriaux
*
* @pipeline declarer_tables_objets_sql
* @param array $tables
* Description des tables
* @return array
* Description complétée des tables
*/
function libreavous_declarer_tables_objets_sql($tables) {
$tables['spip_chapitres'] = array(
'type' => 'chapitre',
'principale' => 'oui',
'field'=> array(
'id_chapitre' => 'bigint(21) NOT NULL',
'id_article' => 'bigint(21) NOT NULL DEFAULT 0',
'titre' => 'tinytext NOT NULL DEFAULT ""',
'code' => 'tinytext NOT NULL DEFAULT ""',
'code_fichier' => 'tinytext NOT NULL DEFAULT ""',
'code_podcast' => 'varchar(255) NOT NULL DEFAULT ""',
'debut' => 'varchar(25) NOT NULL DEFAULT ""',
'fin' => 'varchar(25) NOT NULL DEFAULT ""',
'type_sujet' => 'varchar(25) NOT NULL DEFAULT ""',
'chronique' => 'varchar(255) NOT NULL DEFAULT ""',
'mp3' => 'varchar(255) NOT NULL DEFAULT ""',
'ogg' => 'varchar(255) NOT NULL DEFAULT ""',
'drupal_guid' => 'varchar(255) NOT NULL DEFAULT ""',
'drupal_pubdate' => 'varchar(255) NOT NULL DEFAULT ""',
'maj' => 'timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'
),
'key' => array(
'PRIMARY KEY' => 'id_chapitre',
'KEY id_article' => 'id_article',
),
'titre' => 'titre AS titre, "" AS lang',
#'date' => '',
'champs_editables' => array('titre', 'code', 'code_fichier', 'code_podcast', 'debut', 'fin', 'type_sujet', 'chronique', 'mp3', 'ogg', 'drupal_guid', 'drupal_pubdate', 'id_article'),
'champs_versionnes' => array('titre', 'code', 'code_fichier', 'code_podcast', 'debut', 'fin', 'type_sujet', 'chronique', 'mp3', 'ogg', 'drupal_guid', 'drupal_pubdate', 'id_article'),
'rechercher_champs' => array("titre" => 5),
'tables_jointures' => array(),
);
return $tables;
}

66
formulaires/editer_chapitre.html

@ -0,0 +1,66 @@
<div class='formulaire_spip formulaire_editer formulaire_#FORM formulaire_#FORM-#ENV{id_chapitre,nouveau}'>
[<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>
#ACTION_FORMULAIRE
<input type="hidden" name="id_chapitre" value="#ENV{id_chapitre}" />
<input type="hidden" name="id_article" value="#ENV{id_article}" />
<div class="editer-groupe">
[(#SAISIE{input, titre, obligatoire=oui,
label=<:chapitre:champ_titre_label:/>,
explication=<:chapitre:champ_titre_explication:/> })]
[(#SAISIE{input, code,
label=<:chapitre:champ_code_label:/>,
explication=<:chapitre:champ_code_explication:/> })]
[(#SAISIE{input, code_fichier,
label=<:chapitre:champ_code_fichier_label:/>})]
[(#SAISIE{input, code_podcast,
label=<:chapitre:champ_code_podcast_label:/>,
explication=<:chapitre:champ_code_podcast_explication:/> })]
[(#SAISIE{input, debut,
label=<:chapitre:champ_debut_label:/>,
explication=<:chapitre:champ_debut_explication:/> })]
[(#SAISIE{input, fin,
label=<:chapitre:champ_fin_label:/>,
explication=<:chapitre:champ_fin_explication:/> })]
[(#SAISIE{input, type_sujet,
label=<:chapitre:champ_type_sujet_label:/>,
explication=<:chapitre:champ_type_sujet_explication:/> })]
[(#SAISIE{input, chronique,
label=<:chapitre:champ_chronique_label:/>})]
[(#SAISIE{input, mp3,
label=<:chapitre:champ_mp3_label:/>,
explication=<:chapitre:champ_mp3_explication:/> })]
[(#SAISIE{input, ogg,
label=<:chapitre:champ_ogg_label:/>,
explication=<:chapitre:champ_ogg_explication:/> })]
[(#SAISIE{input, drupal_guid,
label=<:chapitre:champ_drupal_guid_label:/>,
explication=<:chapitre:champ_drupal_guid_explication:/> })]
[(#SAISIE{input, drupal_pubdate,
label=<:chapitre:champ_drupal_pubdate_label:/>,
explication=<:chapitre:champ_drupal_pubdate_explication:/> })]
</div>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
<p class="boutons"><input type="submit" class="submit" value="<:bouton_enregistrer|attribut_html:/>" /></p>
</div></form>
]
</div>

137
formulaires/editer_chapitre.php

@ -0,0 +1,137 @@
<?php
/**
* Gestion du formulaire de d'édition de chapitre
*
* @plugin chapitre
* @copyright 2021
* @author chankalan,vcalame
* @licence GNU/GPL
* @package SPIP\Chapitre\Formulaires
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/actions');
include_spip('inc/editer');
/**
* Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
*
* @param int|string $id_chapitre
* Identifiant du chapitre. 'new' pour un nouveau chapitre.
* @param int $id_article
* Identifiant de l'objet parent (si connu)
* @param string $retour
* URL de redirection après le traitement
* @param int $lier_trad
* Identifiant éventuel d'un chapitre source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du chapitre, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return string
* Hash du formulaire
*/
function formulaires_editer_chapitre_identifier_dist($id_chapitre = 'new', $id_article = 0, $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
return serialize(array(intval($id_chapitre)));
}
/**
* Chargement du formulaire d'édition de chapitre
*
* Déclarer les champs postés et y intégrer les valeurs par défaut
*
* @uses formulaires_editer_objet_charger()
*
* @param int|string $id_chapitre
* Identifiant du chapitre. 'new' pour un nouveau chapitre.
* @param int $id_article
* Identifiant de l'objet parent (si connu)
* @param string $retour
* URL de redirection après le traitement
* @param int $lier_trad
* Identifiant éventuel d'un chapitre source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du chapitre, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Environnement du formulaire
*/
function formulaires_editer_chapitre_charger_dist($id_chapitre = 'new', $id_article = 0, $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$valeurs = formulaires_editer_objet_charger('chapitre', $id_chapitre, $id_article, $lier_trad, $retour, $config_fonc, $row, $hidden);
if (!$valeurs['id_article']) {
$valeurs['id_article'] = $id_article;
}
return $valeurs;
}
/**
* Vérifications du formulaire d'édition de chapitre
*
* Vérifier les champs postés et signaler d'éventuelles erreurs
*
* @uses formulaires_editer_objet_verifier()
*
* @param int|string $id_chapitre
* Identifiant du chapitre. 'new' pour un nouveau chapitre.
* @param int $id_article
* Identifiant de l'objet parent (si connu)
* @param string $retour
* URL de redirection après le traitement
* @param int $lier_trad
* Identifiant éventuel d'un chapitre source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du chapitre, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Tableau des erreurs
*/
function formulaires_editer_chapitre_verifier_dist($id_chapitre = 'new', $id_article = 0, $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$erreurs = formulaires_editer_objet_verifier('chapitre', $id_chapitre, array('titre', 'id_article'));
return $erreurs;
}
/**
* Traitement du formulaire d'édition de chapitre
*
* Traiter les champs postés
*
* @uses formulaires_editer_objet_traiter()
*
* @param int|string $id_chapitre
* Identifiant du chapitre. 'new' pour un nouveau chapitre.
* @param int $id_article
* Identifiant de l'objet parent (si connu)
* @param string $retour
* URL de redirection après le traitement
* @param int $lier_trad
* Identifiant éventuel d'un chapitre source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du chapitre, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Retours des traitements
*/
function formulaires_editer_chapitre_traiter_dist($id_chapitre = 'new', $id_article = 0, $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$retours = formulaires_editer_objet_traiter('chapitre', $id_chapitre, $id_article, $lier_trad, $retour, $config_fonc, $row, $hidden);
return $retours;
}

66
lang/chapitre_fr.php

@ -0,0 +1,66 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A
'ajouter_lien_chapitre' => 'Ajouter ce chapitre',
// C
'champ_chronique_label' => 'Chronique',
'champ_code_explication' => 'dans le json = short_chapter_name',
'champ_code_fichier_label' => 'Code du fichier',
'champ_code_label' => 'code',
'champ_code_podcast_explication' => 'Même valeur que le champ \"podcast_code\" d\'un article/émission.',
'champ_code_podcast_label' => 'Code du podcast',
'champ_debut_explication' => 'Début du chapitre (sous la forme 00:00:00.000) (dans le json = start_timestamp)',
'champ_debut_label' => 'debut',
'champ_drupal_guid_explication' => 'GUID du flux RSS Drupal',
'champ_drupal_guid_label' => 'Drupal GUID',
'champ_drupal_pubdate_explication' => 'pubDate du flux RSS actuel',
'champ_drupal_pubdate_label' => 'Drupal pubdate',
'champ_fin_explication' => 'Fin du chapitre (sous la forme 00:00:00.000) (dans le json = end_timestamp)',
'champ_fin_label' => 'fin',
'champ_mp3_explication' => 'Taille du fichier mp3',
'champ_mp3_label' => 'MP3',
'champ_ogg_explication' => 'Taille du fichier ogg',
'champ_ogg_label' => 'OGG',
'champ_titre_explication' => 'dans le json = chapter_title',
'champ_titre_label' => 'titre',
'champ_type_sujet_explication' => 'Nomenclature de deux lettres : SL, SC, CH, AN',
'champ_type_sujet_label' => 'Type de sujet',
'confirmer_supprimer_chapitre' => 'Confirmez-vous la suppression de ce chapitre ?',
// I
'icone_creer_chapitre' => 'Créer un chapitre',
'icone_modifier_chapitre' => 'Modifier ce chapitre',
'info_1_chapitre' => 'Un chapitre',
'info_aucun_chapitre' => 'Aucun chapitre',
'info_chapitres_auteur' => 'Les chapitres de cet auteur',
'info_nb_chapitres' => '@nb@ chapitres',
// R
'retirer_lien_chapitre' => 'Retirer ce chapitre',
'retirer_tous_liens_chapitres' => 'Retirer tous les chapitres',
// S
'supprimer_chapitre' => 'Supprimer ce chapitre',
// T
'texte_ajouter_chapitre' => 'Ajouter un chapitre',
'texte_changer_statut_chapitre' => 'Ce chapitre est :',
'texte_creer_associer_chapitre' => 'Créer et associer un chapitre',
'texte_definir_comme_traduction_chapitre' => 'Ce chapitre est une traduction du chapitre numéro :',
'titre_chapitre' => 'Chapitre',
'titre_chapitres' => 'Chapitres',
'titre_chapitres_rubrique' => 'Chapitres de la rubrique',
'titre_langue_chapitre' => 'Langue de ce chapitre',
'titre_logo_chapitre' => 'Logo de ce chapitre',
'titre_objets_lies_chapitre' => 'Liés à ce chapitre',
'titre_page_chapitres' => 'Les chapitres',
);

14
lang/paquet-libreavous_fr.php

@ -0,0 +1,14 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// C
'libreavous_description' => '',
'libreavous_nom' => '+ Libre à vous !',
'libreavous_slogan' => ' ',
);

99
libreavous_administrations.php

@ -0,0 +1,99 @@
<?php
/**
* Fichier gérant l'installation et désinstallation du plugin chapitre
*
* @plugin chapitre
* @copyright 2021
* @author chankalan,vcalame
* @licence GNU/GPL
* @package SPIP\Chapitre\Installation
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/cextras');
include_spip('base/libreavous');
/**
* Fonction d'installation et de mise à jour du plugin chapitre.
*
* Vous pouvez :
*
* - créer la structure SQL,
* - insérer du pre-contenu,
* - installer des valeurs de configuration,
* - mettre à jour la structure SQL
*
* @param string $nom_meta_base_version
* Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
* @param string $version_cible
* Version du schéma de données dans ce plugin (déclaré dans paquet.xml)
* @return void
**/
function libreavous_upgrade($nom_meta_base_version, $version_cible) {
$maj = array();
# quelques exemples
# (que vous pouvez supprimer !)
#
# $maj['create'] = array(array('creer_base'));
#
# include_spip('inc/config')
# $maj['create'] = array(
# array('maj_tables', array('spip_xx', 'spip_xx_liens')),
# array('ecrire_config', 'chapitre', array('exemple' => "Texte de l'exemple"))
#);
#
# $maj['1.1.0'] = array(array('sql_alter','TABLE spip_xx RENAME TO spip_yy'));
# $maj['1.2.0'] = array(array('sql_alter','TABLE spip_xx DROP COLUMN id_auteur'));
# $maj['1.3.0'] = array(
# array('sql_alter','TABLE spip_xx CHANGE numero numero int(11) default 0 NOT NULL'),
# array('sql_alter','TABLE spip_xx CHANGE texte petit_texte mediumtext NOT NULL default \'\''),
# );
# ...
cextras_api_upgrade(libreavous_declarer_champs_extras(), $maj['0.0.1']);
$maj['0.1.0'] = array(array('maj_tables', array('spip_chapitres')));
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
/**
* Fonction de désinstallation du plugin chapitre.
*
* Vous devez :
*
* - nettoyer toutes les données ajoutées par le plugin et son utilisation
* - supprimer les tables et les champs créés par le plugin.
*
* @param string $nom_meta_base_version
* Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
* @return void
**/
function libreavous_vider_tables($nom_meta_base_version) {
# quelques exemples
# (que vous pouvez supprimer !)
# sql_drop_table('spip_xx');
# sql_drop_table('spip_xx_liens');
cextras_api_vider_tables(libreavous_declarer_champs_extras());
sql_drop_table('spip_chapitres');
# Nettoyer les liens courants (le génie optimiser_base_disparus se chargera de nettoyer toutes les tables de liens)
sql_delete('spip_documents_liens', sql_in('objet', array('chapitre')));
sql_delete('spip_mots_liens', sql_in('objet', array('chapitre')));
sql_delete('spip_auteurs_liens', sql_in('objet', array('chapitre')));
# Nettoyer les versionnages et forums
sql_delete('spip_versions', sql_in('objet', array('chapitre')));
sql_delete('spip_versions_fragments', sql_in('objet', array('chapitre')));
sql_delete('spip_forum', sql_in('objet', array('chapitre')));
effacer_meta($nom_meta_base_version);
}

121
libreavous_autorisations.php

@ -12,3 +12,124 @@ function libreavous_autoriser() {
}
/* Exemple
function autoriser_chapitre_configurer_dist($faire, $type, $id, $qui, $opt) {
// type est un objet (la plupart du temps) ou une chose.
// autoriser('configurer', '_chapitre') => $type = 'chapitre'
// au choix :
return autoriser('webmestre', $type, $id, $qui, $opt); // seulement les webmestres
return autoriser('configurer', '', $id, $qui, $opt); // seulement les administrateurs complets
return $qui['statut'] == '0minirezo'; // seulement les administrateurs (même les restreints)
// ...
}
*/
// restreindre les champs 'array(...)' sur les articles qui portent la composition 'emission'
restreindre_extras('article', array(
'podcast_code',
'podcast_duree',
'podcast_mp3',
'podcast_ogg',
'podcast_transcription',
'podcast_personnes',
'podcast_galeriephotos',
'podcast_musique',
'drupal_guid',
'drupal_pubdate'
), 'emission', 'composition');
// -----------------
// Objet chapitres
/**
* Autorisation de voir (chapitres)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_chapitres_voir_dist($faire, $type, $id, $qui, $opt) {
return true;
}
/**
* Autorisation de voir (chapitre)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_chapitre_voir_dist($faire, $type, $id, $qui, $opt) {
return true;
}
/**
* Autorisation de créer (chapitre)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_chapitre_creer_dist($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo', '1comite'));
}
/**
* Autorisation de modifier (chapitre)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_chapitre_modifier_dist($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo', '1comite'));
}
/**
* Autorisation de supprimer (chapitre)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_chapitre_supprimer_dist($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo', '1comite'));
}
/**
* Autorisation de créer l'élément (chapitre) dans un articles
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_article_creerchapitredans_dist($faire, $type, $id, $qui, $opt) {
return ($id and autoriser('voir', 'articles', $id) and autoriser('creer', 'chapitre'));
}

185
libreavous_fonctions.php

@ -1,7 +1,190 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
return;
}
function filtre_escape_json($texte) {
return str_replace("\"", "\\\"", str_replace("\n", "\\n", str_replace("\n\n", "\n<br><br>\n", $texte)));
}
function filtre_decode_html($texte) {
return html_entity_decode($texte);
}
function filtre_mes_supp_numero($texte) {
$idx = strpos($texte, "-");
return trim(substr($texte, $idx +1));
}
function balise_MES_IMPORT($p) {
$id_rubrique = "''";
$id_secteur = "''";
if (($v = interprete_argument_balise(1,$p))!==NULL){
$id_rubrique = $v;
if (($v = interprete_argument_balise(2,$p))!==NULL) {
$id_secteur = $v;
}
}
$p->code = "mes_Import()";
return $p;
}
function mes_Import_Historique() {
$historique = simplexml_load_file ("/var/www/exemole.fr/libreavous/historique.xml");
foreach ($historique->item as $item) {
$code = $item['code'];
$array = array(
'drupal_guid' => $item['guid'],
'drupal_pubdate' => $item['pubdate']
);
$type = $item['type'];
if ($type == 'emission') {
$existant = sql_select("id_article","spip_articles","podcast_code=".sql_quote($code));
if ($existant and sql_count($existant)>0) {
$r = sql_fetch($existant);
$id_article = $r["id_article"];
sql_updateq("spip_articles", $array, "id_article=".$id_article);
} else {
echo "Émission inconnue = $code<br>" ;
}
} else {
$chapitreExistant = sql_select("id_chapitre","spip_chapitres",array("code_podcast=".sql_quote($code), "code_fichier=".sql_quote($item['chapitre'])));
if ($chapitreExistant and sql_count($chapitreExistant)>0) {
$r = sql_fetch($chapitreExistant);
$id_chapitre = $r["id_chapitre"];
sql_updateq("spip_chapitres", $array, "id_chapitre=".$id_chapitre);
} else {
echo "Chapitre inconnu = $code / fichier = ".$item['chapitre']."<br>" ;
}
}
}
}
function mes_Import($id_rubrique, $id_secteur) {
$emissions = simplexml_load_file ("/var/www/exemole.fr/libreavous/verspip.xml");
foreach ($emissions->emission as $emission) {
$code = $emission["code"];
$emissionArray = array(
'lang' => 'fr',
'surtitre' => $emission["numero"],
'titre' => $emission["numero"].' - '.$emission["titre"],
'soustitre' => "",
'id_rubrique' => $id_rubrique,
'id_secteur' => $id_secteur,
'descriptif' => $emission["description"],
'chapo' => $emission["programme"],
'texte' => $emission["references"],
'ps' => "",
'statut' => 'publie',
'accepter_forum' => 'non',
'date' => mes_toDateIso($emission["code"]),
'podcast_code' => $emission["code"],
'podcast_duree' => $emission["duree"],
'podcast_mp3' => $emission["mp3"],
'podcast_ogg' => $emission["ogg"],
'podcast_transcription' => $emission["transcription"],
'podcast_personnes' => $emission["personnes"],
'podcast_galeriephotos' => $emission["galeriephotos"],
'podcast_musique' => $emission["musique"]
);
$existant = sql_select("id_article","spip_articles","podcast_code=".sql_quote($code));
if ($existant and sql_count($existant)>0) {
$r = sql_fetch($existant);
$id_article = $r["id_article"];
sql_updateq("spip_articles", $emissionArray, "id_article=".$id_article);
} else {
$id_article = sql_insertq("spip_articles", $emissionArray);
}
foreach ($emission->chapitre as $chapitre) {
$code_chapitre = $chapitre["code"];
$chapitreArray = array(
'titre' => $chapitre["titre"],
'code' => $chapitre["code"],
'id_article' => $id_article,
'code_fichier' => $chapitre["fichier"],
'code_podcast' => $emission["code"],
'debut' => $chapitre["debut"],
'fin' => $chapitre["fin"],
'type_sujet' => $chapitre["type"],
'chronique' => $chapitre["chronique"],
'mp3' => $chapitre["mp3"],
'ogg' => $chapitre["ogg"],
'references_sujet' => $chapitre["references"]
);
$chapitreExistant = sql_select("id_chapitre","spip_chapitres",array("id_article=".$id_article, "code=".sql_quote($code_chapitre)));
if ($chapitreExistant and sql_count($chapitreExistant)>0) {
$r = sql_fetch($chapitreExistant);
$id_chapitre = $r["id_chapitre"];
sql_updateq("spip_chapitres", $chapitreArray, "id_chapitre=".$id_chapitre);
} else {
$id_nouveau_chapitre = sql_insertq("spip_chapitres", $chapitreArray);
}
}
}
}
function mes_toDateIso($code) {
$texte = substr($code, 0, 4)."-".substr($code,4,2)."-".substr($code,6,2)." 15:30:00";
return $texte;
}
function filtre_mes_mio($number) {
$mio = round($number / (1024 * 1024), 1);
if ($mio < 10) {
$mio = round($mio, 2);
return number_format($mio, 2, ',', ' ');
} else if ($mio < 100) {
$mio = round($mio, 1);
return number_format($mio, 1, ',', ' ');
} else {
$mio = round($mio, 0);
return number_format($mio, 0, ',', ' ');
}
return $mio;
}
function filtre_mes_conversionDrupal($shortdate) {
$annee = substr($shortdate, 0, 4);
$mois = substr($shortdate, 4, 2);
$jour = substr($shortdate, 6, 2);
if (substr($jour, 0, 1) == "0") {
$jour = substr($jour, 1, 1);
}
return $jour."-".mes_conversionMoisDrupal($mois)."-".$annee;
}
function mes_conversionMoisDrupal($mois) {
switch($mois) {
case "01":
return "janvier";
case "02":
return "fevrier";
case "03":
return "mars";
case "04":
return "avril";
case "05":
return "mai";
case "06":
return "juin";
case "07":
return "juillet";
case "08":
return "aout";
case "09":
return "septembre";
case "10":
return "octobre";
case "11":
return "novembre";
case "12":
return "decembre";
default:
return "XX";
}
}

99
libreavous_pipelines.php

@ -0,0 +1,99 @@
<?php
/**
* Utilisations de pipelines par chapitre
*
* @plugin chapitre
* @copyright 2021
* @author chankalan,vcalame
* @licence GNU/GPL
* @package SPIP\Chapitre\Pipelines
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/*
* Un fichier de pipelines permet de regrouper
* les fonctions de branchement de votre plugin
* sur des pipelines existants.
*/
/**
* Ajouter les objets sur les vues des parents directs
*
* @pipeline affiche_enfants
* @param array $flux Données du pipeline
* @return array Données du pipeline
**/
function libreavous_affiche_enfants($flux) {
if (
$e = trouver_objet_exec($flux['args']['exec'])
and $e['edition'] === false
) {
$id_objet = $flux['args']['id_objet'];
$id_rubrique = sql_getfetsel("id_rubrique", "spip_articles", "id_article=" . intval($id_objet));
$composition_rubrique = sql_getfetsel("composition", "spip_rubriques", "id_rubrique=" . intval($id_rubrique));
if ($e['type'] === 'article' and $composition_rubrique === 'emissions') {
$flux['data'] .= recuperer_fond(
'prive/objets/liste/chapitres',
array(
'titre' => _T('chapitre:titre_chapitres'),
'id_article' => $id_objet
)
);
if (autoriser('creerchapitredans', 'articles', $id_objet)) {
include_spip('inc/presentation');
$flux['data'] .= icone_verticale(
_T('chapitre:icone_creer_chapitre'),
generer_url_ecrire('chapitre_edit', "id_article=$id_objet"),
'chapitre-24.png',
'new',
'right'
) . "<br class='nettoyeur' />";
}
}
}
return $flux;
}
/**
* Afficher le nombre d'éléments dans les parents
*
* @pipeline boite_infos
* @param array $flux Données du pipeline
* @return array Données du pipeline
**/
function libreavous_boite_infos($flux) {
if (isset($flux['args']['type']) and isset($flux['args']['id']) and $id = intval($flux['args']['id'])) {
$texte = '';
if ($flux['args']['type'] == 'article' and $nb = sql_countsel('spip_chapitres', array('id_article=' . $id))) {
$texte .= '<div>' . singulier_ou_pluriel($nb, 'chapitre:info_1_chapitre', 'chapitre:info_nb_chapitres') . "</div>\n";
}
if ($texte and $p = strpos($flux['data'], '<!--nb_elements-->')) {
$flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
}
}
return $flux;
}
/**
* Compter les enfants d'un objet
*
* @pipeline objets_compte_enfants
* @param array $flux Données du pipeline
* @return array Données du pipeline
**/
function libreavous_objet_compte_enfants($flux) {
if ($flux['args']['objet'] == 'article' and $id_article = intval($flux['args']['id_objet'])) {
$flux['data']['chapitres'] = sql_countsel('spip_chapitres', 'id_article= ' . intval($id_article));
}
return $flux;
}

16
paquet.xml

@ -1,10 +1,10 @@
<paquet
prefix="libreavous"
categorie="squelette"
version="0.1.0"
version="0.2.0"
schema="0.1.0"
etat="dev"
compatibilite="[3.2.8;3.3.*]"
compatibilite="[3.2.8;4.0.*]"
>
<nom>+ APRIL - LIBRE À VOUS</nom>
<!-- personnalisons le site LIBRE À VOUS -->
@ -13,7 +13,7 @@
<necessite nom="baz_april" />
<!-- <necessite nom="cextras" /> -->
<necessite nom="cextras" />
<!-- <necessite nom="sommaire" /> -->
<chemin path="squelettes" />
@ -21,8 +21,12 @@
<chemin path="" />
<pipeline nom="autoriser" inclure="libreavous_autorisations.php"/>
<!-- <pipeline nom="declarer_champs_extras" inclure="base/librealire.php"/> -->
<!-- <pipeline nom="declarer_tables_objets_sql" inclure="base/librealire.php" /> -->
<pipeline nom="declarer_champs_extras" inclure="base/libreavous.php"/>
<pipeline nom="declarer_tables_objets_sql" inclure="base/libreavous.php" />
<pipeline nom="declarer_tables_interfaces" inclure="base/libreavous.php" />
<pipeline nom="affiche_enfants" inclure="libreavous_pipelines.php" />
<pipeline nom="boite_infos" inclure="libreavous_pipelines.php" />
<pipeline nom="objet_compte_enfants" inclure="libreavous_pipelines.php" />
<!-- <menu nom="configurer_librealire" titre="librealire:options_lal" parent="menu_squelette" icone="images/baz_april-16.png" /> -->

62
prive/objets/contenu/chapitre.html

@ -0,0 +1,62 @@
<BOUCLE_chapitre(CHAPITRES){id_chapitre}>
[<div class="champ contenu_titre[ (#TITRE*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_titre_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{titre} titre">(#TITRE)</span>
</div>]
[<div class="champ contenu_code[ (#CODE*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_code_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{code} code">(#CODE)</span>
</div>]
[<div class="champ contenu_code_fichier[ (#CODE_FICHIER*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_code_fichier_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{code_fichier} code_fichier">(#CODE_FICHIER)</span>
</div>]
[<div class="champ contenu_code_podcast[ (#CODE_PODCAST*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_code_podcast_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{code_podcast} code_podcast">(#CODE_PODCAST)</span>
</div>]
[<div class="champ contenu_debut[ (#DEBUT*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_debut_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{debut} debut">(#DEBUT)</span>
</div>]
[<div class="champ contenu_fin[ (#FIN*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_fin_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{fin} fin">(#FIN)</span>
</div>]
[<div class="champ contenu_type_sujet[ (#TYPE_SUJET*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_type_sujet_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{type_sujet} type_sujet">(#TYPE_SUJET)</span>
</div>]
[<div class="champ contenu_chronique[ (#CHRONIQUE*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_chronique_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{chronique} chronique">(#CHRONIQUE)</span>
</div>]
[<div class="champ contenu_mp3[ (#MP3*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_mp3_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{mp3} mp3">(#MP3)</span>
</div>]
[<div class="champ contenu_ogg[ (#OGG*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_ogg_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{ogg} ogg">(#OGG)</span>
</div>]
[<div class="champ contenu_drupal_guid[ (#DRUPAL_GUID*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_drupal_guid_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{drupal_guid} drupal_guid">(#DRUPAL_GUID)</span>
</div>]
[<div class="champ contenu_drupal_pubdate[ (#DRUPAL_PUBDATE*|strlen|?{'',vide})]">
<div class="label"><:chapitre:champ_drupal_pubdate_label:/> : </div>
<span dir="#LANG_DIR" class="#EDIT{drupal_pubdate} drupal_pubdate">(#DRUPAL_PUBDATE)</span>
</div>]
</BOUCLE_chapitre>

22
prive/objets/infos/chapitre.html

@ -0,0 +1,22 @@
<BOUCLE_chapitre(CHAPITRES){id_chapitre=#ENV{id}}>
<div class="infos">
[(#SET{texte_objet,<:chapitre:titre_chapitre:/>})]
<div class="numero"><:titre_cadre_numero_objet{objet=#GET{texte_objet}}:/><p>#ID_CHAPITRE</p></div>
<div class='nb_elements'><!--nb_elements--></div>
[(#VAL{redirect}
|generer_url_action{type=chapitre&id=#ID_CHAPITRE}
|parametre_url{var_mode,calcul}
|icone_horizontale{<:icone_voir_en_ligne:>,racine})]
[(#AUTORISER{supprimer, chapitre, #ID_CHAPITRE}|oui)
<hr />
[(#BOUTON_ACTION{
[(#CHEMIN_IMAGE{chapitre-del-24.png}|balise_img{<:chapitre:supprimer_chapitre:/>}|concat{' ',#VAL{<:chapitre:supprimer_chapitre:/>}|wrap{<b>}}|trim)],
#URL_ACTION_AUTEUR{supprimer_chapitre, #ID_CHAPITRE, #URL_ECRIRE{chapitres}},
icone s24 horizontale danger chapitre-del-24, <:chapitre:confirmer_supprimer_chapitre:/>})]
]
</div>
</BOUCLE_chapitre>

34
prive/objets/liste/chapitres.html

@ -0,0 +1,34 @@
[(#SET{defaut_tri,#ARRAY{
titre,1,
id_chapitre,1,
points,-1
}})]<B_liste_chapitres>
#ANCRE_PAGINATION
<div class="liste-objets chapitres">
<table class="spip liste">
[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{chapitre:info_1_chapitre,chapitre:info_nb_chapitres}})</strong></caption>]
<thead>
<tr class="first_row">
<th class="picto" scope="col"></th>
<th class="titre" scope="col">[(#TRI{titre,<:chapitre:champ_titre_label:/>,ajax})]</th>
<th class="id" scope="col">[(#TRI{id_chapitre,<:info_numero_abbreviation:/>,ajax})]</th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_chapitres(CHAPITRES){id_article?}{id_mot?}{id_auteur?}{where?}{recherche?}{tri #ENV{par,num titre},#GET{defaut_tri}}{par titre}{pagination #ENV{nb,10}}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
<td class="picto">[(#CHEMIN_IMAGE{chapitre-16.png}|balise_img)]</td>
<td class="titre principale">[(#LOGO_CHAPITRE|image_reduire{20,26})]<a href="[(#ID_CHAPITRE|generer_url_entite{chapitre})]" title="<:info_numero_abbreviation|attribut_html:/> #ID_CHAPITRE">[(#RANG). ]#TITRE</a></td>
<td class="id">[(#AUTORISER{modifier,chapitre,#ID_CHAPITRE}|?{
<a href="[(#URL_ECRIRE{chapitre_edit,id_chapitre=#ID_CHAPITRE})]">#ID_CHAPITRE</a>,
#ID_CHAPITRE
})]</td>
</tr>
</BOUCLE_liste_chapitres>
</tbody>
</table>
[<nav role="navigation" class="pagination">(#PAGINATION{prive})</nav>]
</div>
</B_liste_chapitres>[
<div class="liste-objets chapitres caption-wrap"><strong class="caption">(#ENV*{sinon,''})</strong></div>
]<//B_liste_chapitres>

56
prive/squelettes/contenu/chapitre.html

@ -0,0 +1,56 @@
[(#AUTORISER{voir,chapitre,#ID_CHAPITRE}|sinon_interdire_acces)]
[(#SET{url_voir,#VAL{chapitre}|objet_info{url_voir}})]
[(#SET{url_edit,#VAL{chapitre}|objet_info{url_edit}})]
<BOUCLE_chapitre(CHAPITRES){id_chapitre}{si #ENV{exec}|=={#GET{url_voir}}}>
[(#BOITE_OUVRIR{[
[(#AUTORISER{modifier,chapitre,#ID_CHAPITRE})
[(#ID_CHAPITRE|afficher_qui_edite{chapitre}|non)
[(#URL_ECRIRE{#GET{url_edit},id_chapitre=#ID_CHAPITRE}|icone_verticale{<:chapitre:icone_modifier_chapitre:/>,chapitre,edit,right ajax preload})]
]
[(#ID_CHAPITRE|afficher_qui_edite{chapitre}|oui)
[(#URL_ECRIRE{#GET{url_edit},id_chapitre=#ID_CHAPITRE}|icone_verticale{#ID_CHAPITRE|afficher_qui_edite{chapitre},warning-24,'',right edition_deja ajax preload})]
]
]
<h1>[(#RANG). ](#TITRE|sinon{<:info_sans_titre:/>})[(#CHEMIN_IMAGE{chapitre-24.png}|balise_img{chapitre,cadre-icone})]</h1>
],simple fiche_objet})]
<div class="ajax">
#FORMULAIRE_DATER{chapitre,#ID_CHAPITRE}
</div>
<!--affiche_milieu-->
<div id="wysiwyg">
<INCLURE{fond=prive/objets/contenu/chapitre,id=#ID_CHAPITRE,id_chapitre=#ID_CHAPITRE,virtuel=oui,ajax=wysiwyg,wysiwyg=1}>
</div>
<div class="nettoyeur"></div>
[(#AUTORISER{modifier,chapitre,#ID_CHAPITRE})
[(#ID_CHAPITRE|afficher_qui_edite{chapitre}|non)
[(#URL_ECRIRE{#GET{url_edit},id_chapitre=#ID_CHAPITRE}|icone_verticale{<:chapitre:icone_modifier_chapitre:/>,chapitre,edit,right ajax preload})]
]
[(#ID_CHAPITRE|afficher_qui_edite{chapitre}|oui)
[(#URL_ECRIRE{#GET{url_edit},id_chapitre=#ID_CHAPITRE}|icone_verticale{#ID_CHAPITRE|afficher_qui_edite{chapitre},warning-24,'',right edition_deja ajax preload})]
]
]
#PIPELINE{afficher_complement_objet,#ARRAY{args,#ARRAY{type,chapitre,id,#ID_CHAPITRE},data,'<div class="nettoyeur"></div>'}}
#BOITE_FERMER
#SET{enfants,''}
[(#VAL{prive/objets/contenu/chapitre-enfants}|trouver_fond|oui)
[(#SET{enfants,[(#INCLURE{fond=prive/objets/contenu/chapitre-enfants,id_chapitre,env})]})]
]
[(#PIPELINE{affiche_enfants,[(#ARRAY{args,#ARRAY{exec,chapitre,id_chapitre,#ID_CHAPITRE,objet,chapitre,id_objet,#ID_CHAPITRE},data,#GET{enfants}})]})]
[(#CONST{_AJAX}|oui)
<script type="text/javascript">/*<!\\[CDATA\\[*/reloadExecPage('#ENV{exec}','#navigation,#chemin,#extra');/*\\]\\]>*/</script>
]
</BOUCLE_chapitre>
[(#ENV**{exec}|=={#GET{url_edit}}|?{#INCLURE{fond=prive/squelettes/contenu/#GET{url_edit},redirect='',env,retourajax=oui},#REM|sinon_interdire_acces})]
<//B_chapitre>

36
prive/squelettes/contenu/chapitre_edit.html

@ -0,0 +1,36 @@
[(#ID_CHAPITRE|oui)
[(#AUTORISER{modifier,chapitre,#ID_CHAPITRE}|sinon_interdire_acces)]
[(#SET{id_parent,#INFO_ID_ARTICLE{chapitre,#ID_CHAPITRE}})]
]
[(#ID_CHAPITRE|non)
#SET{id_parent,#ENV{id_article,#ENV{id_parent}}}
[(#GET{id_parent}|non|ou{[(#AUTORISER{creerchapitredans, article, #GET{id_parent}})]}|sinon_interdire_acces)]
]
#SET{redirect,#ENV{redirect}|sinon{#ID_CHAPITRE|?{#ID_CHAPITRE|generer_url_entite{chapitre},#GET{id_parent}|?{#GET{id_parent}|generer_url_entite{article},#URL_ECRIRE{articles}}}}}
<div class="cadre-formulaire-editer">
<div class="entete-formulaire">
[(#ID_CHAPITRE|oui)
[(#GET{redirect}|icone_verticale{<:icone_retour:/>,chapitre,'',left retour[(#ENV{retourajax,''}|oui)ajax preload]})]
]
[
[(#ID_CHAPITRE|?{<:chapitre:icone_modifier_chapitre:/>,<:chapitre:icone_creer_chapitre:/>})]
<h1>(#ENV*{titre,#INFO_TITRE{chapitre,#ID_CHAPITRE}|sinon{<:info_sans_titre:/>}})</h1>
]
</div>
#SET{redirect,#ENV{redirect,#ID_CHAPITRE|generer_url_entite{chapitre}}}
[(#ENV{retourajax,''}|oui)
#SET{redirect,'javascript:if (window.jQuery) jQuery(".entete-formulaire .retour a").followLink();'}
<div class="ajax">
]
[(#FORMULAIRE_EDITER_CHAPITRE{#ENV{id_chapitre,oui}, #GET{id_parent}, #GET{redirect}})]
[(#ENV{retourajax,''}|oui)
</div>
<script type="text/javascript">/*<!\[CDATA\[*/reloadExecPage('#ENV{exec}');/*\]\]>*/</script>
]
</div>

10
prive/squelettes/hierarchie/chapitre.html

@ -0,0 +1,10 @@
<!-- hierarchie -->
<a href="#URL_ECRIRE{chapitres}"><:chapitre:titre_chapitres:/></a>
<BOUCLE_hierarchie(CHAPITRES){id_chapitre}>
&gt; [(#URL_ECRIRE{article,id_article=#ID_ARTICLE}|lien_ou_expose{#INFO_TITRE{articles,#ID_ARTICLE},''})]
&gt; <strong class="on">#TITRE</strong>
</BOUCLE_hierarchie>
[(#ENV{id_article}|oui)
&gt; [(#URL_ECRIRE{article,id_article=#ID_ARTICLE}|lien_ou_expose{#INFO_TITRE{articles,#ID_ARTICLE},''})]
]&gt; <strong class="on"><:ecrire:info_sans_titre:/></strong>
<//B_hierarchie>

1
prive/squelettes/hierarchie/chapitre_edit.html

@ -0,0 +1 @@
<INCLURE{fond=prive/squelettes/hierarchie/chapitre,env} />

20
saisies-vues/chapitres.html

@ -0,0 +1,20 @@
<BOUCLE_test_multiple(CONDITION){si #ENV{multiple}|=={on}|oui}>
[(#SET{valeur,[(#ENV*{valeur}|is_array|?{[(#ENV*{valeur})],[(#ENV*{valeur}|explode{','})]})]})]
<B_chapitres_selectionnes>
<ul>
<BOUCLE_chapitres_selectionnes(CHAPITRES){id_chapitre IN #GET*{valeur}}
{par num titre, titre}{tout}>
<li class="choix">#TITRE (#ID_CHAPITRE)</li>
</BOUCLE_chapitres_selectionnes>
</ul>
</B_chapitres_selectionnes>
[(#ENV*{sans_reponse}|propre)]
<//B_chapitres_selectionnes>
</BOUCLE_test_multiple>
<BOUCLE_chapitre_selectionne(CHAPITRES){id_chapitre=#ENV{valeur}}
{par num titre, titre}{tout}>
<p>#TITRE (#ID_CHAPITRE)</p>
</BOUCLE_chapitre_selectionne>
[(#ENV*{sans_reponse}|propre)]
<//B_chapitre_selectionne>
<//B_test_multiple>

13
saisies/chapitres.html

@ -0,0 +1,13 @@
[(#ENV{multiple}|oui)
[(#SET{valeur,[(#ENV*{valeur}|is_array|?{[(#ENV*{valeur})],[(#ENV*{valeur}|explode{','})]})]})]
]
<select name="#ENV{nom}[(#ENV{multiple}|?{\[\]})]" id="champ_[(#ENV{nom}|saisie_nom2classe)]"[ class="(#ENV{class})"][(#ENV{multiple}|oui) multiple="multiple" size="#ENV{size,10}"][ disabled="(#ENV{disable})"]>
[(#ENV{cacher_option_intro}|ou{#ENV{multiple}}|non)
<option value="">[(#ENV{option_intro})]</option>]
<BOUCLE_chapitres(CHAPITRES){id_chapitre?}{id_article?}{recherche?}{tout}{par num titre, titre}>
[(#ENV{multiple}|oui)
<option value="#ID_CHAPITRE"[(#ID_CHAPITRE|in_array{#ENV{valeur_forcee,#GET{valeur,#ENV{defaut,#ARRAY}}}}|oui) selected="selected"]>#TITRE</option>]
[(#ENV{multiple}|non)
<option value="#ID_CHAPITRE"[(#ID_CHAPITRE|=={#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}}|oui) selected="selected"]>#TITRE</option>]
</BOUCLE_chapitres>
</select>

69
squelettes/content/article-chronique.html

@ -0,0 +1,69 @@
<BOUCLE_principale(ARTICLES){id_article}>
<article>
<header class="cartouche">
[<p class="#EDIT{surtitre} surtitre">#(#SURTITRE)</p>]
<h1><span class="#EDIT{titre} article__titre">#TITRE</span>[
<small class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</small>
]</h1>
<p class="article__infos">
[<span class="article__date">Publié le (#DATE|nom_jour) [(#DATE|affdate)]</span>]
[(#CONFIG{baz_april/afficherauteurs}|=={on}|oui)[<span class="article__auteurs"><:par_auteur:> (#LESAUTEURS)</span>]]
</p>
<div class="postmeta">
#MODELE{article_traductions}
<BOUCLE_groupes(GROUPES_MOTS){par titre}>
<B_tags>
<p class="mots">
<strong>#TITRE : </strong><BOUCLE_tags(MOTS){id_article}{id_groupe}{', '}>
<a href="#URL_MOT">#TITRE</a>
</BOUCLE_tags>
</p>
</B_tags>
</BOUCLE_groupes>
</div>
</header>
<div class="main">
[<div class="#EDIT{chapo} article__chapo">(#CHAPO|adaptive_images{#CONST{_CONTENT_WIDTH},0})</div>]
[<div class="#EDIT{texte} article__texte">(#TEXTE|adaptive_images{#CONST{_CONTENT_WIDTH},0})</div>]
<!-- on imagine le nom de la chronique dans le surtitre... peut-être plutôt un champ extra ? -->
<BOUCLE_chroniques(CHAPITRES) {chronique=#SURTITRE}{!par code_podcast}>
<h2>#TITRE</h2>
<p>
Dans <BOUCLE_article(ARTICLES){id_article}>
<a href="#URL_ARTICLE">#[(#SURTITRE)] - [(#TITRE|mes_supp_numero)]</a>
</BOUCLE_article>
</p>
[<h3 class="spip">Références</h3>
(#REFERENCES_SUJET|propre)]
<h3 class="spip">Fichiers</h3>
<ul>
<li><a href="https://media.april.org/audio/radio-cause-commune/libre-a-vous/emissions/[(#CODE_PODCAST)]/libre-a-vous-[(#CODE_PODCAST)]-[(#CODE_FICHIER)].ogg">libre-a-vous-[(#CODE_PODCAST)]-[(#CODE_FICHIER)].ogg</a> ([(#OGG|mes_mio)] Mio)</li>
<li><a href="https://media.april.org/audio/radio-cause-commune/libre-a-vous/emissions/[(#CODE_PODCAST)]/libre-a-vous-[(#CODE_PODCAST)]-[(#CODE_FICHIER)].mp3">libre-a-vous-[(#CODE_PODCAST)]-[(#CODE_FICHIER)].mp3</a> ([(#MP3|mes_mio)] Mio)</li>
</ul>
</BOUCLE_chroniques>
</div>
[<aside>
(#INCLURE{fond=inclure/documents,id_article})
</aside>]
<footer>
[<p class="#EDIT{hyperlien} article__hyperlien"><:voir_en_ligne:/> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
[<div class="article__notes">(#NOTES)</div>]
</footer>
</article>
</BOUCLE_principale>

108
squelettes/content/article-emission.html

@ -0,0 +1,108 @@
<BOUCLE_principale(ARTICLES){id_article}>
<article>
<header class="cartouche">
<h1></h1>
<p><a href="https://april.org/libre-a-vous-diffusee-mardi-[(#PODCAST_CODE|mes_conversionDrupal)]-sur-radio-cause-commune">Page originale sur le site de l'April</a></p>
<h1><span class="surtitre #EDIT{surtitre}">#[(#SURTITRE)] - </span><span class="#EDIT{titre} article__titre">[(#TITRE|mes_supp_numero)]</span>[
<small class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</small>
]</h1>
<p class="article__infos">
[<span class="article__date">Émission Libre à vous du (#DATE|nom_jour) [(#DATE|affdate)]</span>]
</p>
<div class="postmeta">
#MODELE{article_traductions}
<BOUCLE_groupes(GROUPES_MOTS){par titre}