New feature : Ajouter des services

pull/19/head
Chancellier Pierre-Jean 2 years ago
parent 7d12b2d291
commit fa522ecd5f

@ -3,4 +3,22 @@ Portage pour SPIP de la solution de gestion de consentement aux cookies Tarteauc
Voir https://www.cnil.fr/fr/solutions-centralisees-de-recueil-de-consentement-aux-cookies-les-gestionnaires-de-tag
La documentation est ici : https://contrib.spip.net/Tarteaucitron-5292
La documentation est ici : https://contrib.spip.net/Tarteaucitron-5292
## Ajouter un service
1. Rendez-vous sur ***ecrire/?exec=configurer_services***
2. Recherchez votre service pour savoir si il faut l'installer et, si besoin, installez-le
3. Cette action va créer le fichier ***services/monservice.html*** avec le code suivant :
```js
(tarteaucitron.job = tarteaucitron.job || []).push('monservice');
```
4. Si besoin, éditez-le
5. Activez votre service pour que ce fichier soit inclus dans les squelettes et donc pris en compte par **TarteAuCitron**
6. Au besoin, rajouter un fichier ***modeles/tac_monservice.html*** ainsi qu'un fichier ***icones_barre/monservice.png*** (carré de 17 pixels) pour permettre aux rédacteurs d'insérer du contenu facilement via la barre d'outils du porte-plume
## Traiter du contenu ancien
Pour traiter du contenu ancien, adaptez le fichier ***action/tac_nettoyer_iframes.php*** et appelez-le via le bouton l'onglet technique (***ecrire/?exec=configurer_technique***) ou directement par l'url ***spip.php?action=tac_nettoyer_iframes***. Il s'agit d'une adaptation du script présent dans le plugin **oembed**.

@ -0,0 +1,63 @@
<?php
/**
* Plugin TarteAuCitron
* Licence GPL3
*
*/
if (!defined('_ECRIRE_INC_VERSION')){
return;
}
/**
* Désinstalle un service
* appelé avec ?action=tac_desinstaller_service&service=service
* autorisé pour les seuls webmestres
*/
function action_tac_desinstaller_service_dist(){
include_spip('inc/tarteaucitron');
include_spip('inc/autoriser');
if (!autoriser('webmestre')){
die('Pas autorise');
}
$service = _request('service');
$list_services = tarteaucitron_liste_services();
if (!array_key_exists($service,$list_services)) {
die('Service inexistant');
}
if ($list_services[$service]['statut']=='desinstalle') {
die('Service déjà désinstallé');
}
$file = _DIR_PLUGIN_TARTEAUCITRON . "services/" . $service . ".html";
if (file_exists($file)) {
unlink($file);
}
$file = _DIR_PLUGIN_TARTEAUCITRON . "modeles/tac_" . $service . ".html";
if (file_exists($file)) {
unlink($file);
}
$file = _DIR_PLUGIN_TARTEAUCITRON . "icones_barre/" . $service . ".png";
if (file_exists($file)) {
unlink($file);
}
include_spip('inc/config');
$services_installes = lire_config("tarteaucitron/services_installes/");
$i = 0;
foreach($services_installes as $service_installe) {
if ($service==$service_installe){
array_splice($services_installes,$i,1);
}
$i++;
}
ecrire_config("tarteaucitron/services_installes/", $services_installes);
}

@ -0,0 +1,50 @@
<?php
/**
* Plugin TarteAuCitron
* Licence GPL3
*
*/
if (!defined('_ECRIRE_INC_VERSION')){
return;
}
/**
* Installe un service
* appelé avec ?action=tac_installer_service&service=service
* autorisé pour les seuls webmestres
*/
function action_tac_installer_service_dist(){
include_spip('inc/tarteaucitron');
include_spip('inc/autoriser');
if (!autoriser('webmestre')){
die('Pas autorise');
}
$service = _request('service');
$list_services = tarteaucitron_liste_services();
if (!array_key_exists($service,$list_services)) {
die('Service inexistant');
}
if ($list_services[$service]['statut']=='installe') {
die('Service déjà installé');
}
file_put_contents(_DIR_PLUGIN_TARTEAUCITRON . "services/" . $service . ".html", "(tarteaucitron.job = tarteaucitron.job || []).push('" . $service . "');");
// TODO : récupérer le modèle HTML de tarteaucitron (scrapping ?)
file_put_contents(_DIR_PLUGIN_TARTEAUCITRON . 'modeles/tac_' . $service . '.html', "Placez le code HTML");
// TODO : créer un fichier icones_barre/monservice.png en 17px de côté avec le nom du service ?
include_spip('inc/config');
$services_installes = lire_config("tarteaucitron/services_installes/");
if (!in_array($service,$services_installes,true)) {
$services_installes[] = $service;
}
ecrire_config("tarteaucitron/services_installes/", $services_installes);
}

