<?php /** * SPIP, Système de publication pour l'internet * * Copyright © avec tendresse depuis 2001 * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Ce programme est un logiciel libre distribué sous licence GNU/GPL. */ /** * Utilisations de pipelines * * @package SPIP\Medias\Pipelines */ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Traiter le cas pathologique d'un upload de document ayant echoué * car étant trop gros * * @uses erreur_upload_trop_gros() * @pipeline detecter_fond_par_defaut * @param string $fond * Nom du squelette par défaut qui sera utilisé * @return string * Nom du squelette par défaut qui sera utilisé */ function medias_detecter_fond_par_defaut($fond) { if ( empty($_GET) && empty($_POST) && empty($_FILES) && isset($_SERVER['CONTENT_LENGTH']) && isset($_SERVER['CONTENT_TYPE']) && strstr( (string) $_SERVER['CONTENT_TYPE'], 'multipart/form-data;' ) ) { include_spip('inc/getdocument'); erreur_upload_trop_gros(); } return $fond; } /** * À chaque insertion d'un nouvel objet editorial * auquel on a attaché des documents, restituer l'identifiant * du nouvel objet crée sur les liaisons documents/objet, * qui ont ponctuellement un identifiant id_objet négatif. * * @see medias_affiche_gauche() * @pipeline post_insertion * * @param array $flux * Données du pipeline * @return array * Données du pipeline */ function medias_post_insertion($flux) { $objet = objet_type($flux['args']['table']); $id_objet = $flux['args']['id_objet']; $id_auteur = $GLOBALS['visiteur_session']['id_auteur'] ?? 0; include_spip('inc/autoriser'); if (autoriser('joindredocument', $objet, $id_objet) && $id_auteur) { # cf. HACK medias_affiche_gauche() # rattrapper les documents associes a cet objet nouveau # ils ont un id = 0-id_auteur # utiliser l'api editer_lien pour les appels aux pipeline edition_lien include_spip('action/editer_liens'); $liens = objet_trouver_liens(['document' => '*'], [$objet => 0 - $id_auteur]); foreach ($liens as $lien) { objet_associer(['document' => $lien['document']], [$objet => $id_objet], $lien); } // un simple delete pour supprimer les liens temporaires sql_delete('spip_documents_liens', ['id_objet = ' . (0 - $id_auteur), 'objet=' . sql_quote($objet)]); } return $flux; } /** * Ajoute la configuration des documents à la page de configuration des contenus * * @pipeline affiche_milieu * @param array $flux * @return array */ function medias_affiche_milieu($flux) { if ($flux['args']['exec'] == 'configurer_contenu') { $flux['data'] .= recuperer_fond('prive/squelettes/inclure/configurer', ['configurer' => 'configurer_documents']); } return $flux; } /** * Définir les meta de configuration liées aux documents * * @pipeline configurer_liste_metas * @param array $config * Couples nom de la méta => valeur par défaut * @return array * Couples nom de la méta => valeur par défaut */ function medias_configurer_liste_metas($config) { $config['documents_objets'] = 'spip_articles'; $config['documents_date'] = 'non'; return $config; } /** * Compléter un début de traduction avec le logo de l’objet que l’on traduit * * @pipeline pre_edition * @param array $flux * @return array */ function medias_pre_edition($flux) { if ($flux['args']['action'] === 'completer_traduction') { $table = $flux['args']['table']; $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table); if (!empty($desc['field']['id_trad'])) { $_id_table = id_table_objet($table); $objet = $flux['args']['objet']; $id_objet = intval($flux['args']['id_objet']); $id_trad = sql_getfetsel('id_trad', $table, $_id_table . '=' . $id_objet); // recuperer le logo $chercher_logo = charger_fonction('chercher_logo', 'inc'); include_spip('action/editer_logo'); foreach (['on', 'off'] as $etat) { $logo = $chercher_logo($id_trad, $_id_table, $etat); if ($logo && ($file = reset($logo))) { logo_modifier($objet, $id_objet, $etat, $file); } } } } return $flux; } /** * Institue ou met à jour les liens de documents après l'édition d'un objet * * @pipeline post_edition * @param array $flux * Données du pipeline * @return array * Données du pipeline */ function medias_post_edition($flux) { // le serveur n'est pas toujours la $serveur = ($flux['args']['serveur'] ?? ''); // si on ajoute un document, mettre son statut a jour if (isset($flux['args']['action']) && $flux['args']['action'] == 'ajouter_document') { include_spip('action/editer_document'); // mettre a jour le statut si necessaire document_instituer($flux['args']['id_objet']); } // si on institue un objet, mettre ses documents lies a jour elseif (isset($flux['args']['table']) && $flux['args']['table'] !== 'spip_documents') { $type = $flux['args']['type'] ?? objet_type($flux['args']['table']); // verifier d'abord les doublons ! include_spip('inc/autoriser'); if (autoriser('autoassocierdocument', $type, $flux['args']['id_objet'])) { $table_objet = $flux['args']['table_objet'] ?? table_objet($flux['args']['table'], $serveur); $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc'); $marquer_doublons_doc( $flux['data'], $flux['args']['id_objet'], $type, id_table_objet($type, $serveur), $table_objet, $flux['args']['table'], '', $serveur ); } if ($flux['args']['action'] && $flux['args']['action'] == 'instituer' || isset($flux['data']['statut'])) { include_spip('base/abstract_sql'); $id = $flux['args']['id_objet']; $docs = array_column( sql_allfetsel('id_document', 'spip_documents_liens', 'id_objet=' . intval($id) . ' AND objet=' . sql_quote($type)), 'id_document' ); include_spip('action/editer_document'); foreach ($docs as $id_document) { // mettre a jour le statut si necessaire document_instituer($id_document); } } } else { if (isset($flux['args']['table']) && $flux['args']['table'] !== 'spip_documents') { // verifier les doublons ! $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc'); $marquer_doublons_doc( $flux['data'], $flux['args']['id_objet'], $flux['args']['type'], id_table_objet($flux['args']['type'], $serveur), $flux['args']['table_objet'], $flux['args']['spip_table_objet'], '', $serveur ); } } return $flux; } /** * Ajouter le portfolio et ajout de document sur les fiches objet * * Uniquement sur les objets pour lesquelles les medias ont été activés * * @pipeline afficher_complement_objet * @param array $flux * @return array */ function medias_afficher_complement_objet($flux) { if ( ($type = $flux['args']['type']) && ($id = intval($flux['args']['id'])) ) { include_spip('inc/config'); include_spip('action/editer_liens'); // document autorisé en upload sur cet objet ? ou, y a t'il déja des docs attachés ? $existe_docs = count(objet_trouver_liens(['document' => '*'], [$type => $id])); if ($existe_docs || $type == 'article' || in_array( table_objet_sql($type), explode(',', (string) lire_config('documents_objets', '')) )) { $documenter_objet = charger_fonction('documenter_objet', 'inc'); $flux['data'] .= $documenter_objet($id, $type); } } return $flux; } /** * Ajoute le formulaire d'ajout de document au formulaire d'édition * d'un objet (lorsque cet objet peut recevoir des documents). * * @note * HACK : Lors d'une première création de l'objet, celui-ci n'ayant pas * encore d'identifiant tant que le formulaire d'édition n'est pas enregistré, * les liaisions entre les documents liés et l'objet à créer sauvegardent * un identifiant d'objet négatif de la valeur de id_auteur (l'auteur * connecte). Ces liaisons seront corrigées après validation dans * le pipeline medias_post_insertion() * * @pipeline affiche_gauche * @see medias_post_insertion() * * @param array $flux * Données du pipeline * @return array * Données du pipeline */ function medias_affiche_gauche($flux) { if ( ($en_cours = trouver_objet_exec($flux['args']['exec'])) && $en_cours['edition'] !== false && ($type = $en_cours['type']) && ($id_table_objet = $en_cours['id_table_objet']) && ( isset($flux['args'][$id_table_objet]) && ($id = intval($flux['args'][$id_table_objet])) || ($id = 0 - $GLOBALS['visiteur_session']['id_auteur']) ) && autoriser('joindredocument', $type, $id) ) { $flux['data'] .= recuperer_fond('prive/objets/editer/colonne_document', ['objet' => $type, 'id_objet' => $id]); } return $flux; } /** * Utilisation du pipeline document_desc_actions * * Ne fait rien ici. * * Ce pipeline permet aux plugins d'ajouter de boutons d'action supplémentaires * sur les formulaires d'ajouts de documents * * @pipeline document_desc_actions * @param array $flux * Données du pipeline * @return array * Données du pipeline */ function medias_document_desc_actions($flux) { return $flux; } /** * Utilisation du pipeline editer_document_actions * * Ne fait rien ici. * * Ce pipeline permet aux plugins d'ajouter de boutons d'action supplémentaires * sur les formulaires d'édition de documents * * @pipeline editer_document_actions * @param array $flux * Données du pipeline * @return array * Données du pipeline */ function medias_editer_document_actions($flux) { return $flux; } /** * Utilisation du pipeline renseigner_document_distant * * Ne fait rien ici. * * Ce pipeline permet aux plugins de renseigner les clés `fichier` et * `mode` d'un document distant à partir de l'URL du fichier dans * la clé `source`. * * @see renseigner_source_distante() * @pipeline renseigner_document_distant * @param array $flux * Données du pipeline * @return array * Données du pipeline */ function medias_renseigner_document_distant($flux) { return $flux; } /** * Compter les documents dans un objet * * @pipeline objet_compte_enfants * @param array $flux * @return array */ function medias_objet_compte_enfants($flux) { if ( ($objet = $flux['args']['objet']) && ($id = intval($flux['args']['id_objet'])) ) { // juste les publies ? if (array_key_exists('statut', $flux['args']) && $flux['args']['statut'] == 'publie') { $flux['data']['document'] = sql_countsel( 'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document', 'L.objet=' . sql_quote($objet) . 'AND L.id_objet=' . intval( $id ) . " AND (D.statut='publie') and D.mode NOT IN ('logoon','logoff') " ); } else { $flux['data']['document'] = sql_countsel( 'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document', 'L.objet=' . sql_quote($objet) . 'AND L.id_objet=' . intval( $id ) . " AND (D.statut='publie' OR D.statut='prepa') and D.mode NOT IN ('logoon','logoff')" ); } } return $flux; } /** * Afficher le nombre de documents dans chaque rubrique * * @pipeline boite_infos * @param array $flux * @return array */ function medias_boite_infos($flux) { if ( $flux['args']['type'] == 'rubrique' && ($id_rubrique = $flux['args']['id']) ) { if ($nb = sql_countsel('spip_documents_liens', "objet='rubrique' AND id_objet=" . intval($id_rubrique))) { $nb = '<div>' . singulier_ou_pluriel($nb, 'medias:un_document', 'medias:des_documents') . '</div>'; if ($p = strpos((string) $flux['data'], '<!--nb_elements-->')) { $flux['data'] = substr_replace($flux['data'], $nb, $p, 0); } } } return $flux; } /** * Insertion dans le pipeline revisions_chercher_label (Plugin révisions) * Trouver le bon label à afficher sur les champs dans les listes de révisions * * Si un champ est un champ extra, son label correspond au label défini du champs extra * * @pipeline revisions_chercher_label * @param array $flux Données du pipeline * @return array Données du pipeline */ function medias_revisions_chercher_label($flux) { foreach (['id_vignette', 'hauteur', 'largeur', 'mode', 'taille'] as $champ) { if ($flux['args']['champ'] == $champ) { $flux['data'] = 'medias:info_' . $champ; return $flux; } } foreach (['fichier', 'taille', 'mode', 'credits'] as $champ) { if ($flux['args']['champ'] == $champ) { $flux['data'] = 'medias:label_' . $champ; return $flux; } } if ($flux['args']['champ'] == 'distant') { $flux['data'] = $flux['data'] = 'medias:fichier_distant'; } return $flux; } /** * Publier une rubrique ayant un document joint… * * @param array $flux * @return array */ function medias_calculer_rubriques($flux) { $r = sql_select( 'R.id_rubrique AS id, max(D.date) AS date_h', ['spip_rubriques AS R', 'spip_documents_liens AS DL', 'spip_documents AS D'], [ 'R.id_rubrique = DL.id_objet', "DL.objet = 'rubrique'", 'D.id_document = DL.id_document', "D.statut = 'publie'", 'D.date > R.date_tmp', sql_in('D.mode', ['image', 'document']), ], 'R.id_rubrique' ); while ($row = sql_fetch($r)) { sql_updateq( 'spip_rubriques', ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']], 'id_rubrique=' . $row['id'] ); } return $flux; }