Browse Source

WIP: Ajout du dossier action + #Bouton_action dans le html

master
Mathieu 2 months ago
parent
commit
9cd611ff2c
  1. 344
      action/basculang.php
  2. 37
      formulaires/basculang.html
  3. 5
      formulaires/basculang.php

344
action/basculang.php

@ -0,0 +1,344 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function action_basculang(){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
include_fichiers_fonctions();
$res = array();
if (_request('basculang') == 'secteurs2multi') {
basculang_secteurs2multi();
$res['message_ok'] = _T('basculang:bascule_effectuee');
}
// verif la presence de tradrub
if (_request('basculang') == 'multi2secteurs' && defined('_DIR_PLUGIN_TRADRUB')) {
basculang_multi2secteurs();
$res['message_ok'] = _T('basculang:bascule_effectuee');
}
return $res;
}
function basculang_secteurs2multi()
{
include_spip('base/objets');
include_spip('inc/autoriser');
include_spip('action/editer_objet');
$languePrincipaleSite = lire_config('langue_site');
$idSecteurAutresLangues = array();
// 1) Lister les rubriques contenant au moins un article traduit étant de la langue principale du site
// (c'est les seules qu'on saura convertir automatiquement)
$select = array('DISTINCT rubriques.id_rubrique', 'rubriques.id_secteur');
$from = 'spip_articles as articles inner join spip_rubriques as rubriques on articles.id_rubrique = rubriques.id_rubrique';
$where = array('articles.id_trad > 0', "articles.lang = '$languePrincipaleSite'");
$groupby = '';
$orderby = 'profondeur DESC';
$ListeRubriquesLanguePrincipaleAvecArticleTraduits = sql_allfetsel($select, $from, $where, $groupby, $orderby);
// 2) Parcourir la liste des rubriques trouvées à la recherche des articles traduits dans d'autres langues
foreach ($ListeRubriquesLanguePrincipaleAvecArticleTraduits as $RubriqueLanguePrincipaleAvecArticleTraduits) {
// Stocker pour tout à l'heure l'id du secteur
$idSecteurLanguePrincipale = $RubriqueLanguePrincipaleAvecArticleTraduits['id_secteur'];
// Trouver les articles contenus dans la rubrique et traduits dans d'autres langues
$select = array('id_article', 'id_rubrique', 'id_trad', 'lang');
$from = 'spip_articles';
$where = array('id_rubrique = ' . $RubriqueLanguePrincipaleAvecArticleTraduits['id_rubrique'], 'id_trad > 0');
$ListeArticlesTraduits = sql_allfetsel($select, $from, $where);
// 3) Parcourir la liste des articles de la rubrique
foreach ($ListeArticlesTraduits as $ArticleTraduit) {
// Trouver les traductions de l'article
$select = array('id_rubrique', 'id_article', 'id_secteur');
$from = 'spip_articles';
$where = array('id_article != ' . $ArticleTraduit['id_article'], 'id_trad = ' . $ArticleTraduit['id_trad'], "lang != '$languePrincipaleSite'");
$ListeArticlesTraductions = sql_allfetsel($select, $from, $where);
// Chercher le titre et la langue de la rubrique où se trouve l'article traduit
$select = array('id_rubrique', 'titre', 'lang');
$from = 'spip_rubriques';
$where = array('id_rubrique = ' . $ArticleTraduit['id_rubrique']);
$rubriqueLanguePrincipale = sql_fetsel($select, $from, $where);
// 4) Pour chacune des traductions
foreach ($ListeArticlesTraductions as $ArticleTraduction) {
$idSecteurAutresLangues = array_merge(array($ArticleTraduction['id_secteur']), $idSecteurAutresLangues);
// a) Changer le titre de la rubrique de la langue principale
// pour lui rajouter en <multi> le titre de la langue où se trouve l'article trouvé
// Chercher le titre et la langue de la rubrique où se trouve l'article traduit
$select = array('id_rubrique', 'titre', 'lang');
$from = 'spip_rubriques';
$where = array('id_rubrique = ' . $ArticleTraduction['id_rubrique']);
$rubriquePasLanguePrincipale = sql_fetsel($select, $from, $where);
// Changement du titre de la rubrique en multi si jamais fait
$titreLanguePrincipale = $rubriqueLanguePrincipale['titre'];
$titrePasLanguePrincipale = $rubriquePasLanguePrincipale['titre'];
$langPasLanguePrincipale = $rubriquePasLanguePrincipale['lang'];
$titremulti = $titreLanguePrincipale;
// Si le titre de la rubrique de la langue principale n'est pas déjà en <multi>
// ==> le passer en <multi>
if (strpos($titreLanguePrincipale, '<multi>') === false) {
$titremulti = '<multi>[' . $languePrincipaleSite . ']' . $titreLanguePrincipale . '</multi>';
}
// Si le multi de la langue de la rubrique de l'article trouvé ne se trouve pas déjà là
// ==> le rajouter
if (strpos($titremulti, "[$langPasLanguePrincipale]") === false) {
$replace = "[$langPasLanguePrincipale]$titrePasLanguePrincipale";
$titremulti = substr_replace($titremulti, $replace, -strlen('</multi>'), 0);
}
// Si changement, il faut modifier le titre de la rubrique
if ($titreLanguePrincipale != $titremulti) {
$objet = 'rubrique';
$id_objet = $rubriqueLanguePrincipale['id_rubrique'];
$set = array('titre' => $titremulti);
objet_modifier($objet, $id_objet, $set);
}
// b) Déplacer l'article dans la rubrique correspondante de la langue principale
$objet = 'article';
$id_objet = $ArticleTraduction['id_article'];
$set = array('id_parent' => $rubriqueLanguePrincipale['id_rubrique']);
objet_modifier($objet, $id_objet, $set);
// c) Tant qu'on y est, déplacer aussi tous les sites référencés de cette rubrique
// dans la rubrique correspondante de la langue principale
$select = array('id_syndic');
$from = 'spip_syndic';
$where = array('id_rubrique=' . $rubriquePasLanguePrincipale['id_rubrique']);
$ListeSitesPasLanguePrincipale = sql_allfetsel($select, $from, $where);
foreach ($ListeSitesPasLanguePrincipale as $SitePasLanguePrincipale) {
$set = array('id_parent' => $rubriqueLanguePrincipale['id_rubrique']);
objet_modifier('syndic', $SitePasLanguePrincipale['id_syndic'], $set);
}
// Supprimer la sous-rubriques si vide
$select = array('id_rubrique');
$from = 'spip_rubriques';
$where = array("statut = 'prepa'", 'id_rubrique=' . $rubriquePasLanguePrincipale['id_rubrique']);
$RubriqueEstElleVide = sql_fetsel($select, $from, $where);
if (isset($RubriqueEstElleVide['id_rubrique'])) {
$supprimer_rubrique = charger_fonction('supprimer_rubrique', 'action');
$supprimer_rubrique($RubriqueEstElleVide['id_rubrique']);
}
}
}
}
$idSecteurLangues = array_merge(array($ArticleTraduction['id_secteur']), array($idSecteurLanguePrincipale));
// Déplacer les sous rubriques des secteurs de langue à la racine
$select = array('id_rubrique');
$from = 'spip_rubriques';
$where = array(sql_in('id_secteur', $idSecteurLangues), "profondeur = 1");
$ListeSousRubriquesSecteurLanguePrincipale = sql_allfetsel($select, $from, $where);
foreach ($ListeSousRubriquesSecteurLanguePrincipale as $SousRubriqueSecteurLanguePrincipale) {
$objet = 'rubrique';
$id_objet = $SousRubriqueSecteurLanguePrincipale['id_rubrique'];
$set = array('id_parent' => 0);
objet_modifier($objet, $id_objet, $set);
}
// Supprimer les rubrique racines des secteurs de langue si elle sont vides
$select = array('id_rubrique');
$from = 'spip_rubriques';
$where = array(sql_in('id_secteur', $idSecteurLangues), "statut = 'prepa'");
$SecteursLangues = sql_allfetsel($select, $from, $where);
foreach ($SecteursLangues as $SecteurLangue) {
$supprimer_rubrique = charger_fonction('supprimer_rubrique', 'action');
$supprimer_rubrique($SecteurLangue['id_rubrique']);
}
// Changer la configuration du multilinguisme
ecrire_meta('multi_secteurs', 'non');
// Ne plus pouvoir choisir la langue des rubriques
ecrire_meta('multi_objets', implode(',', array_diff(explode(',', lire_config('multi_objets')), array('spip_rubriques'))));
// Mais pouvoir choisir la langue des articles
ecrire_meta('multi_objets', implode(',', array_merge(explode(',', lire_config('multi_objets')), array('spip_articles'))));
// Ajouter les articles aux liens de traduction
ecrire_meta('gerer_trad_objets', implode(',', array_merge(explode(',', lire_config('gerer_trad_objets')), array('spip_articles'))));
}
function basculang_multi2secteurs()
{
include_spip('base/objets');
include_spip('inc/autoriser');
include_spip('action/editer_objet');
$languePrincipaleSite = lire_config('langue_site');
$languePrincipaleSiteMaj = strtoupper($languePrincipaleSite);
// Lister les langues actives avec traduction (avec la langue principale en premier)
$select = array('DISTINCT lang');
$from = 'spip_articles';
$where = array('id_trad > 0');
$ListeDesLangActive = sql_allfetsel($select, $from, $where);
// Mettre la langue principale du site en premier
$ListeDesLangActive = array_unique (array_merge (array(array('lang' => $languePrincipaleSite)), $ListeDesLangActive), SORT_REGULAR);
// Étape 1 : Création des secteurs de langues
foreach ($ListeDesLangActive as $LangActive) {
// Est-ce que la rubrique existe déjà (ceinture et bretelles) ?
$select = array('id_rubrique', 'lang');
$from = 'spip_rubriques';
$where = array("titre = '" . strtoupper($LangActive['lang']) . "'", "id_parent = 0");
$RubriqueExistante = sql_fetsel($select, $from, $where);
if (!isset($RubriqueExistante)) {
$objet = 'rubrique';
$id_parent = 0;
$id_rubrique = objet_inserer($objet, $id_parent);
$objet = 'rubrique';
$id_objet = $id_rubrique;
$id_trad_reference = $id_rubrique;
// Gérer les liens de traduction entre rubriques
if ($LangActive['lang'] === $languePrincipaleSite) {
$set = array(
'titre' => strtoupper($LangActive['lang']),
'lang' => $LangActive['lang'],
'id_trad' => $id_rubrique,
'langue_choise' => 'oui'
);
} else {
$set = array(
'titre' => strtoupper($LangActive['lang']),
'lang' => $LangActive['lang'],
'id_trad' => $id_trad_reference,
'langue_choise' => 'oui'
);
}
objet_modifier($objet, $id_objet, $set);
} else {
if ($RubriqueExistante['lang'] === $languePrincipaleSite) {
$id_trad_reference = $RubriqueExistante['id_rubrique'];
}
}
}
// Étape 2 : Lister les rubriques à la racine avec titre multi pour les déplacer dans la langue principale ($id_trad_reference)
$select = array('id_rubrique', 'titre', 'lang');
$from = 'spip_rubriques';
$where = array("titre LIKE '<multi>%'", "id_parent = 0");
$ListerubriqueMulti = sql_allfetsel($select, $from, $where);
foreach ($ListerubriqueMulti as $rubriqueMulti) {
// Déplacer les rubrique Multi à l'interieur de la rubrique en langue principal du site.
$objet = 'rubrique';
$id_objet = $rubriqueMulti['id_rubrique'];
$set = array('id_parent' => $id_trad_reference);
objet_modifier($objet, $id_objet, $set);
}
// Étape 3 : éclater le contenu du secteur principal sur les autres langues
// On va utiliser une fonction récursive pour parcourir l'arborescence de la langue principale
basculang_EclaterContenuSecteurs($id_trad_reference);
// Final Changer la config en par secteur de langue
// Activer le menu de langue sur les secteurs seulement
ecrire_meta('multi_secteurs', 'oui');
// Ne plus pouvoir choisir la langue des articles
ecrire_meta('multi_objets', implode(',', array_diff(explode(',', lire_config('multi_objets')), array('spip_articles'))));
// Mais pouvoir choisir la langue des secteurs
ecrire_meta('multi_objets', implode(',', array_merge(explode(',', lire_config('multi_objets')), array('spip_rubriques'))));
// Ajouter les rubriques aux liens de traduction
ecrire_meta('gerer_trad_objets', implode(',', array_merge(explode(',', lire_config('gerer_trad_objets')), array('spip_rubriques'))));
// Ajouter les articles aux liens de traduction
ecrire_meta('gerer_trad_objets', implode(',', array_merge(explode(',', lire_config('gerer_trad_objets')), array('spip_articles'))));
}
function basculang_EclaterContenuSecteurs(int $id_parent) {
$languePrincipaleSite = lire_config('langue_site');
// Liste les articles de la rubrique qui sont une traduction dans une langue étrangère à la langue principale
$select = array('id_article', 'lang', 'id_rubrique');
$from = 'spip_articles';
$where = array("id_rubrique = $id_parent", "lang !='$languePrincipaleSite'");
$ListeArticlesTraduits = sql_allfetsel($select, $from, $where);
foreach ($ListeArticlesTraduits as $ArticleTraduit) {
// Chercher la rubrique de destination
$select = array('id_rubrique');
$from = 'spip_rubriques';
$where = array("lang = '" . $ArticleTraduit['lang']. "'", "id_trad = " . $ArticleTraduit['id_rubrique']);
$RubriqueDestination = sql_fetsel($select, $from, $where);
// Elle n'existe pas, il faut la créer
if (!isset($RubriqueDestination['id_rubrique'])) {
// a) Chercher le titre de la rubrique mère de l'article
// et l'id de la rubrique parente de la rubrique mère
$select = array('id_rubrique', 'titre', 'id_parent');
$from = 'spip_rubriques';
$where = array("id_rubrique = " . $ArticleTraduit['id_rubrique']);
$RubriqueMere = sql_fetsel($select, $from, $where);
// b) Chercher l'id de la rubrique traduite dans laquelle on va créer la nouvelle rubrique
$select = array('id_rubrique');
$from = 'spip_rubriques';
$where = array("id_trad = " . $RubriqueMere['id_parent'], "lang = '" . $ArticleTraduit['lang']. "'");
$RubriqueDestinationMere = sql_fetsel($select, $from, $where);
// c) Créer la rubrique
$objet = 'rubrique';
$id_parent_destination = $RubriqueDestinationMere['id_rubrique'];
$Id_RubriqueDestination = objet_inserer($objet, $id_parent_destination);
$objet = 'rubrique';
$id_objet = $Id_RubriqueDestination;
$set = array(
'titre' => extraire_multi($RubriqueMere['titre'], $ArticleTraduit['lang']),
'lang' => $ArticleTraduit['lang'],
'id_trad' => $ArticleTraduit['id_rubrique'],
'langue_choise' => 'oui'
);
objet_modifier($objet, $id_objet, $set);
} else {
$Id_RubriqueDestination = $RubriqueDestination['id_rubrique'];
}
// Déplacer l'article dans la rubrique de sa langue
$objet = 'article';
$id_objet = $ArticleTraduit['id_article'];
$set = array('id_parent' => $Id_RubriqueDestination);
objet_modifier($objet, $id_objet, $set);
}
// Lister les sous-rubriques de la rubrique en cours
$select = array('id_rubrique');
$from = 'spip_rubriques';
$where = array("id_parent = $id_parent");
$ListeSousRubriques = sql_allfetsel($select, $from, $where);
foreach ($ListeSousRubriques as $SousRubrique) {
basculang_EclaterContenuSecteurs($SousRubrique['id_rubrique']);
}
}