@ -0,0 +1,251 @@
<?php
/**
* Plugin TarteAuCitron
* Licence GPL3
*
*/
if (!defined('_ECRIRE_INC_VERSION')){
return;
}
/**
* Conversion des iframe en modèles pour TarteAuCitron
* appelé avec ?action=tac_nettoyer_iframes
* autorisé pour les seuls webmestres
*/
function action_tac_nettoyer_iframes_dist(){
include_spip('inc/autoriser');
include_spip('inc/filtres');
include_spip('action/editer_objet');
if (!autoriser('webmestre')){
die('Pas autorise');
}
echo '<h1>Conversion des &lt;iframe&gt;</h1>';
$simu = true;
if (_request('modif')){
$simu = false;
}
if ($simu){
echo "<p><strong>mode SIMULATION</strong> (ajoutez &modif=1 dans l'url pour modifier les contenus)</p>";
}
$tables = array(
'spip_articles' => array('descriptif', 'chapo', 'texte', 'ps'),
);
foreach ($tables as $table => $champs){
$objet = objet_type($table);
foreach ($champs as $champ){
$primary = id_table_objet($table);
$res = sql_select("$primary,$champ", $table, "$champ LIKE '%iframe%' OR $champ LIKE '%object%'");
while ($row = sql_fetch($res)){
$pre = "$primary=" . $row[$primary] . ":$champ:";
$texte = $row[$champ];
$iframes = extraire_balises($texte, 'iframe');
if (count($iframes)){
foreach ($iframes as $iframe){
$url = '';
$src = extraire_attribut($iframe, 'src');
if (strncmp($src, '//', 2)==0){
$src = 'http:' . $src;
}
if (strpos($iframe, 'youtube')!==false){
if (strpos($src, '/embed/')!==false){
$url = str_replace('?', '&', $src);
$url = str_replace('/embed/videoseries&', '/playlist?', $url);
$url = str_replace('/embed/', '/watch?v=', $url);
$url = str_replace('&feature=player_embedded', '', $url);
preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);
$url = "<tac_youtube|id=" . $match[1] . ">";
echo "$pre Youtube " . entites_html($url) . "<br />";
}
if (!$url){
var_dump($row);
var_dump(entites_html($iframe));
die('youtube inconnue');
}
} elseif (strpos($iframe, 'dailymotion')!==false) {
if (strpos($src, '/embed/')!==false){
$url = str_replace('/embed/', '/', $src);
$url = explode('?', $url);
$url = reset($url);
$url = "<tac_dailymotion|id=" . strtok(basename($url), '_') . ">";
echo "$pre DailyMotion" . entites_html($url) . "<br />";
}
if (!$url){
var_dump($row);
var_dump($iframe);
die('dailymotion inconnue');
}
} elseif (strpos($iframe, 'player.vimeo')!==false) {
if (strpos($src, '/video/')!==false){
$url = str_replace('/video/', '/', $src);
$url = str_replace('player.vimeo', 'vimeo', $url);
$url = explode('?', $url);
$url = reset($url);
preg_match('%https?:\/\/(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)%i', $url, $match);
$url = "<tac_vimeo|id=" . $match[3] . ">";
echo "$pre Vimeo " . entites_html($url) . "<br />";
}
if (!$url){
var_dump($row);
var_dump($iframe);
die('vimeo inconnue');
}
} /*elseif (strpos($iframe, 'soundcloud') !== false) {
// un peu complique :
// il faut faire une requete oembed sur l'url api, avec iframe=false
// pour recuperer du html avec un lien vers la page soundcloud
parse_str(end(explode('?', $src)), $args);
$api_url = $args['url'];
include_spip('inc/oembed');
include_spip('inc/distant');
$provider = oembed_verifier_provider($api_url);
$data_url = parametre_url(url_absolue($provider['endpoint'], url_de_base()), 'url', $api_url, '&');
$data_url = parametre_url($data_url, 'format', 'json', '&');
$data_url = parametre_url($data_url, 'iframe', 'false', '&');
$json = recuperer_page($data_url);
$json = json_decode($json, true);
$link = extraire_balise($json['html'], 'a');
if ($url = extraire_attribut($link, 'href')) {
echo "$pre SoundCloud $url<br />";
}
if (!$url) {
var_dump($row);
var_dump($iframe);
die('soundcloud inconnue');
}
} */ elseif (strpos($iframe, 'www.google.com/calendar') !== false) {
if (strpos($src, '/embed')!==false){
preg_match('#(src=)(\w+)$#', $src, $match);
$url = "<tac_gagenda|id=" . $match[2] . ">";
echo "$pre Google Agenda " . entites_html($url) . "<br />";
}
} elseif (strpos($iframe, 'www.canal-u.tv/video') !== false) {
if (strpos($src, '/embed')!==false){
preg_match('#(/embed.1/)(.+)(\?)#', $src, $match);
$url = "<tac_canalu|id=" . $match[2] . ">";
$divs = extraire_balises($texte, 'div');
foreach ($divs as $div) {
if (strpos($div, $match[2])!==false) {
$iframe = $div;
}
}
echo "$pre Canal-U.tv " . entites_html($url) . "<br />";
}
} elseif (strpos($iframe, 'webtv.normandie-univ.fr') !== false) {
if (strpos($src, '/permalink/')!==false){
preg_match('#(/permalink/)(\w+)(/iframe)#', $src, $match);
$url = "<tac_webtvnu|id=" . $match[2] . ">";
echo "$pre WebTV Normandie Université " . entites_html($url) . "<br />";
}
} else {
echo "$pre iframe inconnue : " . entites_html($iframe) . '<br />';
}
if ($url){
$texte = str_replace($iframe, "\n\n" . $url . "\n\n", $texte);
if (preg_match(',<center>\s*' . preg_quote($url, ',') . '.*</center>,Uims', $texte, $m)){
$texte = str_replace($m[0], "\n\n" . $url . "\n\n", $texte);
}
$texte = preg_replace(',\s+' . preg_quote($url, ',') . '\s+,ims', "\n\n" . $url . "\n\n", $texte);
}
}
if ($texte!==$row[$champ]){
echo "$pre Corrige $champ <br />";
if (!$simu){
echo "$pre Corrige $champ <br />";
objet_modifier($objet, $row[$primary], array($champ => $texte));
} else {
echo "SIMU : $pre Corrige $champ <br />";
}
}
}
$objects = extraire_balises($texte, 'object');
if (count($objects)){
foreach ($objects as $object){
$url = '';
$src = extraire_attribut($object, 'data');
if (strncmp($src, '//', 2)==0){
$src = 'http:' . $src;
}
if (strpos($src, 'youtube')!==false){
if (strpos($src, '/v/')!==false){
$url = str_replace('?', '&', $src);
$url = str_replace('/v/', '/watch?v=', $url);
} elseif (strpos($src, '/embed/')!==false) {
$url = str_replace('?', '&', $src);
$url = str_replace('/embed/', '/watch?v=', $url);
}
if (!$url){
var_dump($row);
var_dump(entites_html($object));
die('youtube inconnue');
} else {
preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);
$url = "<tac_youtube|id=" . $match[1] . ">";
echo "$pre Youtube " . entites_html($url) . "<br />";
}
} elseif (strpos($src, 'dailymotion')!==false) {
if (strpos($src, '/swf/video/')!==false){
$url = str_replace('/swf/video/', '/video/', $src);
$url = explode('?', $url);
$url = reset($url);
} elseif (strpos($src, '/swf/')!==false) {
$url = str_replace('/swf/', '/video/', $src);
$url = explode('?', $url);
$url = reset($url);
}
if (!$url){
var_dump($row);
var_dump($object);
die('dailymotion inconnue');
} else {
$url = "<tac_dailymotion|id=" . strtok(basename($url), '_') . ">";
echo "$pre DailyMotion" . entites_html($url) . "<br />";
}
} elseif (strpos($src, 'vimeo.com')!==false) {
if (strpos($src, 'moogaloop')!==false
and $id = parametre_url($src, 'clip_id')){
$url = "https://vimeo.com/$id";
} elseif (strpos($src, '/video/')!==false) {
$url = $src;
}
if (!$url){
var_dump($row);
var_dump(entites_html($object));
die('vimeo inconnue');
} else {
preg_match('%https?:\/\/(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)%i', $url, $match);
$url = "<tac_vimeo|id=" . $match[3] . ">";
echo "$pre Vimeo " . entites_html($url) . "<br />";
}
} else {
echo "$pre object inconnue : " . entites_html($object) . '<br />';
}
if ($url){
$texte = str_replace($object, "\n\n" . $url . "\n\n", $texte);
if (preg_match(',<center>\s*' . preg_quote($url, ',') . '.*</center>,Uims', $texte, $m)){
$texte = str_replace($m[0], "\n\n" . $url . "\n\n", $texte);
}
$texte = preg_replace(',\s+' . preg_quote($url, ',') . '\s+,ims', "\n\n" . $url . "\n\n", $texte);
}
}
if ($texte!==$row[$champ]){
if (!$simu){
echo "$pre Corrige $champ <br />";
objet_modifier($objet, $row[$primary], array($champ => $texte));
} else {
echo "SIMU : $pre Corrige $champ <br />";
}
}
}
}
}
}
}

