You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

266 lines
7.2 KiB

<?php
/**
* Gestion du formulaire de migration d'articles en albums
*
* @plugin Albums
* @copyright 2014
* @author Tetue, Charles Razack
* @licence GNU/GPL
* @package SPIP\Albums\Formulaires
*/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Chargement du formulaire de migration d'articles en albums
*
* Déclarer les champs postés et y intégrer les valeurs par défaut
*
* @return array
* Environnement du formulaire
*/
function formulaires_migrer_albums_charger_dist() {
$valeurs = [
'id_parent' => '',
'toute_la_branche' => '',
'groupes_mots' => [],
'refuser_articles' => '',
'lier_rubriques' => '',
];
return $valeurs;
}
/**
* Vérifications du formulaire de migration d'articles en albums
*
* Vérifier les champs postés et signaler d'éventuelles erreurs
*
* @return array
* Tableau des erreurs
*/
function formulaires_migrer_albums_verifier_dist() {
$erreurs = [];
$oblis = ['id_parent'];
foreach ($oblis as $obli) {
if (!_request($obli)) {
$erreurs[$obli] = _T('info_obligatoire');
}
}
if (
!isset($erreurs['groupes_mots'])
and $groupes = _request('groupes_mots')
) {
if (!is_array($groupes)) {
$erreurs['groupes_mots'] = _T('migreralbums:erreur_choix_incorrect');
} else {
$groupes = array_map('intval', $groupes);
if (sql_countsel('spip_groupes_mots', sql_in('id_groupe', $groupes)) != count($groupes)) {
$erreurs['groupes_mots'] = _T('migreralbums:erreur_choix_incorrect');
}
}
}
// pas d'erreurs ? verifier ce qui va etre fait et l'annoncer
if (!count($erreurs) and !_request('confirm')) {
$where = migrer_albums_where_articles(_request('id_parent'), _request('toute_la_branche'));
$nba = sql_countsel('spip_articles', $where);
$erreurs['nb'] = $nba;
$message = sinon(singulier_ou_pluriel($nba, 'info_1_article', 'info_nb_articles'), _T('info_aucun_article'));
$message .= ' ' . _T('migreralbums:info_migration_articles');
$erreurs['message_erreur'] = '';
$erreurs['confirmer'] = $message;
}
return $erreurs;
}
/**
* Traitement du formulaire de migration d'articles en albums
*
* Traiter les champs postés
*
* @return array
* Retours des traitements
*/
function formulaires_migrer_albums_traiter_dist() {
$id_rubrique = _request('id_parent');
$where_articles = migrer_albums_where_articles($id_rubrique, _request('toute_la_branche'));
$refuser = (_request('refuser_articles') ? true : false);
$lier_rubriques = (_request('lier_rubriques') ? true : false);
$groupes = _request('groupes_mots');
if (!$groupes) {
$groupes = [];
}
$where_mots = migrer_albums_where_mots($groupes);
// et migrer les articles
$nb = albums_migrer_articles($where_articles, $where_mots, $refuser, $lier_rubriques);
$message = sinon(singulier_ou_pluriel($nb, 'info_1_article', 'info_nb_articles'), _T('info_aucun_article'));
$message .= ' ' . _T('migreralbums:info_migration_articles_reussi');
return ['message_ok' => $message];
}
/**
* Fonction privée
*
* @return int nombre d'articles migrés
*/
function albums_migrer_articles($where_articles, $where_mots, $refuser, $lier_rubriques) {
$id_album = null;
include_spip('action/editer_objet');
include_spip('action/editer_liens');
$where_mots = implode(' AND ', $where_mots);
$nb = 0;
$res = sql_select('*', 'spip_articles', $where_articles);
while ($row = sql_fetch($res)) {
// y a-t-il deja un album associe ?
$liens = objet_trouver_liens(['album' => '*'], ['article' => $row['id_article']]);
if (
!(is_countable($liens) ? count($liens) : 0)
and $id_album = objet_inserer('album')
) {
// associer tout de suite à l'article
objet_associer(['album' => $id_album], ['article' => $row['id_article']]);
// et peut-être en plus à la rubrique
if ($lier_rubriques) {
objet_associer(['album' => $id_album], ['rubrique' => $row['id_rubrique']]);
}
// réassocier les bons auteurs
if ($liens_auteurs = objet_trouver_liens(['auteur' => '*'], ['article' => $row['id_article']])) {
$auteurs = [];
foreach ($liens_auteurs as $lien) {
$auteurs[] = $lien['id_auteur'];
}
objet_dissocier(['auteur' => '*'], ['album' => $id_album]);
objet_associer(['auteur' => $auteurs], ['album' => $id_album]);
}
// titrer et decrire
$descriptif = [];
if (strlen($row['chapo'])) {
$descriptif[] = $row['chapo'];
}
if (strlen($row['texte'])) {
$descriptif[] = $row['texte'];
}
if (strlen($row['ps'])) {
$descriptif[] = $row['ps'];
}
$descriptif = implode("\n\n", $descriptif);
$set = [
'titre' => $row['titre'],
'descriptif' => $descriptif,
];
objet_modifier('album', $id_album, $set);
// ajouter les documents : en sql pour ne pas exploser si plein de docs en base
$docs = sql_allfetsel(
'D.id_document',
'spip_documents AS D JOIN spip_documents_liens AS L
ON (D.id_document=L.id_document AND L.objet="article")',
'id_objet=' . intval($row['id_article'])
);
if (is_countable($docs) ? count($docs) : 0) {
$insert = [];
foreach ($docs as $doc) {
$insert[] = ['id_document' => $doc['id_document'], 'objet' => 'album','id_objet' => $id_album];
}
sql_insertq_multi('spip_documents_liens', $insert);
}
// associer les mots : en sql pour ne pas exploser si plein de mots en base
$mots = sql_allfetsel(
'M.id_mot',
'spip_mots AS M JOIN spip_mots_liens AS L
ON (M.id_mot=L.id_mot AND L.objet="article")',
'id_objet=' . intval($row['id_article']) . ' AND (' . $where_mots . ')'
);
if (is_countable($mots) ? count($mots) : 0) {
$insert = [];
foreach ($mots as $mot) {
$insert[] = ['id_mot' => $mot['id_mot'],'objet' => 'album','id_objet' => $id_album];
}
sql_insertq_multi('spip_mots_liens', $insert);
}
// publier l'album
objet_modifier('album', $id_album, ['date' => $row['date'],'statut' => 'publie']);
$nb++;
}
// refuser l'article si option demandee
// meme si c'est un article migre un coup avant
if (is_countable($liens) ? count($liens) : 0 or $id_album) {
if ($refuser) {
objet_modifier('article', $row['id_article'], ['statut' => 'refuse']);
}
}
}
return $nb;
}
/**
* Fonction privée
*
* @return array
*/
function migrer_albums_where_articles($id_rubrique, $branche = false) {
$where = [];
$where[] = 'statut=' . sql_quote('publie');
if ($id_rubrique > 0) {
if ($branche) {
include_spip('inc/rubriques');
$where[] = sql_in('id_rubrique', calcul_branche_in($id_rubrique));
} else {
$where[] = 'id_rubrique=' . intval($id_rubrique);
}
}
return $where;
}
/**
* Fonction privée
*
* @return array
*/
function migrer_albums_where_mots($groupes) {
$id_groupe = [];
$rows = sql_allfetsel('*', 'spip_groupes_mots', sql_in('id_groupe', $groupes));
foreach ($rows as $row) {
$id_groupe[] = $row['id_groupe'];
$tables_liees = explode(',', $row['tables_liees']);
$tables_liees = array_filter($tables_liees);
// ajouter les evenements a ce groupe de mot
if (!in_array('albums', $tables_liees)) {
include_spip('action/editer_groupe_mots');
$tables_liees[] = 'albums';
$tables_liees = implode(',', $tables_liees);
groupe_mots_modifier($row['id_groupe'], ['tables_liees' => $tables_liees]);
}
}
$where = [sql_in('id_groupe', $id_groupe)];
return $where;
}