Browse Source

dépôt git initialisé

master
chankalan 2 years ago
commit
70678c8416
  1. 4
      401.html
  2. 3
      article.html
  3. 2
      aside/dist.html
  4. 10
      aside/z_apl.html
  5. 3
      auteur.html
  6. 43
      backend.html
  7. 44
      baz_april_administrations.php
  8. 40
      baz_april_fonctions.php
  9. 44
      baz_april_options.php
  10. 3
      baz_april_pipelines.php
  11. 37
      body.html
  12. 5
      breadcrumb/401.html
  13. 5
      breadcrumb/404.html
  14. 8
      breadcrumb/auteur.html
  15. 15
      breadcrumb/dist.html
  16. 7
      breadcrumb/inc-objet.html
  17. 10
      breadcrumb/login.html
  18. 8
      breadcrumb/mot.html
  19. 4
      breadcrumb/plan.html
  20. 4
      breadcrumb/recherche.html
  21. 10
      content/401.html
  22. 10
      content/404.html
  23. 48
      content/article.html
  24. 22
      content/auteur.html
  25. 17
      content/login.html
  26. 49
      content/mot.html
  27. 60
      content/plan.html
  28. 14
      content/recherche.html
  29. 75
      content/rubrique-blog.html
  30. 6
      content/rubrique-blog.xml
  31. 3
      content/rubrique-pagerubrique.html
  32. 5
      content/rubrique-pagerubrique.xml
  33. 54
      content/rubrique.html
  34. 23
      content/site.html
  35. 33
      content/sommaire.html
  36. 16
      content/spip_pass.html
  37. 10
      content/z_apl.html
  38. 7
      extra/article.html
  39. 15
      extra/auteur.html
  40. 2
      extra/dist.html
  41. 31
      extra/mot.html
  42. 17
      extra/rubrique.html
  43. 27
      extra/site.html
  44. 2
      extra/sommaire.html
  45. 10
      extra/z_apl.html
  46. 30
      footer/dist.html
  47. 22
      formulaires/configurer_baz_april.html
  48. 57
      formulaires/login.html
  49. 333
      formulaires/login.php
  50. 12
      formulaires/recherche.html
  51. 2
      head/404.html
  52. 5
      head/article.html
  53. 11
      head/auteur.html
  54. 26
      head/dist.html
  55. 6
      head/mot.html
  56. 3
      head/plan.html
  57. 2
      head/recherche.html
  58. 7
      head/rubrique.html
  59. 5
      head/site.html
  60. 23
      head/sommaire.html
  61. 0
      head_js/dist.html
  62. 6
      header/dist.html
  63. 9
      inclure/archives-mois.html
  64. 10
      inclure/article-hero.html
  65. 10
      inclure/articles-resume.html
  66. 16
      inclure/articles.html
  67. 5
      inclure/boussole.html
  68. 31
      inclure/documents.html
  69. 40
      inclure/head.html
  70. 10
      inclure/liste-articles.html
  71. 25
      inclure/liste-rubriques.html
  72. 17
      inclure/mots-articles-rubrique.html
  73. 10
      inclure/nav-secteurs.html
  74. 9
      inclure/periode-mois.html
  75. 45
      inclure/petition.html
  76. 13
      inclure/resume/article.html
  77. 13
      inclure/resume/rubrique.html
  78. 12
      inclure/resume/site.html
  79. 9
      inclure/resume/syndic_article.html
  80. 55
      inclure/rss-item.html
  81. 56
      inclure/rubriques.html
  82. 26
      js/baz_script.js
  83. 780
      js/css3-mediaqueries.js
  84. 8
      js/html5shiv.js
  85. 15
      lang/baz_april_fr.php
  86. 12
      lang/paquet-baz_april_fr.php
  87. 13
      liste/articles-auteur.html
  88. 13
      liste/articles-recherche.html
  89. 10
      liste/articles-resume.html
  90. 13
      liste/rubriques-recherche.html
  91. 18
      liste/syndicarticles.html
  92. 8
      modeles/icone.html
  93. 16
      modeles/iconebloc.html
  94. 51
      modeles/imagesenligne.html
  95. 9
      modeles/rubrique_articles.html
  96. 3
      modeles/rubrique_rubriques.html
  97. 3
      mot.html
  98. 40
      paquet.xml
  99. 6
      prive/squelettes/contenu/configurer_baz_april.html
  100. 27
      readme.md
  101. Some files were not shown because too many files have changed in this diff Show More

4
401.html