@ -0,0 +1,30 @@
<?php
/**
* Plugin TarteAuCitron
* Licence GPL3
*
*/
if (!defined('_ECRIRE_INC_VERSION')){
return;
}
/**
* Retourne la lise des services avec leur type et leur statut (installe/desinstalle)
* au format json
* appelé avec ?exec=tac_liste_services
*/
function exec_tac_liste_services_dist(){
include_spip('inc/tarteaucitron');
include_spip('inc/autoriser');
if (!autoriser('webmestre')){
die('Pas autorise');
}
header('Content-Type: application/json');
$list_services = tarteaucitron_liste_services();
echo json_encode($list_services);
}

@ -0,0 +1,85 @@
<div id="formulaire_#FORM"" class="formulaire_spip formulaire_configurer formulaire_#FORM">
<div>
<ol class="explication">
<li>Recherchez et installez votre service</li>
<li>Activez votre service</li>
<li>Si besoin, éditez le fichier <code>modeles/tac_monservice.html</code> pour y placer le code fourni par <a href="https://tarteaucitron.io/fr/install/">TarteAuCitron (Etape3)</a> et ajoutez une icône <code>icones_barre/monservice.png</code> pour permettre aux rédacteurs d'insérer du contenu facilement via la barre d'outils du porte-plume</li>
</ol>
<div class="editer-groupe">
<div class="editer editer_searchService obligatoire saisie_input editer_even">
<label class="label" for="champ_searchService"><:tarteaucitron:cfg_titre_recherche_services:></label>
<input type="text" name="searchService" class="text" id="champ_searchService" value="" required="required" placeholder="<:tarteaucitron:cfg_titre_placeholder_recherche_services:>" autocomplete="off">
</div>
</div>
<div class="image_loading"></div>
<fieldset>
<legend><:tarteaucitron:cfg_titre_result_recherche_services:></legend>
<div id="tac_results"></div>
</fieldset>
</div>
</div>
<script>
var tac_url = '?exec=tac_liste_services',
oldValue = ''
services = {};
$('#formulaire_#FORM').animateLoading();
$.ajax({
url: tac_url,
dataType: 'json',
success: (data) => {
services = data
},
complete: () => {
$('#formulaire_#FORM').endLoading(true)
}
});
// Appliquer un délai à l'exécution d'une fonction
function delay(fn, ms) {
let timer = 0
return function(...args) {
clearTimeout(timer)
timer = setTimeout(fn.bind(this, ...args), ms || 0)
}
}
// Fonction de recherche
function rechService(search) {
if (!search) {
$('#tac_results').html('')
return false
}
var html = '<ul class="liste-items">'
jQuery.each(services, function(service, prop) {
var status = ''
var properties = Object.entries(prop)
jQuery.each(properties, function(i,property){
if (property[0]=='statut') {
status = property[1]
}
})
if (service.toLowerCase().indexOf(search) >= 0) {
var btn_texte = (status=='desinstalle') ? '<:tarteaucitron:cfg_installer:>' : '<:tarteaucitron:cfg_desinstaller:>'
var action = (status=='desinstalle') ? 'tac_installer_service' : 'tac_desinstaller_service'
html += '<li class="item">' + service + '<a href="?action=' + action + '&service=' + service + '&redirect=?exec=configurer_services" class="btn">' + btn_texte + '</a></li>'
}
});
html += '</ul>'
$('#tac_results').html(html)
}
// On actualise les résultats de recherche à chaque modification
$('#champ_searchService').keyup(delay((e) => {
if (e.target.value == oldValue) {
e.preventDefault()
return false
}
oldValue = e.target.value
rechService(e.target.value)
}, 250));
</script>

