File "pages_pipelines.php"
Full path: /home/argothem/www/organecyberpresse/plugins/auto/pages/v2.3.0/pages_pipelines.php
File size: 17.28 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* Déclaration des pipelines utilisés par le plugin
*
* @plugin Pages
* @copyright 2013
* @author RastaPopoulos
* @licence GNU/GPL
* @package SPIP\Pages\Pipelines
* @link https://contrib.spip.net/Pages-uniques
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// Change l'entête du formulaire des articles pour montrer que c'est une page
function pages_affiche_milieu_ajouter_page($flux) {
if ($flux['args']['exec'] == 'article_edit') {
include_spip('base/abstract_sql');
if (
_request('modele') == 'page'
or
(
isset($flux['args']['id_article'])
and ($id_article = $flux['args']['id_article']) > 0
and (sql_getfetsel('page', 'spip_articles', 'id_article='.intval($id_article)))
)
) {
//On force l'id parent à -1
//Par principe une page nouvelle ou existante est dans la rubrique parent -1
$cherche = "/(<input[^>]*name=('|\")id_parent[^>]*>)/is";
if (!preg_match($cherche, $flux['data'])) {
$cherche = "/(<input[^>]*name=('|\")id_rubrique[^>]*>)/is";
$remplace = "$1<input type=\"hidden\" name=\"id_parent\" value=\"-1\" />\n";
$flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
}
// On cherche et remplace l'entete de la page : "modifier la page"
$cherche = "/(<div[^>]*class=('|\")entete-formulaire.*<\/span>).*?(<h1>.*?<\/h1>.*?<\/div>)/is";
$surtitre = _T('pages:modifier_page');
$remplace = "$1$surtitre$3";
$flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
// Si c'est une nouvelle page, on remplace le lien de retour dans l'entete
if (_request('new') == 'oui') {
$cherche = "/(<span[^>]*class=(?:'|\")icone[^'\"]*retour[^'\"]*(?:'|\")>"
. "<a[^>]*href=(?:'|\"))[^'\"]*('|\")/is";
$retour = generer_url_ecrire('pages_tous');
$remplace = "$1$retour$2";
$flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
}
}
}
return $flux;
}
/**
* Saisie de l'identifiant de la page sur la fiche d'une page
*
* @param array $flux
* Le contexte du pipeline
* @return array $flux
* Le contexte du pipeline modifié
*/
function pages_affiche_milieu_identifiant($flux) {
include_spip('inc/autoriser');
$texte = '';
$e = trouver_objet_exec($flux['args']['exec']);
// Si on est sur la fiche d'un article...
if ($e and !$e['edition'] and $e['type']=='article') {
include_spip('base/abstract_sql');
$id_article = isset($flux['args'][$e['id_table_objet']]) ? $flux['args'][$e['id_table_objet']] : false;
// ... et s'il s'agit d'une page
if (
_request('modele') == 'page'
or
(
intval($id_article) > 0
and
(sql_getfetsel('page', 'spip_articles', 'id_article='.intval($id_article)))
)
and autoriser('modifier', 'page', $id_article)
) {
$texte .= recuperer_fond(
'prive/objets/editer/identifiant_page',
array('id_article' => $id_article),
array('ajax' => true)
);
}
}
if ($texte) {
if ($p=strpos($flux['data'], '<!--affiche_milieu-->')) {
$flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
} else {
$flux['data'] .= $texte;
}
}
return $flux;
}
// Vérifier que la page n'est pas vide
function pages_formulaire_charger($flux) {
// Si on est dans l'édition d'un article
if (is_array($flux) and is_array($flux['data']) and $flux['args']['form'] == 'editer_article') {
// Si on est dans un article de modele page
if (_request('modele') == 'page' or ($flux['data']['page'] and _request('modele') != 'article')) {
$flux['data']['modele'] = 'page';
$flux['data']['champ_page'] = $flux['data']['page'];
}
unset($flux['data']['page']);
}
return $flux;
}
/**
* Vérifications de l'identifiant d'une page
*
* L'identifiant doit être unique, sauf en cas de traduction
*
* @param array $flux
* Le contexte du pipeline
* @return array $flux
* Le contexte du pipeline modifié
*/
function pages_formulaire_verifier($flux) {
// Si on est dans l'édition d'un article/page ou dans le formulaire d'édition d'un identifiant page
if (
is_array($flux)
and (
( $flux['args']['form'] == 'editer_article' and _request('modele') == 'page' )
or $flux['args']['form'] == 'editer_identifiant_page'
)
) {
$erreur = '';
$page = _request('champ_page');
$page = strtolower($page);
$page = preg_replace(',\\s+,', '_', $page);
set_request('champ_page', $page);
$id_page = $flux['args']['args'][0];
// champ vide
$lang = sql_getfetsel('lang', 'spip_articles', 'id_article='.intval($id_page));
if (!$lang) {
$lang = $GLOBALS['spip_lang'];
}
if (!$page) {
$erreur .= _T('info_obligatoire');
} elseif (strlen($page) > 255) {
$erreur = _T('pages:erreur_champ_page_taille');
} elseif (!preg_match('/^[a-z0-9_]+$/', $page)) {
// format : charactères alphanumériques en minuscules ou "_"
$erreur = _T('pages:erreur_champ_page_format');
// doublon ?
} elseif (sql_countsel('spip_articles', array(
'page=' . sql_quote($page),
'id_article != ' . intval($id_page),
'lang = ' . sql_quote($lang),
'statut != ' .sql_quote("poubelle")))
) {
$erreur = _T('pages:erreur_champ_page_doublon');
}
if ($erreur) {
if (!isset($flux['data']['champ_page'])) {
$flux['data']['champ_page'] = '';
}
$flux['data']['champ_page'] .= $erreur;
}
}
return $flux;
}
/**
* Insertion dans le pipeline editer_contenu_objet (SPIP)
*
* Sur les articles considérés comme pages uniques, on remplace l'élément de choix de rubriques par :
* -* un input hidden id_rubrique et id_parent avec pour valeur -1
* -* un input hidden modele avec comme valeur "page"
* -* un champ d'édition de l'identifiant de la page unique
*
* @param array $flux
* Le contexte du pipeline
* @return array $flux
* Le contexte du pipeline modifié
*/
function pages_editer_contenu_objet($flux) {
$args = $flux['args'];
if ($args['type'] == 'article' && isset($args['contexte']['modele']) && $args['contexte']['modele'] == 'page') {
$erreurs = $args['contexte']['erreurs'];
// On cherche et remplace l'édition de la rubrique
$cherche = "/(<(li|div)[^>]*class=(?:'|\")editer editer_parent.*?<\/\\2>)\s*(<(li|div)[^>]*class=(?:'|\")editer)/is";
$remplace = '<\\2 class="editer editer_page obligatoire' . (empty($erreurs['champ_page']) ? '' : ' erreur') . '">';
$remplace .= '<input type="hidden" name="id_parent" value="-1" />';
$remplace .= '<input type="hidden" name="id_rubrique" value="-1" />';
$remplace .= '<input type="hidden" name="modele" value="page" />';
$remplace .= '<label for="id_page">'._T('pages:titre_page').'</label>';
if (!empty($erreurs['champ_page'])) {
$remplace .= '<span class="erreur_message">' . $erreurs['champ_page'] . '</span>';
}
if (!empty($args['contexte']['champ_page'])) {
$value = $args['contexte']['champ_page'];
} elseif (!empty($args['contexte']['page'])) {
$value = $args['contexte']['page'];
} else {
$value = '';
}
$remplace .= '<input type="text" class="text" name="champ_page" id="id_page" value="'.$value.'" />';
$remplace .= '</\\2> \\3';
if (preg_match($cherche, $flux['data'], $m)) {
$flux['data'] = preg_replace($cherche, $remplace, $flux['data'], 1);
// si on a polyhierarchie, on a un second editer_parents, supprimons en conservant bien l'ouverture du 'editer' suivant
$flux['data'] = preg_replace($cherche, '\\3', $flux['data']);
} else {
$cherche = "/(<(li|div)[^>]*class=(?:'|\")editer editer_soustitre.*?<\/\\2>)\s*(<(li|div)[^>]*class=(?:'|\")editer)/is";
if (preg_match($cherche, $flux['data'])) {
$flux['data'] = preg_replace($cherche,'$1'.$remplace, $flux['data']);
} else {
$cherche = "/(<(li|div)[^>]*class=(?:'|\")editer editer_titre.*?<\/\\2>)\s*(<(li|div)[^>]*class=(?:'|\")editer)/is";
$flux['data'] = preg_replace($cherche, '$1'.$remplace, $flux['data']);
}
}
}
return $flux;
}
/**
* Insertion dans le pipeline pre_edition (SPIP)
*
* Si on édite un article :
* - Si on récupère un champ "champ_page" dans les _request() et qu'il est différent de "article",
* on transforme l'article en page unique, id_rubrique devient -1
* - Si on ne récupère pas de champ_page et que id_parent est supérieur à 0, on le passe en article et on vide
* son champ page pour pouvoir réaliser le processus inverse dans le futur
*
* @param array $flux Le contexte du pipeline
* @return array $flux Le contexte modifié
*/
function pages_pre_edition_ajouter_page($flux) {
if (is_array($flux) and isset($flux['args']['type']) && $flux['args']['type'] == 'article') {
if ((($page = _request('champ_page')) != '') and ($page != 'article')) {
/**
* On ajoute le "champ_page" du formulaire qui deviendra "page" dans la table
* On force l'id_rubrique à -1
*/
$flux['data']['page'] = $page;
$flux['data']['id_rubrique'] = '-1';
$flux['data']['id_secteur'] = '0';
}
/**
* si l'id_parent est supérieur à 0 on que l'on ne récupère pas de champ_page,
* on pense à vider le champ "page", pour pouvoir revenir après coup en page
*/
if (!_request('champ_page') && (_request('id_parent') > 0)) {
$flux['data']['page'] = '';
}
}
return $flux;
}
/**
* Insertion dans le pipeline boite_infos (SPIP)
*
* Ajouter un lien pour transformer un article éditorial en page ou inversement
*
* @param array $flux
* Le contexte du pipeline
* @return array $flux
* Le contexte modifié
*/
function pages_boite_infos($flux) {
if ($flux['args']['type'] == 'article') {
include_spip('inc/presentation');
if (sql_getfetsel('page', 'spip_articles', 'id_article='. intval($flux['args']['id'])) == '') {
if (autoriser('creer', 'page', $flux['args']['id']) && autoriser('convertir', 'page', $flux['args']['id'])) {
$flux['data'] .= icone_horizontale(_T('pages:convertir_page'), parametre_url(parametre_url(generer_url_ecrire('article_edit'), 'id_article', $flux['args']['id']), 'modele', 'page'), 'page');
}
} else {
if (autoriser('modifier', 'page', $flux['args']['id']) && autoriser('convertir', 'page', $flux['args']['id'])) {
$flux['data'] .= icone_horizontale(_T('pages:convertir_article'), parametre_url(parametre_url(generer_url_ecrire('article_edit'), 'id_article', $flux['args']['id']), 'modele', 'article'), 'article');
}
}
}
return $flux;
}
/**
* Insertion dans le pipeline affiche_hierarchie (SPIP)
* Pour les pages, faire pointer la racine vers la liste des pages au lieux des rubriques
* Pour savoir si on se trouve sur une page, on vérifie que le champ "page" existe, faute de mieux
*
* @param array $flux
* Le contexte du pipeline
* @return array $flux
* Le contexte modifié
*/
function pages_affiche_hierarchie($flux) {
$objet = $flux['args']['objet'];
$id_article = $flux['args']['id_objet'];
if (
$objet == 'article'
and sql_getfetsel('page', 'spip_articles', 'id_article='.intval($id_article))
) {
$cherche = '<a href="'. generer_url_ecrire('rubriques') . '">' . _T('info_racine_site') . '</a>';
$remplace = '<a href="'. generer_url_ecrire('pages') . '">' . _T('pages:pages_uniques') . '</a>';
$flux['data'] = str_replace($cherche, $remplace, $flux['data']);
}
return $flux;
}
/**
* Insertion dans le pipeline pre_boucle (SPIP)
* Pour les listes d'articles purement éditoriaux, il faut exclure les pages uniques afin d'éviter la confusion des genres
* ainsi que les liens vers des pages parfois inaccessibles en fonction de l'autorisation de l'auteur.
*
* @param array $flux
* Le contexte du pipeline
* @return array $flux
* Le contexte modifié
*/
function pages_pre_boucle($boucle) {
// On ne s'intéresse qu'à la boucle ARTICLES
if ($boucle->type_requete == 'articles' and empty($boucle->modificateur['tout'])) {
// On n'insère le filtre {id_rubriques>0} pour exclure les pages uniques que si aucune des conditions
// suivantes n'est vérifiée:
// - pas de critère page autre que {page=''}
// - pas de critère explicite {id_rubrique=-1} ou {id_rubrique<0}
// - pas de critère {id_rubrique?} pour lequel l'environnement renvoie -1 pour l'id de la rubrique
// pas de critère {id_article=XX} ou {id_article} ou {id_article?}
$boucle_articles = true;
$critere_page = false;
// On cherche les critères id_rubrique, id_article ou page
foreach ($boucle->criteres as $_critere) {
if ($_critere->op == 'page' and !$_critere->not) { // {page} ou {page?} mais pas {!page}
// On considère qu'on cherche toujours des pages uniques donc on force le filtre id_rubrique=-1
$boucle_articles = false;
$critere_page = true;
break;
}
// Aucun filtre du tout quand on cherche des traductions
elseif ($_critere->op == 'traduction' or $_critere->op == 'origine_traduction') {
$boucle_articles = false;
break;
}
elseif (isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'page') { // {page=x}
if (
($_critere->op == '=')
and ($_critere->param[1][0]->texte == '')
and empty($_critere->param[1][1])
or $_critere->not
) {
// On veut exclure explicitement les pages
break;
} else {
// on désigne bien des pages par leur champ 'page'
$boucle_articles = false;
$critere_page = true;
break;
}
}
elseif (($_critere->op == 'id_article') // {id_article} ou {id_article?}
or (isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'id_article')) { // {id_article=x}
// On pointe sur un article précis, il est donc inutile de rajouter un test sur la rubrique
// Pour le critère {id_article?} on considère que pour sélectionner des pages uniques
// ou des articles éditoriaux on doit préciser le critère {id_rubrique}
$boucle_articles = false;
}
elseif (((isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'id_rubrique') // {id_rubrique=-1}
and ($_critere->op == '=')
and ($_critere->param[1][0]->texte == '-1'))
or ((isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'id_rubrique') // {id_rubrique<0}
and ($_critere->op == '<')
and ($_critere->param[1][0]->texte == '0'))) {
// On cherche explicitement des pages uniques
$boucle_articles = false;
break;
}
elseif (($_critere->op == 'id_rubrique')) {
// On connait pas à ce stade la valeur de id_rubrique qui est passé dans le env.
// Aussi, on créer une condition where qui se compile différemment suivant la valeur de l'id_rubrique.
// En fait, il suffit de tester si l'id_rubrique est null. Dans ce cas il faut bien rajouter id_rubrique>0
// pour éliminer les pages uniques.
$boucle_articles = false;
$env_id = "\$Pile[0]['id_rubrique']";
$boucle->where[] =
array("'?'", "(isset($env_id)?(is_array($env_id)?count($env_id):strlen($env_id)):'')", "''", "'articles.id_rubrique>0'");
break;
}
}
// Si on est en présence d'une boucle article purement éditoriale, on ajoute le filtre id_rubrique>0
if ($boucle_articles) {
$boucle->where[] = array("'>'", "'articles.id_rubrique'", "'\"0\"'");
}
// Si on est en présence d'un critère {page} quelconque, on force le filtre id_rubrique=-1
if ($critere_page) {
$boucle->where[] = array("'='", "'articles.id_rubrique'", "'\"-1\"'");
}
}
return $boucle;
}
/**
* On cherche s'il existe un squelette article-NOMDELAPAGE pour l'utiliser en priorité
*
* @param array $flux
* Le contexte du pipeline
* @return array $flux
* Le contexte modifié
*/
function pages_styliser($flux) {
$bloc_principal = '';
// Quand il y a Z, on cherche le bloc principal
if (defined('_DIR_PLUGIN_ZCORE')) {
if (!function_exists("z_blocs")) {
$styliser_par_z = charger_fonction('styliser_par_z', 'public');
}
$z_blocs = z_blocs(test_espace_prive());
$bloc_principal = reset($z_blocs) . '/';
}
// Si c'est un article de type page et qu'il existe un squelette du bon nom
if (
$flux['args']['fond'] == $bloc_principal . 'article'
and $contexte = (isset($flux['args']['contexte']) ? $flux['args']['contexte'] : $GLOBALS['contexte'])
and isset($contexte['id_article'])
and $id_article = intval($contexte['id_article'])
and $page = sql_getfetsel('page', 'spip_articles', 'id_article = ' . $id_article)
and $ext = $flux['args']['ext']
and $f = find_in_path($bloc_principal."article=$page.$ext")
) {
$flux['data'] = substr($f, 0, - strlen(".$ext"));
}
return $flux;
}
function pages_rechercher_liste_des_champs($liste) {
$page = array();
// On rajoute le champ page pour la table articles pour permettre de chercher sur ce champ
$liste['article']['page'] = 8;
// Et on crée une fausse table 'pages' pour que la page de recherche appelle le squelette
// prive/squelettes/contenu/pages.html
$page = $liste['article'];
$liste['page'] = $page;
return $liste;
}
/**
* Ajoute la liste des pages liées au mot-clé sur la page de l'espace privé `exec=mot&id_mot=`
*
* @pipeline recuperer_fond
*
* @param array $flux
*
* @return array
*/
function pages_recuperer_fond($flux) {
if (
$flux['args']['fond'] == 'prive/objets/liste/articles'
AND !empty($flux['args']['contexte']['exec'])
AND $exec = trouver_objet_exec($flux['args']['contexte']['exec']) // on est sur la page d'un objet éditorial
AND $exec['type'] == 'mot' // en l'occurrence un `mot`
AND $exec['edition'] === false // pas en édition
AND !empty($flux['args']['contexte']['id_mot']) // on est sur la page d'un mot
) {
$flux['data']['texte'] = $flux['data']['texte'].recuperer_fond('prive/objets/liste/pages',[
'id_mot' => $flux['args']['contexte']['id_mot'],
],['ajax'=>true]);
}
return $flux;
}