@ -0,0 +1,4 @@
#HTTP_HEADER{#VAL{"HTTP/1.0 "}|concat{#ENV{code,"401 Not Found"}}}
#HTTP_HEADER{"Cache-Control: no-store, no-cache, must-revalidate"}
#HTTP_HEADER{Pragma: no-cache}
<INCLURE{fond=structure,env,type-page=#ENV{status,401}} />

3
article.html

@ -0,0 +1,3 @@
<BOUCLE_principale_article(ARTICLES){id_article}>
<INCLURE{fond=structure,env,id_rubrique=#ENV{id_rubrique,#ID_RUBRIQUE},id_secteur=#ID_SECTEUR,type-page=article,composition=#COMPOSITION} />
</BOUCLE_principale_article>

2
aside/dist.html

@ -0,0 +1,2 @@
[(#REM) Menu de navigation par rubriques ]
<INCLURE{fond=inclure/rubriques,env,type-page,composition} />

10
aside/z_apl.html

@ -0,0 +1,10 @@
[(#REM)
Squelette Big_Pipe
http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919
(c) 2010 Cedric Morin
Distribue sous licence GPL
]#CACHE{0}
#INCLURE{fond=inclure/ajax_parallel_load,bloc=#SQUELETTE}

3
auteur.html

@ -0,0 +1,3 @@
<BOUCLE_principale_auteur(AUTEURS){id_auteur}>
<INCLURE{fond=structure,env,type-page=auteur,composition=#COMPOSITION} />
</BOUCLE_principale_auteur>

43
backend.html

@ -0,0 +1,43 @@
[(#REM)
Ce fichier sert à créer les flux RSS
qui permettent aux visiteurs de suivre l'actualité
de votre site depuis un lecteur de news.
Cette page génère un code XML/RSS adapté
][(#HTTP_HEADER{Content-type: text/xml[; charset=(#CHARSET)]})]<?xml
version="1.0"[ encoding="(#CHARSET)"]?>
<rss version="2.0" [(#REM) rss 2.0.9)]
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel[ xml:lang="(#LANG)"]>
<title>[(#NOM_SITE_SPIP|textebrut|texte_backend)]</title>
<link>#URL_SITE_SPIP/</link>
[<description>(#DESCRIPTIF_SITE_SPIP|supprimer_tags|texte_backend)</description>]
<language>#LANG</language>
<generator>SPIP - www.spip.net</generator>
<atom:link href="[(#SELF|url_absolue)]" rel="self" type="application/rss+xml" />
[ <image>
<title>[(#NOM_SITE_SPIP|texte_backend)]</title>
<url>(#LOGO_SITE_SPIP|image_reduire{144,400}|extraire_attribut{src}|url_absolue|texte_backend)</url>
<link>#URL_SITE_SPIP/</link>
[<height>(#LOGO_SITE_SPIP|image_reduire{144,400}|extraire_attribut{height})</height>]
[<width>(#LOGO_SITE_SPIP|image_reduire{144,400}|extraire_attribut{width})</width>]
</image>
]
<BOUCLE_10recents(ARTICLES){id_rubrique>0}{lang ?}{branche ?}{id_mot ?}{id_auteur ?}{par date}{inverse}{0,10}{unique}>
<INCLURE{fond=inclure/rss-item,id_article} />
</BOUCLE_10recents>
<BOUCLE_tres_recents(ARTICLES){id_rubrique>0}{lang ?}{branche ?}{id_mot ?}{id_auteur ?}{par date}{inverse}{age<3}{unique}>
<INCLURE{fond=inclure/rss-item,id_article} />
</BOUCLE_tres_recents>
</channel>
</rss>

44
baz_april_administrations.php

@ -0,0 +1,44 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/meta');
// Installation et mise à jour sur modele sjcycle
function baz_april_upgrade($nom_meta_version_base, $version_cible) {
// Création du tableau des mises à jour.
$maj = array();
$config_fdr = array(
'titre' => 'Manuel du site'
);
$config_crayons = array (
'barretypo' => 'on',
'msgAbandon' => 'on',
'clickhide' => 'on'
);
$config_compositions = array(
'masquer_formulaire' => 'oui'
);
$config_baz_april = array(
'afficherauteurs' => 'non'
);
// Tableau de la configuration par défaut
$maj['create'] = array(
array('ecrire_config', 'feuillederoute', $config_fdr),
array('ecrire_config', 'crayons', $config_crayons),
array('ecrire_config', 'compositions', $config_compositions),
array('ecrire_config', 'baz_april', $config_baz_april),
array('ecrire_config', 'version_html_max', 'html5'),
);
// Maj du plugin.
include_spip('base/upgrade');
maj_plugin($nom_meta_version_base, $version_cible, $maj);
}
// Désinstallation
function baz_april_vider_tables($nom_meta_version_base) {
effacer_meta('baz');
effacer_meta($nom_meta_version_base);
}

40
baz_april_fonctions.php

@ -0,0 +1,40 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
/* reprise d'une fonction du plugin Agenda
* renommee pour eviter plantage
https://zone.spip.org/trac/spip-zone/browser/_plugins_/agenda/trunk/agenda_fonctions.php#L32
*/
/**
* decale les mois de la date.
* cette fonction peut raboter le jour si le nouveau mois ne les contient pas
* exemple 31/01/2007 + 1 mois => 28/02/2007
*
* @param string $date
* @param int $decalage
* @param string $format
* @return string
*/
function baz_moisdecal($date, $decalage, $format = 'Y-m-d H:i:s') {
include_spip('inc/filtres');
$date_array = recup_date($date);
if ($date_array) {
list($annee, $mois, $jour) = $date_array;
}
if (!$jour) {
$jour = 1;
}
if (!$mois) {
$mois = 1;
}
$mois2 = $mois + $decalage;
$date2 = mktime(1, 1, 1, $mois2, $jour, $annee);
// mois normalement attendu
$mois3 = date('m', mktime(1, 1, 1, $mois2, 1, $annee));
// et si le mois de la nouvelle date a moins de jours...
$mois2 = date('m', $date2);
if ($mois2 - $mois3) {
$date2 = mktime(1, 1, 1, $mois2, 0, $annee);
}
return date($format, $date2);
}

44
baz_april_options.php

@ -0,0 +1,44 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
// les blocs de baz
if (!isset($GLOBALS['z_blocs'])) {
$GLOBALS['z_blocs'] = array('content','aside','extra','head','head_js','header','footer','breadcrumb');
}
// les images de plus de 2000*1000 pixels de haut seront réduites en 2000x1000 maximum
// define('_IMG_MAX_WIDTH', 2000);
// define('_IMG_MAX_HEIGHT', 1000);
// surligner le terme de recherche
define('_SURLIGNE_RECHERCHE_REFERERS',true);
if (isset($_REQUEST['recherche'])) {
$_GET['var_recherche'] = $_REQUEST['recherche'];
}
// les images de plus de 2000*1000 pixels de haut seront réduites en 2000x1000 maximum
// define('_IMG_MAX_WIDTH', 2000);
// define('_IMG_MAX_HEIGHT', 1600);
// $GLOBALS['quota_cache'] = 200;
define('_DUREE_CACHE_DEFAUT', 24*3600*90);
// pour sauter une ligne en rédaction
// $GLOBALS['ligne_horizontale'] = '<br class="clear" />';
// afficher les erreurs
// define('_NO_CACHE', -1);
// define('_INTERDIRE_COMPACTE_HEAD_ECRIRE', true);
// error_reporting(E_ALL^E_NOTICE);
// ini_set ("display_errors", "On");
// define('SPIP_ERREUR_REPORT',E_ALL);
// $GLOBALS['taille_des_logs'] = 500;
// define('_MAX_LOG', 500000);
// define('_LOG_FILELINE',true);
// define('_LOG_FILTRE_GRAVITE',8);
// define('_DEBUG_SLOW_QUERIES', true);
// define('_BOUCLE_PROFILER', 5000);
$GLOBALS['debut_intertitre'] = "\n<h2 class=\"spip\">\n";
$GLOBALS['fin_intertitre'] = "</h2>\n";

3
baz_april_pipelines.php

@ -0,0 +1,3 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;

37
body.html

@ -0,0 +1,37 @@
<body class="body[--(#ENV{type-page})][ body--(#COMPOSITION)]">
<ul class="accesrapide accesrapide--main">
<li class="accesrapide"><a class="accesrapide__lien visuallyhidden focusable" href="#contenu"><:baz_april:evitement_contenu:></a></li>
<li class="accesrapide"><a class="accesrapide__lien visuallyhidden focusable" href="#navigation"><:baz_april:evitement_navigation:></a></li>
</ul>
<div id="boussole_spip">[(#REM) La boussole SPIP va s'insérer ici ]</div>
<div class="page__wrapper">
<header class="page__header">
<div class="page--container">
<INCLURE{fond=header/#ENV{type-page},env} />
<INCLURE{fond=inclure/nav-secteurs,env} />
<INCLURE{fond=inclure/boussole} />
</div>
</header>
<div class="page__content page--container">
<main class="contentMain">
<INCLURE{fond=content/#ENV{type-page},env,composition} />
<aside class="contentMain__extra">
<INCLURE{fond=extra/#ENV{type-page},env} />
</aside>
</main><!--.main-->
<aside class="contentAside">
<INCLURE{fond=aside/#ENV{type-page},env} />
</aside><!--.aside-->
</div>
<footer class="page__footer">
<div class="page--container">
<INCLURE{fond=footer/#ENV{type-page},env} />
</div>
</footer>
</div><!--.container-->
</body>

5
breadcrumb/401.html

@ -0,0 +1,5 @@
[(#REM) Fil d'Ariane ]
<nav class="arbo" aria-label="Fil d'Ariane">
<a href="#URL_SITE_SPIP/"><:accueil_site:></a> <span class="divider"> &gt; </span>
<span class="active"><:pass_erreur:>[ (#ENV{status})]</span>
</nav>

5
breadcrumb/404.html

@ -0,0 +1,5 @@
[(#REM) Fil d'Ariane ]
<nav class="arbo" aria-label="Fil d'Ariane">
<a href="#URL_SITE_SPIP/"><:accueil_site:></a> <span class="divider"> &gt; </span>
<span class="active"><:pass_erreur:> 404</span>
</nav>

8
breadcrumb/auteur.html

@ -0,0 +1,8 @@
<BOUCLE_content(AUTEURS){id_auteur}>
[(#REM) Fil d'Ariane ]
<nav class="arbo" aria-label="Fil d'Ariane">
<a href="#URL_SITE_SPIP/"><:accueil_site:></a><span class="divider"> &gt; </span>
<:info_auteurs:><span class="divider"> &gt; </span>
[<span class="active">(#NOM|couper{80})</span>]
</nav>
</BOUCLE_content>

15
breadcrumb/dist.html

@ -0,0 +1,15 @@
<nav class="arbo" aria-label="Fil d'Ariane">
#SET{objet,''}#SET{id_objet,''}
[(#ENV{id_rubrique}|oui)#SET{objet,rubrique}#SET{id_objet,#ENV{id_rubrique}}]
[(#ENV{id_syndic}|oui)#SET{objet,site}#SET{id_objet,#ENV{id_syndic}}]
[(#ENV{id_breve}|oui)#SET{objet,breve}#SET{id_objet,#ENV{id_breve}}]
[(#ENV{id_article}|oui)#SET{objet,article}#SET{id_objet,#ENV{id_article}}]
[(#ENV{id_objet}|oui)#SET{objet,#ENV{objet}}#SET{id_objet,#ENV{id_objet}}]
[(#GET{objet}|oui)
#INCLURE{fond=breadcrumb/inc-objet,id_objet=#GET{id_objet},objet=#GET{objet}}
][(#GET{objet}|non)
<a href="#URL_SITE_SPIP/"><:accueil_site:></a>
]
</nav>

7
breadcrumb/inc-objet.html

@ -0,0 +1,7 @@
<a href="#URL_SITE_SPIP/"><:accueil_site:></a><span class="divider"> &gt; </span>
<BOUCLE_contexte_rubrique(RUBRIQUES) {id_rubrique=(#OBJET|=={rubrique}|?{#INFO_ID_PARENT{#OBJET,#ID_OBJET},#INFO_ID_RUBRIQUE{#OBJET,#ID_OBJET}})}>
<BOUCLE_ariane_hier(HIERARCHIE) {id_rubrique}{tout}>
<a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a><span class="divider"> &gt; </span>
</BOUCLE_ariane_hier>
</BOUCLE_contexte_rubrique>
<span[(#ENV{expose,' '}|oui)class="active"]>[(#ID_OBJET|generer_url_entite{#OBJET}|lien_ou_expose{#INFO_TITRE{#OBJET,#ID_OBJET}|sinon{?}|couper{80},#ENV{expose,' '}|?{span}})]</span>[<span class="divider">(#ENV{expose,' '}|non)&gt; </span>]

10
breadcrumb/login.html

@ -0,0 +1,10 @@
[(#REM)
Est-ce qu'on se connecte a l'espace prive ou pas ?
]#SET{prive,''}
[(#ENV{url}|=={''}|?{#SET{prive,' '}})]
[(#ENV{url}|match{^#EVAL{_DIR_RESTREINT_ABS}}|?{#SET{prive,' '}})]
[(#REM) Fil d'Ariane ]
<nav class="arbo" aria-label="Fil d'Ariane"><a href="#URL_SITE_SPIP/"><:accueil_site:></a>
[<span class="divider"> &gt; </span><strong class="on">(#GET{prive}|?{<:login_acces_prive:>,<:lien_connecter:>})</strong>]
</nav>

8
breadcrumb/mot.html

@ -0,0 +1,8 @@
<BOUCLE_content(MOTS) {id_mot} {doublons}>
<nav class="arbo" aria-label="Fil d'Ariane">
<a href="#URL_SITE_SPIP/"><:accueil_site:></a><span class="divider"> &gt; </span>
<span><:mots_clefs:></span><span class="divider"> &gt; </span>
<BOUCLE_ariane(GROUPES_MOTS){id_groupe}><span>[(#TITRE|couper{80})]</span><span class="divider"> &gt; </span></BOUCLE_ariane>
<span class="active">[(#TITRE|couper{80})]</span>
</nav>
</BOUCLE_content>

4
breadcrumb/plan.html

@ -0,0 +1,4 @@
<nav class="arbo" aria-label="Fil d'Ariane">
<a href="#URL_SITE_SPIP/"><:accueil_site:></a><span class="divider"> &gt; </span>
<span class="active"><:plan_site:></span>
</nav>

4
breadcrumb/recherche.html

@ -0,0 +1,4 @@
<nav class="arbo" aria-label="Fil d'Ariane">
<a href="#URL_SITE_SPIP/"><:accueil_site:></a><span class="divider"> &gt; </span>
<span class="active"><:info_rechercher:> [&laquo; <strong class="on">(#RECHERCHE)</strong> &raquo;]</span>
</nav>

10
content/401.html

@ -0,0 +1,10 @@
[(#REM) Fil d'Ariane ]
<section class="content">
<header class="cartouche">
<h1><:pass_erreur:>[ (#ENV{status})]</h1>
<INCLURE{fond=breadcrumb/#ENV{type-page},env} />
</header>
<div class="main">
[<div class="chapo">(#ENV{erreur})</div>]
</div>
</section>

10
content/404.html

@ -0,0 +1,10 @@
[(#REM) Fil d'Ariane ]
<section class="content">
<header class="cartouche">
<h1><:pass_erreur:> 404</h1>
<INCLURE{fond=breadcrumb/#ENV{type-page},env} />
</header>
<div class="main">
[<div class="chapo">(#ENV{erreur})</div>]
</div>
</section>

48
content/article.html

@ -0,0 +1,48 @@
<BOUCLE_content(ARTICLES){id_article}>
<article class="content" id="content">
<header class="cartouche">
[<p class="#EDIT{surtitre} surtitre">(#SURTITRE)</p>]
<h1><span class="#EDIT{titre}">#TITRE</span>[
<small class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</small>
]</h1>
[(#ENV{composition}|=={blog}|oui)<INCLURE{fond=breadcrumb/rubrique-blog,env} />]
[(#ENV{composition}|=={blog}|non)<INCLURE{fond=breadcrumb/article,env} />]
[<p class="publication"><time datetime="[(#DATE|date_iso)]"><i class="icon-calendar"></i> (#DATE|affdate)</time></p>][(#CONFIG{baz_april/afficherauteurs}|=={on}|oui)[<p class="auteurs"><:par_auteur:> (#LESAUTEURS)</p>]]
[(#REM) Inclure le modele des liens de traductions ]
<div class="postmeta">
#MODELE{article_traductions}
<B_tags>
<span class="tags">
<span class="sep">|</span>
<ul class="inline">
<BOUCLE_tags(MOTS){id_article}>
<li><a class="label" href="#URL_MOT"><i class="icon-tag"></i> #TITRE</a></li>
</BOUCLE_tags>
</ul>
</span>
</B_tags>
</div>
</header>
<div class="main">
[<div class="#EDIT{chapo} chapo surlignable">(#CHAPO|image_reduire{700,*})</div>]
[<div class="#EDIT{texte} texte surlignable">(#TEXTE|image_reduire{700,*})</div>]
[<p class="#EDIT{hyperlien} hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
</div>
<aside>
[(#REM) Gestion du portfolio et des documents ]
[(#INCLURE{fond=inclure/documents,id_article})]
</aside>
<footer>
[<div class="#EDIT{ps} ps surlignable"><h2><:info_ps:></h2>(#PS|image_reduire{700,*})</div>]
[<div class="notes"><h2><:info_notes:></h2>(#NOTES)</div>]
</footer>
</article>
</BOUCLE_content>

22
content/auteur.html

@ -0,0 +1,22 @@
<BOUCLE_content(AUTEURS){id_auteur}>
<section class="content vcard" id="content" itemscope itemtype="http://schema.org/Person"> [(#REM) microformat vcard]
<header class="cartouche">
<h1 class="#EDIT{qui} fn" itemprop="name">[(#LOGO_AUTEUR|image_reduire|inserer_attribut{itemprop,image})]#NOM</h1>
</header>
<div class="main">
[<div class="#EDIT{bio} texte bio">(#BIO|image_reduire{700,*})</div>]
[<p class="#EDIT{hyperlien} hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="url spip_out" itemprop="url">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
</div>
<aside>
<INCLURE{fond=liste/articles-auteur,id_auteur,env,ajax} />
#FORMULAIRE_ECRIRE_AUTEUR
</aside>
<footer>
[<div class="notes"><h2><:info_notes:></h2>(#NOTES)</div>]
</footer>
</section>
</BOUCLE_content>

17
content/login.html

@ -0,0 +1,17 @@
[(#REM)
Est-ce qu'on se connecte a l'espace prive ou pas ?
]#SET{prive,''}
[(#ENV{url}|=={''}|?{#SET{prive,' '}})]
[(#ENV{url}|match{^#EVAL{_DIR_RESTREINT_ABS}}|?{#SET{prive,' '}})]
<section class="content" id="content">
<header class="cartouche">
[<h1>(#GET{prive}|?{<:login_acces_prive:>,<:lien_connecter:>})
<small>#NOM_SITE_SPIP</small>
</h1>]
<INCLURE{fond=breadcrumb/#ENV{type-page},env} />
</header >
<div class="main">
[(#FORMULAIRE_LOGIN{#ENV{url}|sinon{#URL_ECRIRE{accueil}}})]
</div>
</section>

49
content/mot.html

@ -0,0 +1,49 @@
<BOUCLE_content(MOTS) {id_mot} {doublons}>
<section class="content" id="content">
<header class="cartouche">
<h1 class="#EDIT{titre}">[(#LOGO_MOT|image_reduire)]#TITRE</h1>
<INCLURE{fond=breadcrumb/#ENV{type-page},env} />
</header>
<div class="main">
[<div class="#EDIT{texte} chapo">(#TEXTE|image_reduire{700,*})</div>]
</div>
<aside>
[(#REM) Articles lies au mot-cle ]
<div class="liste articles">
<INCLURE{fond=liste/articles-resume,env,ajax,id_mot,titre=<:baz_april:articles_lies:>} />
</div>
[(#REM) Rubriques liees au mot-cle ]
<B_rubriques>
<div class="liste rubriques">
<h2 class="h2"><:rubriques:></h2>
<ul class="liste-items">
<BOUCLE_rubriques(RUBRIQUES) {id_mot} {par titre} {pagination 50}>
<li class="item"><a href="#URL_RUBRIQUE">#TITRE</a></li>
</BOUCLE_rubriques>
</ul>
[<div class="pagination">(#PAGINATION)</div>]
</div>
</B_rubriques>
[(#REM) Sites web lies au mot-cle ]
<B_sites>
<div class="liste sites">
<h2 class="h2"><:sites_web:></h2>
<ul class="liste-items">
<BOUCLE_sites(SITES) {id_mot} {par nom_site} {pagination 50}>
<li class="item"><a href="[(#ID_SYNDIC|generer_url_entite{site,'','',#CONNECT})]">#NOM_SITE</a></li>
</BOUCLE_sites>
</ul>
[<div class="pagination">(#PAGINATION)</div>]
</div>
</B_sites>
</aside>
[<footer>
<div class="notes"><hr />(#NOTES)</div>
</footer>]
</section>
</BOUCLE_content>

60
content/plan.html

@ -0,0 +1,60 @@
<section class="content" id="content">
<header class="cartouche">
<h1><:plan_site:></h1>
<INCLURE{fond=breadcrumb/#ENV{type-page},env} />
</header>
<div class="main">
[(#REM) Articles et sous-rubriques ]
<B_articles_pages>
<ul class="plan">
<BOUCLE_articles_pages(ARTICLES) {id_rubrique=-1} {page !IN accueil, mentions} {par titre}>
<li><a href="#URL_ARTICLE">#TITRE</a></li>
</BOUCLE_articles_pages>
</ul>
</B_articles_pages>
<BOUCLE_secteurs(RUBRIQUES) {racine} {par num titre, titre}>
<h2 class="h2"><a href="#URL_RUBRIQUE">#TITRE</a></h2>
[(#REM) Articles et sous-rubriques ]
<BOUCLE_test_article_r1(ARTICLES){id_rubrique}{1,2}>
</BOUCLE_test_article_r1>
<B_articles_racine>
<ul class="plan">
<BOUCLE_articles_racine(ARTICLES) {id_rubrique} {par titre}>
<li><a href="#URL_ARTICLE">#TITRE</a></li>
</BOUCLE_articles_racine>
</ul>
</B_articles_racine>
</B_test_article_r1>
<B_rubriques>
<ul class="plan">
<BOUCLE_rubriques(RUBRIQUES) {id_parent} {par titre}>
<li>
<strong><a href="#URL_RUBRIQUE">#TITRE</a></strong>
<BOUCLE_test_article_r2(ARTICLES){id_rubrique}{1,2}>
</BOUCLE_test_article_r2>
<B_articles>
<ul>
<BOUCLE_articles(ARTICLES) {id_rubrique} {par titre}>
[(#TOTAL_BOUCLE|>{1}|oui)<li><a href="#URL_ARTICLE">#TITRE</a></li>]
</BOUCLE_articles>
</ul>
</B_articles>
</B_test_article_r2>
<BOUCLE_sous_rubriques(BOUCLE_rubriques)></BOUCLE_sous_rubriques>
</li>
</BOUCLE_rubriques>
</ul>
</B_rubriques>
</BOUCLE_secteurs>
</div>
</section>

14
content/recherche.html

@ -0,0 +1,14 @@
<section class="content" id="content">
[<header class="cartouche">
<h1><:resultats_recherche:>
<small>&#171;&nbsp;(#RECHERCHE)&nbsp;&#187;</small>
</h1>
<INCLURE{fond=breadcrumb/#ENV{type-page},env} />
</header>]
<div class="main">
<INCLURE{fond=liste/articles-recherche,env,ajax} />
<INCLURE{fond=liste/rubriques-recherche,env,ajax} />
</div>
</section>

75
content/rubrique-blog.html

@ -0,0 +1,75 @@
<BOUCLE_content(RUBRIQUES){id_rubrique}>
<section class="content" id="content">
<header class="cartouche">
<h1 class="#EDIT{titre}">#TITRE</h1>
[<p class="publication"><time datetime="[(#DATE|date_iso)]"><:dernier_ajout:> : (#DATE|affdate_jourcourt).</time></p>]
<INCLURE{fond=breadcrumb/rubrique,id_rubrique} />
</header>
<div class="main">
[<div class="#EDIT{texte} chapo">(#TEXTE|image_reduire{700,*})</div>]
#SET{'debut_mois', (#ENV{datetri}|baz_moisdecal{0,'Y-m-d'})}
#SET{'fin_mois', (#ENV{datetri}|baz_moisdecal{1,'Y-m-d'})}
<B_articlesdate>
<div class="liste articles blog">
[<h2 class="h2[ (#ENV{datetri}|oui)date]">(#ENV{datetri}|affdate{nom_mois})[(#ENV{datetri}|affdate{Y}|!={[(#VAL{Y}|date)]}|oui)[ (#ENV{datetri}|affdate{Y})]]</h2>]
<ul class="liste-items">
<BOUCLE_articlesdate(ARTICLES){si #ENV{datetri}|?{' '}}{date < #GET{fin_mois}}{date >= #GET{debut_mois}}{id_rubrique}{!par date}>
<li class="item clearfix">#INCLURE{fond=inclure/resume/article,id_article,env,composition=blog}</li>
</BOUCLE_articlesdate>
</ul>
</div>
</B_articlesdate>
<div class="liste articles blog">
[<h2 class="h2[ (#ENV{datetri}|oui)date]"><:baz_april:aucun_article_dans_cette_periode:> : (#ENV{datetri}|affdate{nom_mois})[(#ENV{datetri}|affdate{Y}|!={[(#VAL{Y}|date)]}|oui)[ (#ENV{datetri}|affdate{Y})]]</h2>]
<B_articles>#ANCRE_PAGINATION
<ul class="liste-items">
<BOUCLE_articles(ARTICLES){id_rubrique}{lang}{!par date}{pagination 10}>
<li class="item clearfix">#INCLURE{fond=inclure/resume/article,id_article,env,composition=blog}</li>
</BOUCLE_articles>
</ul>
[<div class="pagination">(#PAGINATION)</div>]
</B_articles>
</div>
<//B_articlesdate>
[(#REM) pour les sous-rubriques, on utilise le modele <rubriqueXX|rubriques> dans le texte si on veut]
</div><!-- .main -->
<aside>
[(#REM) Gestion du portfolio et des documents ]
[(#INCLURE{fond=inclure/documents,id_rubrique})]
[(#REM) Sites de la rubrique ]
<B_sites>
<div class="liste sites">
<h2 class="h2"><:sur_web:></h2>
<ul class="liste-items">
<BOUCLE_sites(SITES) {id_rubrique} {par nom_site}>
<li class="item short">#INCLURE{fond=inclure/resume/site,id_syndic}
<B_syndic>
<ul class="spip">
<BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {0,3}>
<li class="short with-publication-inline">#INCLURE{fond=inclure/resume/syndic_article,id_syndic_article}</li>
</BOUCLE_syndic>
</ul>
</B_syndic>
</li>
</BOUCLE_sites>
</ul>
</div>
</B_sites>
[(#REM) Proposer un site ]
#FORMULAIRE_SITE
</aside>
<footer>
[<div class="notes"><h2><:info_notes:></h2>(#NOTES)</div>]
</footer>
</section>
</BOUCLE_content>

6
content/rubrique-blog.xml

@ -0,0 +1,6 @@
<composition>
<nom>Rubrique Blog</nom>
<description>Pour faire un blog complet</description>
<icon>images/rubrique-blog.png</icon>
<branche type="article" composition="blog" />
</composition>

3
content/rubrique-pagerubrique.html

@ -0,0 +1,3 @@
<BOUCLE_content(RUBRIQUES){id_rubrique}>
<INCLURE{fond=content/rubrique,id_rubrique,type-page=rubrique} />
</BOUCLE_content>

5
content/rubrique-pagerubrique.xml

@ -0,0 +1,5 @@
<composition>
<nom>Page Rubrique </nom>
<description>Pour passer par la page rubrique avec la liste des articles - en utilisant Court-circuit, les rubriques avec composition sont ignorées du court-circuit, donc attribuer une composition mais vers le squelette normal...</description>
<icon>images/rubrique-pagerubrique.png</icon>
</composition>

54
content/rubrique.html

@ -0,0 +1,54 @@
<BOUCLE_content(RUBRIQUES){id_rubrique}>
<section class="content" id="content">
<header class="cartouche">
<h1 class="#EDIT{titre}">#TITRE</h1>
[<p class="publication"><time datetime="[(#DATE|date_iso)]"><:dernier_ajout:> : (#DATE|affdate_jourcourt).</time></p>]
<INCLURE{fond=breadcrumb/rubrique,env} />
</header>
<div class="main">
[<div class="#EDIT{texte} texte">(#TEXTE|image_reduire{700,*})</div>]
<div class="liste articles">
<INCLURE{fond=liste/articles-resume,env,ajax,titre=<:articles_rubrique:>} />
</div>
[(#REM) Si aucun article, affiche un plan de la rubrique : en fait non, on a la liste en aside, on la garde là-bas et on se sert du texte si on veut en mettre en avant au cas par cas
ou éventuellement avec un modèle <rubriqueX|articles>
+ activer le plugin court-circuit pour aller directement dans larticle si un seul présent
]
</div>
<footer>
[(#REM) Gestion du portfolio et des documents ]
[(#INCLURE{fond=inclure/documents,id_rubrique})]
[<div class="notes"><h2><:info_notes:></h2>(#NOTES)</div>]
</footer>
<aside>
[(#REM) Sites de la rubrique ]
<B_sites>
<div class="liste sites">
<h2 class="h2"><:sur_web:></h2>
<ul class="liste-items">
<BOUCLE_sites(SITES) {id_rubrique} {par nom_site}>
<li class="item short">#INCLURE{fond=inclure/resume/site,id_syndic}
<B_syndic>
<ul class="spip">
<BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {0,3}>
<li class="short with-publication-inline">#INCLURE{fond=inclure/resume/syndic_article,id_syndic_article}</li>
</BOUCLE_syndic>
</ul>
</B_syndic>
</li>
</BOUCLE_sites>
</ul>
</div>
</B_sites>
</aside>
</section>
</BOUCLE_content>

23
content/site.html

@ -0,0 +1,23 @@
<BOUCLE_content(SITES){id_syndic}>
<section class="content" id="content">
<header class="cartouche">
<h1 class="#EDIT{nom_site}">[<a href="#URL_SITE">(#LOGO_SITE|image_reduire)</a>]#NOM_SITE</h1>
<INCLURE{fond=breadcrumb/#ENV{type-page},env} />
</header>
<div class="main">
[<div class="#EDIT{descriptif} chapo">(#DESCRIPTIF)</div>]
[<p class="#EDIT{url_site} hyperlien"><a href="#URL_SITE" class="spip_out">(#URL_SITE|couper{80})</a></p>]
</div>
<aside>
<INCLURE{fond=liste/syndicarticles,id_syndic,env,ajax} />
</aside>
<footer>
[<div class="notes"><hr />(#NOTES)</div>]
</footer>
</section>
</BOUCLE_content>

33
content/sommaire.html

@ -0,0 +1,33 @@
<section class="content" id="content">
<header class="cartouche visuallyhidden">
<h1>#NOM_SITE_SPIP</h1>
</header>
<div class="main">
<B_accueil>
<article class="texte_accueil">
<BOUCLE_accueil(ARTICLES){page=accueil}>
[<h2 class="h2 visuallyhidden">(#TITRE|sinon{<:accueil:>})</h2>]
<div class="main">
[<div class="#EDIT{chapo} chapo surlignable">(#CHAPO|image_reduire{700,*})</div>]
[<div class="#EDIT{texte} texte surlignable">(#TEXTE|image_reduire{700,*})</div>]
[<p class="#EDIT{hyperlien} hyperlien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
</div>
<footer>
[<div class="#EDIT{ps} ps surlignable"><h2><:info_ps:></h2>(#PS|image_reduire{700,*})</div>]
[<div class="notes"><h2><:info_notes:></h2>(#NOTES)</div>]
</footer>
</BOUCLE_accueil>
</article>
</B_accueil>
[<div id="descriptif_site_spip" class="#EDIT{meta-descriptif_site} texte_accueil">(#DESCRIPTIF_SITE_SPIP)</div>]
<//B_accueil>
<div class="liste long articles">
<INCLURE{fond=liste/articles-resume,env,ajax} />
</div>
</div>
</section>

16
content/spip_pass.html

@ -0,0 +1,16 @@
<section class="content" id="content">
<header class="cartouche">
<h1>#NOM_SITE_SPIP</h1>
</header>
<div class="main">
<div class="pass">
[(#ENV{p}|non)
#FORMULAIRE_OUBLI
]
[(#ENV{p}|oui)
#FORMULAIRE_MOT_DE_PASSE
]
</div>
</div>
</section>

10
content/z_apl.html

@ -0,0 +1,10 @@
[(#REM)
Squelette Big_Pipe
http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919
(c) 2010 Cedric Morin
Distribue sous licence GPL
]#CACHE{0}
#INCLURE{fond=inclure/ajax_parallel_load,bloc=#SQUELETTE}

7
extra/article.html

@ -0,0 +1,7 @@
<BOUCLE_article(ARTICLES){id_article}>
[(#COMPOSITION|=={blog}|oui)
<INCLURE{fond=inclure/mots-articles-rubrique,env} />
<INCLURE{fond=inclure/periode-mois,env} />]
</BOUCLE_article>

15
extra/auteur.html

@ -0,0 +1,15 @@
<BOUCLE_extra2_auteur(AUTEURS){id_auteur}>
[(#REM) Autres auteurs ]
<B_auteurs>
<div class="liste auteurs">
#ANCRE_PAGINATION
<h2 class="h2"><:info_auteurs:></h2>
<ul class="liste-items">
<BOUCLE_auteurs(AUTEURS) {par nom} {pagination 20}>
<li class="item"><a href="#URL_AUTEUR"[ class="(#EXPOSE)"]>[(#NOM|couper{80})]</a></li>
</BOUCLE_auteurs>
</ul>
[<div class="pagination">(#PAGINATION)</div>]
</div>
</B_auteurs>
</BOUCLE_extra2_auteur>

2
extra/dist.html

@ -0,0 +1,2 @@
[(#REM) Inscription au site ]
#FORMULAIRE_INSCRIPTION

31
extra/mot.html

@ -0,0 +1,31 @@
<BOUCLE_principale(MOTS) {id_mot} {doublons}>
[(#REM) Menu de navigation mots-cles : les autres mots cles du meme groupe ]
<B_mots_freres>
<div class="liste mots">
#ANCRE_PAGINATION
<h2 class="h2">#INFO_TITRE{groupes_mots,#ID_GROUPE}</h2>
<ul class="liste-items inline">
<BOUCLE_mots_freres(MOTS) {type} {par titre} {pagination 20}>
<li class="item"><a href="#URL_MOT"[ class="(#EXPOSE)"]>#TITRE</a></li>
</BOUCLE_mots_freres>
</ul>
[<div class="pagination">(#PAGINATION)</div>]
</div>
</B_mots_freres>
[(#REM) Menu de navigation mots-cles : les autres groupes ]
<B_groupes_freres>
<div class="liste groupes_mots">
<BOUCLE_groupes_freres(GROUPES_MOTS) {!id_groupe} {par titre} {doublons}>
<B_mot_cousin>#ANCRE_PAGINATION
<h2 class="h2">#INFO_TITRE{groupes_mots,#ID_GROUPE}</h2>
<ul class="liste-items inline">
<BOUCLE_mot_cousin(MOTS) {id_groupe} {par titre} {pagination 20}>
<li class="item"><a href="#URL_MOT">#TITRE</a></li>
</BOUCLE_mot_cousin>
</ul>
[<div class="pagination">(#PAGINATION)</div>]
</B_mot_cousin>
</BOUCLE_groupes_freres>
</div>
</B_groupes_freres>
</BOUCLE_principale>

17
extra/rubrique.html

@ -0,0 +1,17 @@
<BOUCLE_extra2_rubrique(RUBRIQUES){id_rubrique}>
[(#REM) Menu de navigation mots-cles ]
<B_mots>
<div class="liste mots">
<h2 class="h2"><:mots_clefs:></h2>
<ul class="liste-items">
<BOUCLE_mots(MOTS) {id_rubrique} {par titre}>
<li class="item"><a href="#URL_MOT" rel="tag">#TITRE</a></li>
</BOUCLE_mots>
</ul>
</div>
</B_mots>
[(#COMPOSITION|=={blog}|oui)
<INCLURE{fond=inclure/mots-articles-rubrique,env} />
<INCLURE{fond=inclure/periode-mois,env} />]
</BOUCLE_extra2_rubrique>

27
extra/site.html

@ -0,0 +1,27 @@
[(#REM) Autres sites web ]
<BOUCLE_testsites(SITES){id_rubrique}{1,2}>
</BOUCLE_testsites>
<B_sites>
<div class="liste sites">
#ANCRE_PAGINATION
<h2 class="h2"><:sites_web:></h2>
<ul class="liste-items">
<BOUCLE_sites(SITES){id_rubrique}{par nom_site} {pagination 20}>
<li class="item"><a href="[(#ID_SYNDIC|generer_url_entite{site,'','',#CONNECT})]"[ class="(#EXPOSE)"]>#NOM_SITE</a></li>
</BOUCLE_sites>
</ul>
[<div class="pagination">(#PAGINATION)</div>]
</div>
</B_sites>
</B_testsites>
[(#REM) Menu de navigation mots-cles ]
<B_mots>
<div class="liste mots">
<h2 class="h2"><:mots_clefs:></h2>
<ul class="liste-items">
<BOUCLE_mots(MOTS) {id_syndic} {par titre}>
<li class="item"><a href="#URL_MOT" rel="tag">#TITRE</a></li>
</BOUCLE_mots>
</ul>
</div>
</B_mots>

2
extra/sommaire.html

@ -0,0 +1,2 @@
[(#REM) Inscription au site ]
#FORMULAIRE_INSCRIPTION

10
extra/z_apl.html

@ -0,0 +1,10 @@
[(#REM)
Squelette Big_Pipe
http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919
(c) 2010 Cedric Morin
Distribue sous licence GPL
]#CACHE{0}
#INCLURE{fond=inclure/ajax_parallel_load,bloc=#SQUELETTE}

30
footer/dist.html

@ -0,0 +1,30 @@
<p class="colophon">
<BOUCLE_annee(ARTICLES){par date}{0,1}>[(#DATE|annee|!={#VAL{Y}|date}|oui)[(#DATE|annee)]]</BOUCLE_annee>-</B_annee>[(#DATE|annee) ] &mdash; #NOM_SITE_SPIP<br />
<a rel="contents" href="#URL_PAGE{plan}"><:plan_site:></a><span class="sep"> |
</span><a href="#URL_PAGE{backend}" rel="alternate" title="<:syndiquer_site:>">RSS&nbsp;2.0</a>
<B_mentions>
<span class="sep"> |
</span><BOUCLE_mentions(ARTICLES){page=mentions}>
<a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_mentions>
<B_contact>
<span class="sep"> | </span>
<BOUCLE_contact(ARTICLES){page=contact}>
<a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_contact>
</p>
<p class="colophon"><?php
if (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']) {
?><a href="#URL_LOGOUT" rel="nofollow"><:icone_deconnecter:></a><?php
if (include_spip('inc/autoriser') AND autoriser('ecrire')){
?><span class="sep"> | </span><a href="#EVAL{_DIR_RESTREINT_ABS}"><:espace_prive:></a>
<span class="sep"> | </span><?php
}
}
else {
?><a href="[(#URL_PAGE{login}|parametre_url{url,#SELF|parametre_url{url,''}})]" rel="nofollow" class='login_modal'><:lien_connecter:></a>
<span class="sep"> | </span><?php
}
?>
<span class="generator"><a href="http://www.spip.net/" title="<:site_realise_avec_spip:>" class="spip_out">SPIP</a></span>
</p>

22
formulaires/configurer_baz_april.html

@ -0,0 +1,22 @@
<div class="formulaire_spip formulaire_configurer formulaire_#FORM">
<h3 class="titrem"><:baz_april:configuration_baz_april:></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="#ENV{action}"><div>
#ACTION_FORMULAIRE{#ENV{action}}
<ul class="editer-groupe">
[(#SAISIE{case,afficherauteurs,
label=<:baz_april:afficherauteurs_label:>,
explication=<:baz_april:afficherauteurs_explications:>,
defaut=non})]
</ul>
<p class="boutons">
<input type="submit" class="submit" value="<:bouton_valider:>" />
</p>
</div></form>
</div>

57
formulaires/login.html

@ -0,0 +1,57 @@
#HTTP_HEADER{"Cache-Control: no-store, no-cache, must-revalidate"}
#HTTP_HEADER{"Pragma: no-cache"}
<div class='formulaire_spip formulaire_login'>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{_deja_loge})</p>]
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class='reponse_formulaire reponse_formulaire_erreur'>(#ENV*{message_erreur})</p>]
[(#ENV{echec_cookie})
<fieldset class='reponse_formulaire reponse_formulaire_erreur'>
<h2><:avis_erreur_cookie:></h2>
<p class="erreur_message"><:login_cookie_oblige:><br /><:login_cookie_accepte:></p>
</fieldset>]
[(#ENV{editable})
<form id='formulaire_login' method='post' action='#ENV{action}'>
[(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ]
#ACTION_FORMULAIRE
<fieldset>
<legend><:form_forum_identifiants:></legend>
<div class="form-group editer-groupe">
<div class="editer editer_login obligatoire[(#ENV**{erreurs}|table_valeur{var_login}|oui)erreur]">
<label for="var_login"><:login_login2:></label>[
<span class="erreur_message">(#ENV**{erreurs}|table_valeur{var_login})</span>
]<input type='text' class='form-control text [(#ENV*{_logo}|oui)avec_spip_logo_auteur]' name='var_login' id='var_login' value="[(#ENV**{var_login})]" size='40'[(#HTML5) required='required' autofocus='autofocus'] autocapitalize="off" autocorrect="off" />[
<span id="spip_logo_auteur">(#ENV*{_logo,''})</span>]
</div>
<div class="editer editer_password obligatoire[(#ENV**{erreurs}|table_valeur{password}|oui)erreur]">
<label for="password"><:login_pass2:></label>[
<span class="erreur_message">(#ENV**{erreurs}|table_valeur{password})</span>
]<input type='password' class='form-control text password' name='password' id='password' value="" size='40' autocapitalize="off" autocorrect="off" />
<p class='details'><a href="[(#URL_PAGE{spip_pass}|parametre_url{lang,#LANG})]" id='spip_pass'><:login_motpasseoublie:></a></p>
</div>
[(#ENV{rester_connecte})
<div class="editer editer_session"><div class='choix'>
<input type="checkbox" class="form-control checkbox" name="session_remember" id="session_remember" value="oui" [(#ENV**{cnx}|?{' '})checked="checked"] onchange="jQuery(this).addClass('modifie');" />
<label class='nofx' for="session_remember"><:login_rester_identifie:></label>
</div></div>]
</div>
</fieldset>
<p class="boutons"><input type="submit" class="submit" value="<:bouton_valider|attribut_html:>" /></p>
</form>
]
[(#REM) en cas d'absence de cookie, on represente le formulaire alternatif ]
[<form action="(#ENV{auth_http})" method="get">[
(#ENV{auth_http}|form_hidden)
]
<fieldset>
<legend><:login_sans_cookie:></legend>
<:login_preferez_refuser:>
<input type="hidden" name="essai_auth_http" value="oui"/>
[<input type="hidden" name="url" value="(#ENV{url})"/>]
<p class="boutons"><input type="submit" class="submit" value="<:login_sans_cookie|attribut_html:>"/></p>
</fieldset>
</form>
]
</div>

333
formulaires/login.php

@ -0,0 +1,333 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2019 *
* 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. *
\***************************************************************************/
/**
* Gestion du formulaire d'identification / de connexion à SPIP
*
* @package SPIP\Core\Formulaires
**/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('base/abstract_sql');
/**
* Teste si une URL est une URL de l'espace privé (administration de SPIP)
* ou de l'espace public
*
* @param string $cible URL
* @return bool
* true si espace privé, false sinon.
**/
function is_url_prive($cible) {
include_spip('inc/filtres_mini');
$path = parse_url(tester_url_absolue($cible) ? $cible : url_absolue($cible));
$path = (isset($path['path']) ? $path['path'] : '');
return strncmp(substr($path, -strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS)) == 0;
}
/**
* Chargement du formulaire de login
*
* Si on est déjà connecté, on redirige directement sur l'URL cible !
*
* @uses auth_informer_login()
* @uses is_url_prive()
* @uses login_auth_http()
*
* @param string $cible
* URL de destination après identification.
* Cas spécifique : la valeur `@page_auteur` permet d'être redirigé
* après connexion sur le squelette public de l'auteur qui se connecte.
* @param string $login
* Login de la personne à identifier (si connu)
* @param null|bool $prive
* Identifier pour l'espace privé (true), public (false)
* ou automatiquement (null) en fonction de la destination de l'URL cible.
* @return array
* Environnement du formulaire
**/
function formulaires_login_charger_dist($cible = '', $login = '', $prive = null) {
$erreur = _request('var_erreur');
if (!$login) {
$login = strval(_request('var_login'));
}
// si on est deja identifie
if (!$login and isset($GLOBALS['visiteur_session']['login'])) {
$login = $GLOBALS['visiteur_session']['login'];
}
// ou si on a un cookie admin
// if (!$login) {
// if (isset($_COOKIE['spip_admin'])
// and preg_match(',^@(.*)$,', $_COOKIE['spip_admin'], $regs)
// ) {
// $login = $regs[1];
// }
// }
include_spip('inc/auth');
$row = auth_informer_login($login);
// Construire l'environnement du squelette
// Ne pas proposer de "rester connecte quelques jours"
// si la duree de l'alea est inferieure a 12 h (valeur par defaut)
$valeurs = array(
'var_login' => $login,
'editable' => !$row,
'cnx' => isset($row['cnx']) ? $row['cnx'] : '0',
'auth_http' => login_auth_http(),
'rester_connecte' => ((_RENOUVELLE_ALEA < 12 * 3600) ? '' : ' '),
'_logo' => isset($row['logo']) ? $row['logo'] : '',
'_alea_actuel' => isset($row['alea_actuel']) ? $row['alea_actuel'] : '',
'_alea_futur' => isset($row['alea_futur']) ? $row['alea_futur'] : '',
'_pipeline' => 'affiche_formulaire_login', // faire passer le formulaire dans un pipe dedie pour les methodes auth
);
if ($erreur or !isset($GLOBALS['visiteur_session']['id_auteur']) or !$GLOBALS['visiteur_session']['id_auteur']) {
$valeurs['editable'] = true;
}
if (is_null($prive) ? is_url_prive($cible) : $prive) {
include_spip('inc/autoriser');
$loge = autoriser('ecrire');
} else {
$loge = (isset($GLOBALS['visiteur_session']['auth']) and $GLOBALS['visiteur_session']['auth'] != '');
}
// Si on est connecte, appeler traiter()
// et lancer la redirection si besoin
if (!$valeurs['editable'] and $loge and _request('formulaire_action')!=='login') {
$traiter = charger_fonction('traiter', 'formulaires/login');
$res = $traiter($cible, $login, $prive);
$valeurs = array_merge($valeurs, $res);
if (isset($res['redirect']) and $res['redirect']) {
include_spip('inc/headers');
# preparer un lien pour quand redirige_formulaire ne fonctionne pas
$m = redirige_formulaire($res['redirect'], '', 'ajaxform');
$valeurs['_deja_loge'] = inserer_attribut(
'<a>' . _T('login_par_ici') . "</a>$m",
'href',
$res['redirect']
);
}
}
// en cas d'echec de cookie, inc_auth a renvoye vers le script de
// pose de cookie ; s'il n'est pas la, c'est echec cookie
// s'il est la, c'est probablement un bookmark sur bonjour=oui,
// et pas un echec cookie.
if ($erreur == 'cookie') {
$valeurs['echec_cookie'] = ' ';
} elseif ($erreur) {
// une erreur d'un SSO indique dans la redirection vers ici
// mais il faut se proteger de toute tentative d'injection malveilante
include_spip('inc/texte');
$valeurs['message_erreur'] = safehtml($erreur);
}
return $valeurs;
}
/**
* Identification via HTTP (si pas de cookie)
*
* Gére le cas où un utilisateur ne souhaite pas de cookie :
* on propose alors un formulaire pour s'authentifier via http
*
* @return string
* - Si connection possible en HTTP : URL pour réaliser cette identification,
* - chaîne vide sinon.
**/
function login_auth_http() {
if (!$GLOBALS['ignore_auth_http']
and _request('var_erreur') == 'cookie'
and (!isset($_COOKIE['spip_session']) or $_COOKIE['spip_session'] != 'test_echec_cookie')
and (($GLOBALS['flag_sapi_name'] and preg_match(',apache,i', @php_sapi_name()))
or preg_match(',^Apache.* PHP,', $_SERVER['SERVER_SOFTWARE']))
// Attention dans le cas 'intranet' la proposition de se loger
// par auth_http peut conduire a l'echec.
and !(isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW']))
) {
return generer_url_action('cookie', '', false, true);
} else {
return '';
}
}
/**
* Vérifications du formulaire de login
*
* Connecte la personne si l'identification réussie.
*
* @uses auth_identifier_login()
* @uses auth_loger()
* @uses login_autoriser()
*
* @param string $cible
* URL de destination après identification.
* Cas spécifique : la valeur `@page_auteur` permet d'être redirigé
* après connexion sur le squelette public de l'auteur qui se connecte.
* @param string $login
* Login de la personne à identifier (si connu)
* @param null|bool $prive
* Identifier pour l'espace privé (true), public (false)
* ou automatiquement (null) en fonction de la destination de l'URL cible.
* @return array
* Erreurs du formulaire
**/
function formulaires_login_verifier_dist($cible = '', $login = '', $prive = null) {
$session_login = _request('var_login');
$session_password = _request('password');
$session_remember = _request('session_remember');
if (!$session_login) {
# pas de login saisi !
return array('var_login' => _T('info_obligatoire'));
}
// appeler auth_identifier_login qui va :
// - renvoyer un string si echec (message d'erreur)
// - un array decrivant l'auteur identifie si possible
// - rediriger vers un SSO qui renverra in fine sur action/auth qui finira l'authentification
include_spip('inc/auth');
$auteur = auth_identifier_login($session_login, $session_password);
// on arrive ici si on ne s'est pas identifie avec un SSO
if (!is_array($auteur)) {
$erreurs = array();
if (is_string($auteur) and strlen($auteur)) {
$erreurs['var_login'] = $auteur;
}
include_spip('inc/cookie');
spip_setcookie('spip_admin', '', time() - 3600);
if (strlen($session_password)) {
$erreurs['password'] = _T('login_erreur_pass');
} else {
// sinon c'est un login en deux passe old style (ou js en panne)
// pas de message d'erreur
$erreurs['password'] = ' ';
}
return
$erreurs;
}
// on a ete authentifie, construire la session
// en gerant la duree demandee pour son cookie
if ($session_remember !== null) {
$auteur['cookie'] = $session_remember;
}
// si la connexion est refusee on renvoi un message erreur de mot de passe
// car en donnant plus de detail on renseignerait un assaillant sur l'existence d'un compte
if (auth_loger($auteur) === false) {
$erreurs['message_erreur'] = _T('login_erreur_pass');
return $erreurs;
}
return (is_null($prive) ? is_url_prive($cible) : $prive)
? login_autoriser() : array();
}
/**
* Teste l'autorisation d'accéder à l'espace privé une fois une connexion
* réussie, si la cible est une URL privée.
*
* Dans le cas contraire, un message d'erreur est retourné avec un lien
* pour se déconnecter.