@ -11,15 +11,7 @@
<legend><:tarteaucitron:legend_cookie:></legend>
<p class="explication"><:tarteaucitron:cfg_btn_showIcon_explication:></p>
<div class="editer-groupe">
[(#SAISIE{selection, ouverture, option_intro=<:tarteaucitron:cfg_aucun:>, label=<:tarteaucitron:cfg_ouverture_type:>, defaut='', data=[(#ARRAY{image,<:tarteaucitron:cfg_image:>,alertSmall,<:tarteaucitron:cfg_small_alert:>})]})]
[(#CONFIG{tarteaucitron/ouverture}|=={'image'}|?{' ',''})
[(#SAISIE{selection, iconPosition, option_intro=<:tarteaucitron:cfg_choose_option:>, label=<:tarteaucitron:cfg_iconposition:>, defaut=BottomRight, data=[(#ARRAY{BottomRight, <:tarteaucitron:cfg_position_bd:>, BottomLeft, <:tarteaucitron:cfg_position_bg:>, TopRight, <:tarteaucitron:cfg_position_hd:>, TopLeft, <:tarteaucitron:cfg_position_hg:>})]})]
]
[(#CONFIG{tarteaucitron/ouverture}|=={'alertSmall'}|?{' ',''})
[(#SAISIE{checkbox, cookieslist, label=<:tarteaucitron:cfg_cookieslist:>, explication=<:tarteaucitron:cfg_cookieslist_explication:>, data=[(#ARRAY{true,<:item_oui:>})]})]
]
#GENERER_SAISIES{#ENV{_saisies}}
</div>
</fieldset>

@ -0,0 +1,64 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Un simple formulaire de config,
* on a juste à déclarer les saisies
**/
function formulaires_configurer_tarteaucitron_ouverture_saisies_dist(){
// $saisies est un tableau décrivant les saisies à afficher dans le formulaire de configuration
$saisies = array(
array(
'saisie' => 'selection',
'options' => array(
'nom' => 'ouverture',
'option_intro' => '<:tarteaucitron:cfg_aucun:>',
'label' => '<:tarteaucitron:cfg_ouverture_type:>',
'defaut' => '',
'data' => array(
'image' => '<:tarteaucitron:cfg_image:>',
'alertSmall' => '<:tarteaucitron:cfg_small_alert:>'
)
)
),
array(
'saisie' => 'selection',
'options' => array(
'nom' => 'iconPosition',
'option_intro' => '<:tarteaucitron:cfg_choose_option:>',
'label' => '<:tarteaucitron:cfg_iconposition:>',
'defaut' => 'BottomRight',
'data' => array(
'BottomRight' => '<:tarteaucitron:cfg_position_bd:>',
'BottomLeft' => '<:tarteaucitron:cfg_position_bg:>',
'TopRight' => '<:tarteaucitron:cfg_position_hd:>',
'TopLeft' => '<:tarteaucitron:cfg_position_hg:>'
),
'afficher_si' => '@ouverture@ == "image"'
)
),
array(
'saisie' => 'selecteur_document',
'options' => array(
'nom' => 'icon',
'label' => '<:tarteaucitron:cfg_icon:>',
'media' => 'image',
'afficher_si' => '@ouverture@ == "image"'
)
),
array(
'saisie' => 'checkbox',
'options' => array(
'nom' => 'cookieslist',
'label' => '<:tarteaucitron:cfg_cookieslist:>',
'explication' => '<:tarteaucitron:cfg_cookieslist_explication:>',
'data' => array(
'true' => '<:item_oui:>'
),
'afficher_si' => '@ouverture@ == "alertSmall"'
)
)
);
return $saisies;
}

@ -10,13 +10,7 @@
<fieldset>
<legend><:tarteaucitron:legend_cookies_management_panel:></legend>
<div class="editer-groupe">
[(#SAISIE{textarea, lang_disclaimer, label=<:tarteaucitron:cfg_text_disclaimer:>, explication=<:tarteaucitron:cfg_text_disclaimer_explication:>, rows=3})]
[(#SAISIE{checkbox, mandatory, label=<:tarteaucitron:cfg_mandatory:>, explication=<:tarteaucitron:cfg_mandatory_explication:>, data=[(#ARRAY{true,<:item_oui:>})]})]
[(#SAISIE{checkbox, moreInfoLink, label=<:tarteaucitron:cfg_moreinfolink:>, data=[(#ARRAY{true,<:item_oui:>})]})]
[(#CONFIG{tarteaucitron/moreInfoLink}|table_valeur{0}|?{' ',''})
[(#SAISIE{input, readmoreLink, label=<:tarteaucitron:cfg_readmoreLink:>, explication=<:tarteaucitron:cfg_readmoreLink_explication:>})]
]
[(#SAISIE{checkbox, removeCredit, label=<:tarteaucitron:cfg_remove_credit:>, explication=<:tarteaucitron:cfg_remove_credit_explication:>, attention=<:tarteaucitron:cfg_remove_credit_attention:>, data=[(#ARRAY{true,<:item_oui:>})]})]
#GENERER_SAISIES{#ENV{_saisies}}
</div>
</fieldset>

@ -0,0 +1,65 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Un simple formulaire de config,
* on a juste à déclarer les saisies
**/
function formulaires_configurer_tarteaucitron_panneau_saisies_dist(){
// $saisies est un tableau décrivant les saisies à afficher dans le formulaire de configuration
$saisies = array(
array(
'saisie' => 'textarea',
'options' => array(
'nom' => 'lang_disclaimer',
'label' => '<:tarteaucitron:cfg_text_disclaimer:>',
'explication' => '<:tarteaucitron:cfg_text_disclaimer_explication:>',
'rows' => 3
)
),
array(
'saisie' => 'checkbox',
'options' => array(
'nom' => 'mandatory',
'label' => '<:tarteaucitron:cfg_mandatory:>',
'explication' => '<:tarteaucitron:cfg_mandatory_explication:>',
'data' => array(
'true' => '<:item_oui:>'
)
)
),
array(
'saisie' => 'checkbox',
'options' => array(
'nom' => 'moreInfoLink',
'label' => '<:tarteaucitron:cfg_moreinfolink:>',
'data' => array(
'true' => '<:item_oui:>'
)
)
),
array(
'saisie' => 'input',
'options' => array(
'nom' => 'readmoreLink',
'label' => '<:tarteaucitron:cfg_readmorelink:>',
'explication' => '<:tarteaucitron:cfg_readmorelink_explication:>',
'afficher_si' => '@moreInfoLink@ == "true"'
)
),
array(
'saisie' => 'checkbox',
'options' => array(
'nom' => 'removeCredit',
'label' => '<:tarteaucitron:cfg_remove_credit:>',
'explication' => '<:tarteaucitron:cfg_remove_credit_explication:>',
'attention' => '<:tarteaucitron:cfg_remove_credit_attention:>',
'data' => array(
'true' => '<:item_oui:>'
)
)
)
);
return $saisies;
}

@ -1,37 +0,0 @@
<div class="formulaire_spip formulaire_configurer formulaire_#FORM">
[<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}}
<fieldset>
<legend>Services Google</legend>
[(#REM) Gtag : voir à ce propos
https://developers.google.com/analytics/devguides/collection/gtagjs/
et https://juliencoquet.com/en/2017/09/11/switch-google-analytics-global-site-tag/][
(#SAISIE{input, gtag, label=Google global site tag (gtag.js), explication=Replace GA_MEASUREMENT_ID with the ID of the Google Analytics property to which you want to send data, placeholder=GA_MEASUREMENT_ID})]
[(#SAISIE{input, gmap, label=Google Map API Key, explication=Enter your Google Map API Key, placeholder=API KEY})]
</fieldset>
<fieldset>
<legend>Services Facebook</legend>
[(#SAISIE{checkbox, fb, label=Boutons de Like et Partage Facebook, data=[(#ARRAY{fb,fb})]})]
[(#SAISIE{input, fb_pixel, label=Facebook Pixel, explication=Enter your FacebookPixel ID, placeholder=YOUR_ID})]
</fieldset>
<fieldset>
<legend>Twitter</legend>
[(#SAISIE{checkbox, twitter, label=Twitter, datas=[(#ARRAY{twitter,Twitter})]})]
[(#SAISIE{checkbox, twitterembed, label=Twitter (cards), datas=[(#ARRAY{twitterembed,Twitter (cards)})]})]
</fieldset>
<input type="hidden" name="_meta_casier" value="tarteaucitron/services" />
<p class="boutons"><span class="image_loading">&nbsp;</span><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
</div>
</form>
</div>

@ -0,0 +1,87 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
function formulaires_configurer_tarteaucitron_services_saisies_dist(){
include_spip('inc/tarteaucitron');
$saisies = [];
$types_installes = tarteaucitron_liste_types_installes();
foreach($types_installes as $type => $liste_services) {
$fieldset = array(
'saisie' => 'fieldset',
'options' => array(
'nom' => $type,
'label' => $type,
'pliable' => 'oui',
'plie' => 'oui'
)
);
foreach($liste_services as $service) {
$champ = array(
'saisie' => 'checkbox',
'options' => array(
'nom' => $service,
'datas' => array(
$service => $service
)
)
);
$fieldset['saisies'][] = $champ;
}
switch ($type) {
case 'ads':
$fieldset['saisies'][] = array(
'saisie' => 'input',
'options' => array(
'nom' => 'facebookpixelID',
'label' => 'Facebook Pixel ID',
'explication' => 'Enter your FacebookPixel ID',
'placeholder' => 'YOUR_ID',
'afficher_si' => '@facebookpixel@ == "facebookpixel"'
)
);
break;
case 'analytic':
$fieldset['saisies'][] = array(
'saisie' => 'input',
'options' => array(
'nom' => 'gtagUA',
'label' => 'Google global site tag (gtag.js)',
'explication' => 'Replace GA_MEASUREMENT_ID with the ID of the Google Analytics property to which you want to send data',
'placeholder' => 'GA_MEASUREMENT_ID',
'afficher_si' => '@gtag@ == "gtag"'
)
);
break;
case 'api':
$fieldset['saisies'][] = array(
'saisie' => 'input',
'options' => array(
'nom' => 'gmapkey',
'label' => 'Google Map API Key',
'explication' => 'Enter your Google Map API Key',
'placeholder' => 'API KEY',
'afficher_si' => '@googlemaps@ == "googlemaps"'
)
);
break;
}
$saisies[] = $fieldset;
}
$saisies[] = array(
'saisie' => 'hidden',
'options' => array(
'nom' => '_meta_casier',
'defaut' => 'tarteaucitron/services'
)
);
return $saisies;
}

@ -1,12 +1,10 @@
<div class="formulaire_spip formulaire_configurer formulaire_#FORM">
[<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}}
<fieldset>
<legend><:tarteaucitron:cfg_avance:></legend>
@ -15,7 +13,6 @@
[(#SAISIE{checkbox, adblocker, label=<:tarteaucitron:cfg_adblocker:>, data=[(#ARRAY{true,<:item_oui:>})]})]
[(#SAISIE{checkbox, useExternalCss, label=<:tarteaucitron:cfg_externalcss:>, explication=<:tarteaucitron:cfg_externalcss_explication:>, data=[(#ARRAY{true,<:item_oui:>})]})]
[(#SAISIE{input, cookieDomain, label=<:tarteaucitron:cfg_cookiedomain:>, explication=<:tarteaucitron:cfg_cookiedomain_explication:>, placeholder=.my-multisite-domaine.fr})]
</div>
</fieldset>
@ -23,4 +20,10 @@
<p class="boutons"><span class="image_loading">&nbsp;</span><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
</div>
</form>
</div>
<fieldset>
<legend><:tarteaucitron:cfg_nettoyer_iframes:></legend>
<p class="explication"><:tarteaucitron:cfg_nettoyer_iframes_explication:></p>
<div class="boutons"><a href="/spip.php?action=tac_nettoyer_iframes" class="btn"><:tarteaucitron:cfg_nettoyer_iframes_launch:></a></div>
</fieldset>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 B

@ -32,13 +32,73 @@ function tarteaucitron_actif() {
* @return boolean | string
*/
function tarteaucitron_liste_services_actifs($objet, $id_objet) {
function tarteaucitron_liste_services_actifs($objet, $id_objet, $page, $recherche, $resultat_page) {
$services_actifs = array_filter(lire_config('tarteaucitron/services', array()));
$ajouter_services = $objet = $id_objet = '';
$ajouter_services = '';
foreach ($services_actifs as $service => $value) {
$ajouter_services .= recuperer_fond('services/'.$service, array('objet' => $objet, 'id_objet' => $id_objet));
$ajouter_services .= recuperer_fond('services/'.$service,
array(
'objet' => $objet,
'id_objet' => $id_objet,
'page' => $page,
'recherche' => $recherche,
'resultat_page' => $resultat_page
)
);
}
return $ajouter_services;
}
/**
* Retourne la liste des services TarteAuCitron et leur statut (enabled,disabled)
*
* @return Array
*/
function tarteaucitron_liste_services() {
$services_installes = array_filter(lire_config('tarteaucitron/services_installes', array()));
$list_services = [];
if ($lines=file(find_in_path('lib/tarteaucitron/tarteaucitron.services.js'))){
$i=0;
foreach($lines as $line) {
if(preg_match('/^tarteaucitron\.services\.(\w+)/', $line, $matches)) {
$service = $matches[1];
$statut = in_array($service,$services_installes) ? 'installe' : 'desinstalle';
if (preg_match('/"type": "(\w+)",/', $lines[$i+2], $matches)) {
$type = $matches[1];
}
$list_services[$service] = array(
'type' => $type,
'statut' => $statut
);
}
$i++;
}
}
return $list_services;
}
/**
* Retourne la liste des types des services TarteAuCitron installés
*
* @return Array
*/
function tarteaucitron_liste_types_installes() {
$list_types = [];
$services = tarteaucitron_liste_services();
foreach($services as $service => $prop) {
if ($prop['statut']=='installe') {
$list_types[$prop['type']][] = $service;
}
}
return $list_types;
}

@ -13,6 +13,9 @@
/* Gestion de la petite icone Cookie */
"showIcon": [(#CONFIG{tarteaucitron/ouverture}|=={'image'}|?{true,false})], /* Show cookie Icon or not */
<BOUCLE_image(DOCUMENTS){tout}{id_document=#CONFIG{tarteaucitron/icon}}>
"iconSrc" : "#URL_DOCUMENT",
</BOUCLE_image>
"iconPosition": "#CONFIG{tarteaucitron/iconPosition, BottomRight}", /* BottomRight, BottomLeft, TopRight and TopLeft */
"adblocker": [(#CONFIG{tarteaucitron/adblocker}|table_valeur{0}|?{true,false})], /* Afficher un message si un adblocker est détecté */

@ -16,13 +16,20 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'cfg_btn_accetpall_explication' => 'Soll die Schaltfläche Alle akzeptieren angezeigt werden? Wenn nicht, wird die Schaltfläche Personalisieren angezeigt.', # MODIF
'cfg_btn_showicon' => 'Cookie anzeigen?',
'cfg_btn_showicon_explication' => 'Mit diesem Schalter können Websurfer die Cookie-Einstellungen jederzeit öffnen.',
'cfg_desinstaller' => 'Deinstallieren',
'cfg_exemple' => 'Beispiel',
'cfg_exemple_explication' => 'Erläuterung dieses Beispiels',
'cfg_iconposition' => 'Cookie setzen…', # MODIF
'cfg_installer' => 'installieren',
'cfg_placement_bandeau' => 'Banner vertikal ausrichten',
'cfg_readmorelink' => 'Link zur Seite mehr über Cookies erfahren.',
'cfg_readmorelink_explication' => 'Beispiel : spip.php ?article1, rgpd, etc.',
'cfg_titre_ajouter_services' => 'Liste der Cookie-Dienste',
'cfg_titre_activation_services' => 'Freischaltung von Diensten',
'cfg_titre_ajouter_services' => 'Installation von Diensten',
'cfg_titre_liste_services' => 'Liste der Cookie-Dienste',
'cfg_titre_recherche_services' => 'Forschen',
'cfg_titre_result_recherche_services' => 'Suchergebnisse',
'cfg_titre_placeholder_recherche_services' => 'Instagram, Spotify, etc.',
'cfg_titre_bandeau' => 'Verwaltung der akzeptierten Cookies', # MODIF
// L

@ -31,15 +31,22 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'cfg_cookiename' => 'Nom du cookie',
'cfg_cookieslist' => 'Afficher la liste des cookies installés ?',
'cfg_cookieslist_explication' => 'Permet au visiteur de visualiser facilement les cookies actifs.',
'cfg_desinstaller' => 'Désinstaller',
'cfg_exemple' => 'Exemple',
'cfg_exemple_explication' => 'Explication de cet exemple',
'cfg_externalcss' => 'Désactiver le CSS de TarteAuCitron',
'cfg_externalcss_explication' => 'Permet dutiliser des règles CSS personnalisées',
'cfg_icon' => 'Icône',
'cfg_iconposition' => 'Positionner le bouton',
'cfg_image' => 'Image',
'cfg_installer' => 'Installer',
'cfg_mandatory' => 'Afficher les cookies obligatoires',
'cfg_mandatory_explication' => 'Montre au visiteur que des cookies obligatoires non désactivables sont utilisés',
'cfg_moreinfolink' => 'Afficher le lien `En savoir plus`',
'cfg_nettoyer_iframes' => 'Traiter les anciens articles',
'cfg_nettoyer_iframes_explication' => 'Le plugin TarteAuCitron pour SPIP fournit un script qui vous permettra de remplacer les iframes de vos anciens articles par les modèles adéquats. Au besoin, adaptez-le.<br>
Quand vous lancez le script, celui-ci lance d\'abord une simulation. Si vous souhaitez que les modifications soient effectives, il faut ajouter <code>&modif=1</code> dans l\'url.',
'cfg_nettoyer_iframes_launch' => 'Lancer le script',
'cfg_ouverture_type' => 'Type de bouton',
'cfg_placement_bandeau' => 'Placement vertical du bandeau',
'cfg_position_bd' => 'En bas à droite',
@ -58,10 +65,18 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'cfg_text_disclaimer_explication' => 'Modifier le texte davertissement par défaut.<br>Note : ce champ accepte les Blocs multilingues',
'cfg_text_info' => 'Info',
'cfg_text_info_explication' => 'Modifier le texte dinfo par défaut.<br>Note : ce champ accepte les Blocs multilingues',
'cfg_titre_ajouter_services' => 'Liste des services',
'cfg_titre_activation_services' => 'Activation des services',
'cfg_titre_ajouter_services' => 'Installation des services',
'cfg_titre_liste_services' => 'Liste des services',
'cfg_titre_recherche_services' => 'Rechercher',
'cfg_titre_result_recherche_services' => 'Résultats de recherche',
'cfg_titre_placeholder_recherche_services' => 'Instagram, Spotify, etc.',
'cfg_titre_bandeau' => 'Affichage',
'cfg_titre_technique' => 'Technique',
// I
'id_contenu' => 'Insérer l\'id de votre contenu :',
// L
'legend_bandeau_principal' => 'Le bandeau principal',
'legend_cookie' => 'Ouverture du panneau',

@ -0,0 +1,3 @@
[<div class="canalu_player"
videoTitle="(#ENV{id})">
</div><br>]

@ -0,0 +1,8 @@
[<div class="dailymotion_player"
videoID="(#ENV{id})"
width="[(#ENV{width,720})]"
height="[(#ENV{height,405})]"
showinfo="showinfo [(#ENV{showinfo,1})]"
autoplay="autoplay [(#ENV{autoplay,0})]"
embedType="embedType [(#ENV{embedType,video})]">
</div><br>]

@ -0,0 +1,5 @@
[<div class="fb-video"
data-href="https://www.facebook.com/watch/?v=(#ENV{id})"
data-allowfullscreen="true"
data-width="[(#ENV{width,500})]">
</div><br>]

@ -0,0 +1,5 @@
[<div class="gagenda_embed"
width="[(#ENV{width,500})]"
height="[(#ENV{height,450})]"
data="src(#ENV{id})">
</div>]

@ -0,0 +1,5 @@
[<div class="vimeo_player"
videoID="(#ENV{id})"
width="[(#ENV{width,720})]"
height="[(#ENV{height,405})]">
</div><br>]

@ -0,0 +1,5 @@
[<div class="webtvnu_player"
videoID="(#ENV{id})"
width="[(#ENV{width,720})]"
height="[(#ENV{height,405})]">
</div><br>]

@ -0,0 +1,15 @@
[<div class="youtube_player"
style="margin:auto"
videoID="(#ENV{id})"
width="[(#ENV{width,720})]"
height="[(#ENV{height,405})]"
theme="theme [(#ENV{theme,dark})]"
rel="rel [(#ENV{rel,1})]"
controls="controls [(#ENV{controls,1})]"
showinfo="showinfo [(#ENV{showinfo,1})]"
autoplay="autoplay [(#ENV{autoplay,0})]"
mute="mute [(#ENV{mute,0})]"
srcdoc="srcdoc"
loop="loop [(#ENV{loop,0})]"
loading="loading [(#ENV{loading,1})]">
</div><br>]

@ -1,7 +1,7 @@
<paquet
prefix="tarteaucitron"
categorie="communication"
version="1.2.9"
version="1.3.0"
etat="stable"
compatibilite="[3.1.0;4.0.*]"
logo="prive/themes/spip/images/tarteaucitron-64.png"
@ -23,10 +23,12 @@
<pipeline nom="autoriser" inclure="tarteaucitron_autorisations.php" />
<pipeline nom="insert_head" inclure="tarteaucitron_pipelines.php" />
<pipeline nom="affichage_final" inclure="tarteaucitron_pipelines.php" />
<pipeline nom="porte_plume_barre_pre_charger" inclure="tarteaucitron_pipelines.php" />
<pipeline nom="porte_plume_lien_classe_vers_icone" inclure="tarteaucitron_pipelines.php" />
<menu nom="configurer_tarteaucitron" titre="tarteaucitron:tarteaucitron_titre" parent="menu_squelette" icone="images/tarteaucitron-16.png" action="configurer_affichage" />
<onglet nom="configurer_affichage" titre="tarteaucitron:cfg_titre_bandeau" icone="" parent="configurer_tarteaucitron" action="configurer_affichage" />
<onglet nom="configurer_services" titre="tarteaucitron:cfg_titre_ajouter_services" icone="" parent="configurer_tarteaucitron" action="configurer_services" />
<onglet nom="configurer_services" titre="tarteaucitron:cfg_titre_liste_services" icone="" parent="configurer_tarteaucitron" action="configurer_services" />
<onglet nom="configurer_technique" titre="tarteaucitron:cfg_titre_technique" icone="" parent="configurer_tarteaucitron" action="configurer_technique" />
</paquet>

@ -2,6 +2,9 @@
<h1 class="grostitre"><:tarteaucitron:titre_page_configurer_tarteaucitron:></h1>
[(#VAL{configurer_tarteaucitron}|barre_onglets{configurer_services})]
<h3><:tarteaucitron:cfg_titre_ajouter_services:></:tarteaucitron:cfg_titre_ajouter_services:></h3>
#FORMULAIRE_CONFIGURER_TARTEAUCITRON_AJOUTER_SERVICES
<h3><:tarteaucitron:cfg_titre_activation_services:></h3>
<div class="ajax">
#FORMULAIRE_CONFIGURER_TARTEAUCITRON_SERVICES
</div>
#FORMULAIRE_CONFIGURER_TARTEAUCITRON_SERVICES
</div>

@ -0,0 +1,25 @@
#CACHE{3600*100,cache-client}
#HTTP_HEADER{Content-Type: text/css; charset=utf-8}
#HTTP_HEADER{Vary: Accept-Encoding}
#formulaire_configurer_tarteaucitron_ajouter_services .image_loading {
float:none;
text-align: center;
}
#formulaire_configurer_tarteaucitron_ajouter_services ol.explication {
list-style-type: decimal;
padding-left: 1.5rem;
}
.formulaire_configurer_tarteaucitron_services .saisie_checkbox {
padding-left:1rem;
}
#tac_results li.item {
display: flex;
justify-content: space-between;
align-items: center;
padding-left: .5rem;
padding-right: .5rem;
}

@ -0,0 +1 @@
(tarteaucitron.job = tarteaucitron.job || []).push('canalu');

@ -0,0 +1 @@
(tarteaucitron.job = tarteaucitron.job || []).push('dailymotion');

@ -1,3 +1,3 @@
tarteaucitron.user.facebookpixelId = '#CONFIG{tarteaucitron/services/fb_pixel}';
tarteaucitron.user.facebookpixelId = '[(#CONFIG{tarteaucitron/services/facebookpixelID})]';
tarteaucitron.user.facebookpixelMore = function () { /* add here your optionnal facebook pixel function */ };
(tarteaucitron.job = tarteaucitron.job || []).push('facebookpixel');

@ -0,0 +1 @@
(tarteaucitron.job = tarteaucitron.job || []).push('gagenda');

@ -1,2 +1,2 @@
tarteaucitron.user.googlemapsKey = '#CONFIG{tarteaucitron/services/gmap}';
tarteaucitron.user.googlemapsKey = '#CONFIG{tarteaucitron/services/gmapkey}';
(tarteaucitron.job = tarteaucitron.job || []).push('googlemaps');

@ -1,3 +1,3 @@
tarteaucitron.user.gtagUa = '#CONFIG{tarteaucitron/services/gtag}';
tarteaucitron.user.gtagUa = '[(#CONFIG{tarteaucitron/services/gtagUA})]';
tarteaucitron.user.gtagMore = function () { /* add here your optionnal gtag() */ };
(tarteaucitron.job = tarteaucitron.job || []).push('gtag');

@ -0,0 +1 @@
(tarteaucitron.job = tarteaucitron.job || []).push('vimeo');

@ -0,0 +1 @@
(tarteaucitron.job = tarteaucitron.job || []).push('webtvnu');

@ -0,0 +1 @@
(tarteaucitron.job = tarteaucitron.job || []).push('youtube');

@ -32,7 +32,21 @@ function tarteaucitron_upgrade($nom_meta_base_version, $version_cible) {
'acceptallcta' => array('true'),
'showIcon' => array('true'),
'mandatory' => array('true'),
'moreInfoLink' => array('true')
'moreInfoLink' => array('true'),
'services_installes' => array(
'canalu',
'dailymotion',
'facebook',
'facebookpixel',
'gagenda',
'googlemaps',
'gtag',
'twitter',
'twitterembed',
'vimeo',
'webtvnu',
'youtube'
)
));
include_spip('base/upgrade');

@ -52,11 +52,9 @@ function tarteaucitron_affichage_final($html) {
$resultat_page = '0';
foreach($GLOBALS['contexte'] as $k => &$v) {
if (preg_match(',^id_(\w+)$,S', $k, $r)
AND ($id = intval($v))>0
) {
AND ($id = intval($v))>0) {
$objet = 'id_'.$r[1];
$id_objet = $id;
$page = '';
} elseif (in_array($k, array('type-page', 'page'))) {
$page = $v;
} elseif ($k === 'recherche') {
@ -74,4 +72,55 @@ function tarteaucitron_affichage_final($html) {
}
}
return $html;
}
function tarteaucitron_porte_plume_barre_pre_charger($barres){
$menu_items = array();
$services_actifs = array_filter(lire_config('tarteaucitron/services', array()));
foreach ($services_actifs as $service => $value) {
if ($modele=find_in_path('modeles/tac_' . $service . '.html')) {
if (file_exists($modele)){
$file = fopen($modele,"r");
$text = fgets($file);
if ($text!="Placez le code HTML"){
$menu_items[] = array(
"id" => $service,
"name" => $service,
"className" => 'tac_' . $service,
"openWith" => "<tac_" . $service . "|id=",
'closeWith' => '[![' . _T('tarteaucitron:id_contenu') . ']!]>',
"display" => true
);
}
}
}
}
if (count($menu_items) != 0) {
$new_button = array(
"id" => 'tac_drop',
"name" => 'TarteAuCitron',
"className" => 'tac_drop',
"replaceWith" => '',
"display" => true
);
$new_button["dropMenu"] = $menu_items;
$barre = &$barres['edition'];
$barre->ajouterApres('grpCaracteres', $new_button);
}
return $barres;
}
function tarteaucitron_porte_plume_lien_classe_vers_icone($flux){
$icons = array('tac_drop' => 'tac.png');
$services_actifs = array_filter(lire_config('tarteaucitron/services', array()));
foreach ($services_actifs as $service => $value) {
if (find_in_path('modeles/tac_' . $service . '.html')) {
$icons['tac_' . $service] = $service . '.png';
}
}
return array_merge($flux, $icons);
}
Loading…
Cancel
Save