37
formulaires/basculang.html

@ -1,20 +1,19 @@
<div class='ajax'>
<div class="formulaire_spip formulaire_basculang">
[<p class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV*{message_erreur})</p>]
<form action='#ENV{action}' method='post'>
#ACTION_FORMULAIRE{#ENV{action}}
<div>
<p class="explication"><:basculang:explication_basculang:></p>
<p><:basculang:modele_multilinguisme{modele=#ENV{model}}:></p>
[<span class='erreur'>(#ENV**{erreurs}|table_valeur{model})</span>]
<input type="hidden" value='#ENV{basculang}' name='basculang' />
<div>
<p class='boutons'><span class='image_loading'>&nbsp;</span>
<input type='submit' class='btn submit' value='#ENV{changement}' />
</p>
</div>
<div class="formulaire_spip formulaire_basculang">
[<p class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV*{message_erreur})</p>]
<form action='#ENV{action}' method='post'>
#ACTION_FORMULAIRE
{#ENV{action}}
<div>
<p class="explication"><:basculang:explication_basculang:></p>
<p><:basculang:modele_multilinguisme{modele=#ENV{model}}:></p>
[<span class='erreur'>(#ENV**{erreurs}|table_valeur{model})</span>]
<input type="hidden" value='#ENV{basculang}' name='basculang' />
<div>
<p class='boutons'><span class='image_loading'>&nbsp;</span>
#BOUTON_ACTION{#ENV{changement},#URL_ACTION_AUTEUR{basculang,"",?exec=basculang}, btn submit ,Effectuer la Bascule?}
</p>
</div>
</div>
</form>
</div>
</form>
</div>
</div>

5
formulaires/basculang.php

@ -40,6 +40,7 @@ function formulaires_basculang_traiter_dist()
if (_request('basculang') == 'multi2secteurs' && defined('_DIR_PLUGIN_TRADRUB')) {
basculang_multi2secteurs();
$res['message_ok'] = _T('basculang:bascule_effectuee');
echo'zzz';
}
return $res;
}
@ -235,7 +236,7 @@ function basculang_multi2secteurs()
$objet = 'rubrique';
$id_objet = $id_rubrique;
$id_trad_reference = $id_rubrique;
$id_trad_reference =array();
// Gérer les liens de traduction entre rubriques
if ($LangActive['lang'] === $languePrincipaleSite) {
$set = array(
@ -244,7 +245,7 @@ function basculang_multi2secteurs()
'id_trad' => $id_rubrique,
'langue_choise' => 'oui'
);
$id_trad_reference = $id_rubrique;
} else {
$set = array(
'titre' => strtoupper($LangActive['lang']),

Loading…
Cancel
Save