Skip to content
Extraits de code Groupes Projets

Comparer les révisions

Les modifications sont affichées comme si la révision source était fusionnée avec la révision cible. En savoir plus sur la comparaison des révisions.

Source

Sélectionner le projet cible
No results found

Cible

Sélectionner le projet cible
  • spip/medias
  • pierre.laszczak/medias
  • cy.altern/medias
  • MathieuAlphamosa/medias
  • taffit/medias
  • RealET/medias
  • johan/medias
  • Yohooo/medias
  • pierretux/medias
  • placido/medias
  • JLuc/medias
11 résultats
Afficher les modifications
Affichage de
avec 693 ajouts et 431 suppressions
<?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.
*/
/**
* Fonctions génériques pour les balises `#LOGO_XXXX`
*
* @package SPIP\Core\Compilateur\Balises
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Compile la balise dynamique `#LOGO_xx` qui retourne le code HTML
* pour afficher l'image de logo d'un objet éditorial de SPIP.
*
* Le type d'objet est récupéré dans le nom de la balise, tel que
* `LOGO_ARTICLE` ou `LOGO_SITE`.
*
* Ces balises ont quelques options :
*
* - La balise peut aussi demander explicitement le logo normal ou de survol,
* avec `LOGO_ARTICLE_NORMAL` ou `LOGO_ARTICLE_SURVOL`.
* - On peut demander un logo de rubrique en absence de logo sur l'objet éditorial
* demandé avec `LOGO_ARTICLE_RUBRIQUE`
* - `LOGO_ARTICLE*` ajoute un lien sur l'image du logo vers l'objet éditorial
* - `LOGO_ARTICLE**` retourne le nom du fichier de logo.
* - `LOGO_ARTICLE{right}`. Valeurs possibles : top left right center bottom
* - `LOGO_DOCUMENT{icone}`. Valeurs possibles : auto icone apercu vignette
* - `LOGO_ARTICLE{200, 0}`. Redimensionnement indiqué
*
* Pour récupérer l’identifiant du document sous-jacent voir la balise `ID_LOGO_...`
*
* @balise
* @uses generer_code_logo()
* @example
* ```
* #LOGO_ARTICLE
* ```
*
* @param Spip\Compilateur\Noeud\Champ $p
* Pile au niveau de la balise
* @return Spip\Compilateur\Noeud\Champ
* Pile complétée par le code à générer
*/
function balise_LOGO__dist($p) {
preg_match(',^LOGO_([A-Z_]+?)(|_NORMAL|_SURVOL|_RUBRIQUE)$,i', $p->nom_champ, $regs);
$type = strtolower($regs[1]);
$suite_logo = $regs[2];
// cas de #LOGO_SITE_SPIP
if ($type == 'site_spip') {
$type = 'site';
$_id_objet = "\"'0'\"";
}
$id_objet = id_table_objet($type);
if (!isset($_id_objet)) {
$_id_objet = champ_sql($id_objet, $p);
}
$fichier = ($p->etoile === '**') ? -1 : 0;
$coord = [];
$align = $lien = '';
$mode_logo = '';
if ($p->param && !$p->param[0][0]) {
$params = $p->param[0];
array_shift($params);
foreach ($params as $a) {
if ($a[0]->type === 'texte') {
$n = $a[0]->texte;
if (is_numeric($n)) {
$coord[] = $n;
} elseif (in_array($n, ['top', 'left', 'right', 'center', 'bottom'])) {
$align = $n;
} elseif (in_array($n, ['auto', 'icone', 'apercu', 'vignette'])) {
$mode_logo = $n;
}
} else {
$lien = calculer_liste($a, $p->descr, $p->boucles, $p->id_boucle);
}
}
}
$coord_x = $coord ? (int) array_shift($coord) : 0;
$coord_y = $coord ? (int) array_shift($coord) : 0;
if ($p->etoile === '*') {
include_spip('balise/url_');
$lien = generer_generer_url_arg($type, $p, $_id_objet);
}
$connect = $p->id_boucle ? $p->boucles[$p->id_boucle]->sql_serveur : '';
if ($type == 'document') {
$qconnect = _q($connect);
$doc = "quete_document($_id_objet, $qconnect)";
if ($fichier) {
$code = "quete_logo_file($doc, $qconnect)";
} else {
$code = "quete_logo_document($doc, " . ($lien ?: "''") . ", '$align', '$mode_logo', $coord_x, $coord_y, $qconnect)";
}
// (x=non-faux ? y : '') pour affecter x en retournant y
if ($p->descr['documents']) {
$code = '(($doublons["documents"] .= ",". '
. $_id_objet
. ") ? $code : '')";
}
} elseif ($connect) {
$code = "''";
spip_logger()
->info('Les logos distants ne sont pas prevus');
} else {
// pour generer_code_logo
include_spip('balise/id_logo_');
$champ_logo = '';
if ($fichier) {
$champ_logo = 'fichier';
}
$code = generer_code_logo($id_objet, $_id_objet, $type, $align, $lien, $p, $suite_logo, $champ_logo);
}
// demande de reduction sur logo avec ecriture spip 2.1 : #LOGO_xxx{200, 0}
if ($coord_x || $coord_y) {
$code = "filtrer('image_graver',filtrer('image_reduire'," . $code . ", '$coord_x', '$coord_y'))";
}
$p->code = $code;
$p->interdire_scripts = false;
return $p;
}
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * Ce programme est un logiciel libre distribué sous licence GNU/GPL.
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. * */
\***************************************************************************/
/** /**
* Déclarations relatives à la base de données * Déclarations relatives à la base de données
* *
* @package SPIP\Medias\Pipelines * @package SPIP\Medias\Pipelines
**/ */
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
} }
...@@ -30,21 +28,20 @@ function medias_declarer_tables_interfaces($interfaces) { ...@@ -30,21 +28,20 @@ function medias_declarer_tables_interfaces($interfaces) {
$interfaces['table_des_tables']['documents'] = 'documents'; $interfaces['table_des_tables']['documents'] = 'documents';
$interfaces['table_des_tables']['types_documents'] = 'types_documents'; $interfaces['table_des_tables']['types_documents'] = 'types_documents';
$interfaces['exceptions_des_tables']['documents']['type_document'] = array('types_documents', 'titre'); $interfaces['exceptions_des_tables']['documents']['type_document'] = ['types_documents', 'titre'];
$interfaces['exceptions_des_tables']['documents']['extension_document'] = array('types_documents', 'extension'); $interfaces['exceptions_des_tables']['documents']['extension_document'] = ['types_documents', 'extension'];
$interfaces['exceptions_des_tables']['documents']['mime_type'] = array('types_documents', 'mime_type'); $interfaces['exceptions_des_tables']['documents']['mime_type_extension'] = ['types_documents', 'mime_type'];
$interfaces['exceptions_des_tables']['documents']['media_document'] = array('types_documents', 'media'); $interfaces['exceptions_des_tables']['documents']['media_document'] = ['types_documents', 'media_defaut'];
$interfaces['exceptions_des_jointures']['spip_documents']['id_forum'] = array('spip_documents_liens', 'id_forum'); $interfaces['exceptions_des_jointures']['spip_documents']['id_forum'] = ['spip_documents_liens', 'id_forum'];
$interfaces['exceptions_des_jointures']['spip_documents']['vu'] = array('spip_documents_liens', 'vu'); $interfaces['exceptions_des_jointures']['spip_documents']['vu'] = ['spip_documents_liens', 'vu'];
$interfaces['table_date']['types_documents'] = 'date'; $interfaces['table_date']['types_documents'] = 'date';
$interfaces['table_des_traitements']['FICHIER'][] = 'get_spip_doc(%s)'; $interfaces['table_des_traitements']['FICHIER'][] = 'get_spip_doc(%s)';
$interfaces['table_des_traitements']['CREDITS']['documents'] = _TRAITEMENT_TYPO;
return $interfaces; return $interfaces;
} }
/** /**
* Table principale spip_documents et spip_types_documents * Table principale spip_documents et spip_types_documents
* *
...@@ -53,7 +50,7 @@ function medias_declarer_tables_interfaces($interfaces) { ...@@ -53,7 +50,7 @@ function medias_declarer_tables_interfaces($interfaces) {
*/ */
function medias_declarer_tables_principales($tables_principales) { function medias_declarer_tables_principales($tables_principales) {
$spip_types_documents = array( $spip_types_documents = [
'extension' => "varchar(10) DEFAULT '' NOT NULL", 'extension' => "varchar(10) DEFAULT '' NOT NULL",
'titre' => "text DEFAULT '' NOT NULL", 'titre' => "text DEFAULT '' NOT NULL",
'descriptif' => "text DEFAULT '' NOT NULL", 'descriptif' => "text DEFAULT '' NOT NULL",
...@@ -61,16 +58,16 @@ function medias_declarer_tables_principales($tables_principales) { ...@@ -61,16 +58,16 @@ function medias_declarer_tables_principales($tables_principales) {
'inclus' => "ENUM('non', 'image', 'embed') DEFAULT 'non' NOT NULL", 'inclus' => "ENUM('non', 'image', 'embed') DEFAULT 'non' NOT NULL",
'upload' => "ENUM('oui', 'non') DEFAULT 'oui' NOT NULL", 'upload' => "ENUM('oui', 'non') DEFAULT 'oui' NOT NULL",
'media_defaut' => "varchar(10) DEFAULT 'file' NOT NULL", 'media_defaut' => "varchar(10) DEFAULT 'file' NOT NULL",
'maj' => 'TIMESTAMP' 'maj' => 'TIMESTAMP',
); ];
$spip_types_documents_key = array( $spip_types_documents_key = [
'PRIMARY KEY' => 'extension', 'PRIMARY KEY' => 'extension',
'KEY inclus' => 'inclus' 'KEY inclus' => 'inclus',
); ];
$tables_principales['spip_types_documents'] = $tables_principales['spip_types_documents'] =
array('field' => &$spip_types_documents, 'key' => &$spip_types_documents_key); ['field' => &$spip_types_documents, 'key' => &$spip_types_documents_key];
return $tables_principales; return $tables_principales;
} }
...@@ -83,25 +80,25 @@ function medias_declarer_tables_principales($tables_principales) { ...@@ -83,25 +80,25 @@ function medias_declarer_tables_principales($tables_principales) {
*/ */
function medias_declarer_tables_auxiliaires($tables_auxiliaires) { function medias_declarer_tables_auxiliaires($tables_auxiliaires) {
$spip_documents_liens = array( $spip_documents_liens = [
'id_document' => "bigint(21) DEFAULT '0' NOT NULL", 'id_document' => "bigint(21) DEFAULT '0' NOT NULL",
'id_objet' => "bigint(21) DEFAULT '0' NOT NULL", 'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
'objet' => "VARCHAR (25) DEFAULT '' NOT NULL", 'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
'vu' => "ENUM('non', 'oui') DEFAULT 'non' NOT NULL", 'vu' => "ENUM('non', 'oui') DEFAULT 'non' NOT NULL",
'rang_lien' => "int(4) DEFAULT '0' NOT NULL" 'rang_lien' => "int(4) DEFAULT '0' NOT NULL",
); ];
$spip_documents_liens_key = array( $spip_documents_liens_key = [
'PRIMARY KEY' => 'id_document,id_objet,objet', 'PRIMARY KEY' => 'id_document,id_objet,objet',
'KEY id_document' => 'id_document', 'KEY id_document' => 'id_document',
'KEY id_objet' => 'id_objet', 'KEY id_objet' => 'id_objet',
'KEY objet' => 'objet', 'KEY objet' => 'objet',
); ];
$tables_auxiliaires['spip_documents_liens'] = array( $tables_auxiliaires['spip_documents_liens'] = [
'field' => &$spip_documents_liens, 'field' => &$spip_documents_liens,
'key' => &$spip_documents_liens_key 'key' => &$spip_documents_liens_key,
); ];
return $tables_auxiliaires; return $tables_auxiliaires;
} }
...@@ -121,9 +118,9 @@ function medias_declarer_tables_objets_surnoms($surnoms) { ...@@ -121,9 +118,9 @@ function medias_declarer_tables_objets_surnoms($surnoms) {
function medias_declarer_tables_objets_sql($tables) { function medias_declarer_tables_objets_sql($tables) {
$tables['spip_articles']['champs_versionnes'][] = 'jointure_documents'; $tables['spip_articles']['champs_versionnes'][] = 'jointure_documents';
$tables['spip_documents'] = array( $tables['spip_documents'] = [
'table_objet_surnoms' => array('doc', 'img', 'emb'), 'table_objet_surnoms' => ['doc', 'img', 'emb'],
'type_surnoms' => array(), 'type_surnoms' => [],
'url_voir' => 'document_edit', 'url_voir' => 'document_edit',
'url_edit' => 'document_edit', 'url_edit' => 'document_edit',
'page' => '', 'page' => '',
...@@ -137,7 +134,7 @@ function medias_declarer_tables_objets_sql($tables) { ...@@ -137,7 +134,7 @@ function medias_declarer_tables_objets_sql($tables) {
'titre' => "CASE WHEN length(titre)>0 THEN titre ELSE fichier END as titre, '' AS lang", 'titre' => "CASE WHEN length(titre)>0 THEN titre ELSE fichier END as titre, '' AS lang",
'date' => 'date', 'date' => 'date',
'principale' => 'oui', 'principale' => 'oui',
'field' => array( 'field' => [
'id_document' => 'bigint(21) NOT NULL', 'id_document' => 'bigint(21) NOT NULL',
'id_vignette' => "bigint(21) DEFAULT '0' NOT NULL", 'id_vignette' => "bigint(21) DEFAULT '0' NOT NULL",
'extension' => "VARCHAR(10) DEFAULT '' NOT NULL", 'extension' => "VARCHAR(10) DEFAULT '' NOT NULL",
...@@ -157,35 +154,35 @@ function medias_declarer_tables_objets_sql($tables) { ...@@ -157,35 +154,35 @@ function medias_declarer_tables_objets_sql($tables) {
'alt' => "text DEFAULT '' NOT NULL", 'alt' => "text DEFAULT '' NOT NULL",
'date_publication' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", 'date_publication' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
'brise' => 'tinyint DEFAULT 0', 'brise' => 'tinyint DEFAULT 0',
'maj' => 'TIMESTAMP' 'maj' => 'TIMESTAMP',
), ],
'key' => array( 'key' => [
'PRIMARY KEY' => 'id_document', 'PRIMARY KEY' => 'id_document',
'KEY id_vignette' => 'id_vignette', 'KEY id_vignette' => 'id_vignette',
'KEY mode' => 'mode', 'KEY mode' => 'mode',
'KEY extension' => 'extension' 'KEY extension' => 'extension',
), ],
'join' => array( 'join' => [
'id_document' => 'id_document', 'id_document' => 'id_document',
'extension' => 'extension' 'extension' => 'extension',
), ],
'statut' => array( 'statut' => [
array( [
'champ' => 'statut', 'champ' => 'statut',
'publie' => 'publie', 'publie' => 'publie',
'previsu' => 'publie,prop,prepa', 'previsu' => 'publie,prop,prepa',
'post_date' => 'date_publication', 'post_date' => 'date_publication',
'exception' => array('statut', 'tout') 'exception' => ['statut', 'tout'],
) ],
), ],
'tables_jointures' => array('types_documents'), 'tables_jointures' => ['types_documents'],
'rechercher_champs' => array( 'rechercher_champs' => [
'titre' => 3, 'titre' => 3,
'descriptif' => 1, 'descriptif' => 1,
'fichier' => 1, 'fichier' => 1,
'credits' => 1, 'credits' => 1,
), ],
'champs_editables' => array( 'champs_editables' => [
'titre', 'titre',
'descriptif', 'descriptif',
'date', 'date',
...@@ -200,9 +197,9 @@ function medias_declarer_tables_objets_sql($tables) { ...@@ -200,9 +197,9 @@ function medias_declarer_tables_objets_sql($tables) {
'distant', 'distant',
'extension', 'extension',
'id_vignette', 'id_vignette',
'media' 'media',
), ],
'champs_versionnes' => array( 'champs_versionnes' => [
'id_vignette', 'id_vignette',
'titre', 'titre',
'descriptif', 'descriptif',
...@@ -213,18 +210,18 @@ function medias_declarer_tables_objets_sql($tables) { ...@@ -213,18 +210,18 @@ function medias_declarer_tables_objets_sql($tables) {
'mode', 'mode',
'credits', 'credits',
'fichier', 'fichier',
'distant' 'distant',
), ],
'modeles' => array('document', 'doc', 'img', 'emb', 'image', 'video', 'audio', 'file'), 'modeles' => ['document', 'doc', 'img', 'emb', 'image', 'video', 'audio', 'file'],
'modeles_styliser' => 'medias_modeles_styliser', 'modeles_styliser' => 'medias_modeles_styliser',
); ];
// jointures sur les forum pour tous les objets // jointures sur les forum pour tous les objets
$tables[]['tables_jointures'][] = 'documents_liens'; $tables[]['tables_jointures'][] = 'documents_liens';
// recherche jointe sur les documents pour les articles et rubriques // recherche jointe sur les documents pour les articles et rubriques
$tables['spip_articles']['rechercher_jointures']['document'] = array('titre' => 2, 'descriptif' => 1); $tables['spip_articles']['rechercher_jointures']['document'] = ['titre' => 2, 'descriptif' => 1];
$tables['spip_rubriques']['rechercher_jointures']['document'] = array('titre' => 2, 'descriptif' => 1); $tables['spip_rubriques']['rechercher_jointures']['document'] = ['titre' => 2, 'descriptif' => 1];
return $tables; return $tables;
} }
...@@ -234,7 +231,6 @@ function medias_declarer_tables_objets_sql($tables) { ...@@ -234,7 +231,6 @@ function medias_declarer_tables_objets_sql($tables) {
* *
* @param string $serveur * @param string $serveur
* @param string $champ_media * @param string $champ_media
* @return void
*/ */
function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') { function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') {
global $tables_images, $tables_sequences, $tables_documents, $tables_mime; global $tables_images, $tables_sequences, $tables_documents, $tables_mime;
...@@ -242,14 +238,23 @@ function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') { ...@@ -242,14 +238,23 @@ function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') {
include_spip('base/abstract_sql'); include_spip('base/abstract_sql');
// charger en memoire tous les types deja definis pour limiter les requettes // charger en memoire tous les types deja definis pour limiter les requettes
$rows = sql_allfetsel('mime_type,titre,inclus,extension,' . $champ_media . ',upload,descriptif', 'spip_types_documents', '', '', '', '', '', $serveur); $rows = sql_allfetsel(
$deja = array(); 'mime_type,titre,inclus,extension,' . $champ_media . ',upload,descriptif',
'spip_types_documents',
'',
'',
'',
'',
'',
$serveur
);
$deja = [];
foreach ($rows as $k => $row) { foreach ($rows as $k => $row) {
$deja[$row['extension']] = &$rows[$k]; $deja[$row['extension']] = &$rows[$k];
} }
$insertions = array(); $insertions = [];
$updates = array(); $updates = [];
foreach ($tables_mime as $extension => $type_mime) { foreach ($tables_mime as $extension => $type_mime) {
if (isset($tables_images[$extension])) { if (isset($tables_images[$extension])) {
...@@ -269,20 +274,22 @@ function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') { ...@@ -269,20 +274,22 @@ function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') {
} }
} }
// type de media // type de media (par defaut)
$media = 'file'; $media = 'file';
if (preg_match(',^image/,', $type_mime) or in_array($type_mime, array('application/illustrator'))) { if (preg_match(',^image/,', (string) $type_mime) || in_array($type_mime, ['application/illustrator'])) {
$media = 'image'; $media = 'image';
} elseif (preg_match(',^audio/,', $type_mime)) { } elseif (preg_match(',^audio/,', (string) $type_mime)) {
$media = 'audio'; $media = 'audio';
} elseif (preg_match(',^video/,', $type_mime) or in_array( } elseif (
$type_mime, preg_match(',^video/,', (string) $type_mime) || in_array(
array('application/ogg', 'application/x-shockwave-flash', 'application/mp4') $type_mime,
)) { ['application/ogg', 'application/x-shockwave-flash', 'application/mp4']
)
) {
$media = 'video'; $media = 'video';
} }
$set = array( $set = [
'mime_type' => $type_mime, 'mime_type' => $type_mime,
'titre' => $titre, 'titre' => $titre,
'inclus' => $inclus, 'inclus' => $inclus,
...@@ -290,7 +297,7 @@ function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') { ...@@ -290,7 +297,7 @@ function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') {
$champ_media => $media, $champ_media => $media,
'upload' => 'oui', 'upload' => 'oui',
'descriptif' => '', 'descriptif' => '',
); ];
if (!isset($deja[$extension])) { if (!isset($deja[$extension])) {
$insertions[] = $set; $insertions[] = $set;
} elseif (array_diff($deja[$extension], $set)) { } elseif (array_diff($deja[$extension], $set)) {
...@@ -305,11 +312,10 @@ function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') { ...@@ -305,11 +312,10 @@ function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') {
} }
if ($insertions) { if ($insertions) {
sql_insertq_multi('spip_types_documents', $insertions, '', $serveur); sql_insertq_multi('spip_types_documents', $insertions, [], $serveur);
} }
} }
/** /**
* Optimiser la base de données en supprimant les liens orphelins * Optimiser la base de données en supprimant les liens orphelins
* *
...@@ -322,9 +328,24 @@ function medias_optimiser_base_disparus($flux) { ...@@ -322,9 +328,24 @@ function medias_optimiser_base_disparus($flux) {
// optimiser les liens morts : // optimiser les liens morts :
// entre documents vers des objets effaces // entre documents vers des objets effaces
// depuis des documents effaces // depuis des documents effaces
$flux['data'] += objet_optimiser_liens(array('document' => '*'), '*'); $flux['data'] += objet_optimiser_liens(['document' => '*'], '*');
// on ne nettoie volontairement pas automatiquement les documents orphelins // on ne nettoie volontairement pas automatiquement les documents orphelins
// mais il faut nettoyer les logos qui ne sont plus liés à rien
$res = sql_select(
'D.id_document',
'spip_documents AS D
LEFT JOIN spip_documents_liens AS L
ON (L.id_document=D.id_document)',
sql_in('D.mode', ['logoon', 'logooff']) . ' AND L.id_document IS NULL'
);
$supprimer_document = charger_fonction('supprimer_document', 'action');
while ($row = sql_fetch($res)) {
autoriser_exception('supprimer', 'document', $row['id_document']);
$supprimer_document($row['id_document']);
$flux['data']++;
}
return $flux; return $flux;
} }
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * Ce programme est un logiciel libre distribué sous licence GNU/GPL.
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. * */
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
...@@ -16,21 +15,22 @@ if (!defined('_ECRIRE_INC_VERSION')) { ...@@ -16,21 +15,22 @@ if (!defined('_ECRIRE_INC_VERSION')) {
global $tables_images, $tables_sequences, $tables_documents, $tables_mime, $mime_alias; global $tables_images, $tables_sequences, $tables_documents, $tables_mime, $mime_alias;
$tables_images = array( $tables_images = [
// Images reconnues par PHP // Images reconnues par PHP
'jpg' => 'JPEG', 'jpg' => 'JPEG',
'png' => 'PNG', 'png' => 'PNG',
'gif' => 'GIF', 'gif' => 'GIF',
'webp' => 'WEBP', 'webp' => 'WEBP',
'avif' => 'AVIF',
// Autres images (peuvent utiliser le tag <img>) // Autres images (peuvent utiliser le tag <img>)
'bmp' => 'BMP', 'bmp' => 'BMP',
'svg' => 'SVG', 'svg' => 'SVG',
); ];
// Multimedia (peuvent utiliser le tag <embed>) // Multimedia (peuvent utiliser le tag <embed>)
$tables_sequences = array( $tables_sequences = [
'aac' => 'Advanced Audio Coding', 'aac' => 'Advanced Audio Coding',
'ac3' => 'AC-3 Compressed Audio', 'ac3' => 'AC-3 Compressed Audio',
'aifc' => 'Compressed AIFF Audio', 'aifc' => 'Compressed AIFF Audio',
...@@ -85,11 +85,11 @@ $tables_sequences = array( ...@@ -85,11 +85,11 @@ $tables_sequences = array(
'wmv' => 'Windows Media Video', 'wmv' => 'Windows Media Video',
'y4m' => 'YUV4MPEG2', 'y4m' => 'YUV4MPEG2',
'3ga' => '3GP Audio File', '3ga' => '3GP Audio File',
'3gp' => '3rd Generation Partnership Project' '3gp' => '3rd Generation Partnership Project',
); ];
// Documents varies // Documents varies
$tables_documents = array( $tables_documents = [
'7z' => '7 Zip', '7z' => '7 Zip',
'abw' => 'Abiword', 'abw' => 'Abiword',
'ai' => 'Adobe Illustrator', 'ai' => 'Adobe Illustrator',
...@@ -114,6 +114,7 @@ $tables_documents = array( ...@@ -114,6 +114,7 @@ $tables_documents = array(
'epub' => 'EPUB', 'epub' => 'EPUB',
'eps' => 'PostScript', 'eps' => 'PostScript',
'gpx' => 'GPS eXchange Format', 'gpx' => 'GPS eXchange Format',
'geojson' => 'GeoJSON',
'gz' => 'GZ', 'gz' => 'GZ',
'h' => 'C header', 'h' => 'C header',
'html' => 'HTML', 'html' => 'HTML',
...@@ -189,7 +190,6 @@ $tables_documents = array( ...@@ -189,7 +190,6 @@ $tables_documents = array(
'ots' => 'OpenDocument Spreadsheet-template', 'ots' => 'OpenDocument Spreadsheet-template',
'ott' => 'OpenDocument Text-template', 'ott' => 'OpenDocument Text-template',
// Open XML File Formats // Open XML File Formats
'docm' => 'Word', 'docm' => 'Word',
'docx' => 'Word', 'docx' => 'Word',
...@@ -209,15 +209,16 @@ $tables_documents = array( ...@@ -209,15 +209,16 @@ $tables_documents = array(
'xlsm' => 'Excel', 'xlsm' => 'Excel',
'xlsx' => 'Excel', 'xlsx' => 'Excel',
'xltm' => 'Excel template', 'xltm' => 'Excel template',
'xltx' => 'Excel template' 'xltx' => 'Excel template',
); ];
$tables_mime = array( $tables_mime = [
// Images reconnues par PHP // Images reconnues par PHP
'jpg' => 'image/jpeg', 'jpg' => 'image/jpeg',
'png' => 'image/png', 'png' => 'image/png',
'gif' => 'image/gif', 'gif' => 'image/gif',
'webp' => 'image/webp', 'webp' => 'image/webp',
'avif' => 'image/avif',
// Autres images (peuvent utiliser le tag <img>) // Autres images (peuvent utiliser le tag <img>)
'bmp' => 'image/x-ms-bmp', // pas enregistre par IANA, variante: image/bmp 'bmp' => 'image/x-ms-bmp', // pas enregistre par IANA, variante: image/bmp
...@@ -304,6 +305,7 @@ $tables_mime = array( ...@@ -304,6 +305,7 @@ $tables_mime = array(
'ens' => 'application/octet-stream', 'ens' => 'application/octet-stream',
'eps' => 'application/postscript', 'eps' => 'application/postscript',
'epub' => 'application/epub+zip', // pas enregistre par IANA 'epub' => 'application/epub+zip', // pas enregistre par IANA
'geojson' => 'application/json',
'gpx' => 'application/gpx+xml', // pas enregistre par IANA 'gpx' => 'application/gpx+xml', // pas enregistre par IANA
'gz' => 'application/x-gzip', 'gz' => 'application/x-gzip',
'h' => 'text/x-chdr', 'h' => 'text/x-chdr',
...@@ -398,17 +400,18 @@ $tables_mime = array( ...@@ -398,17 +400,18 @@ $tables_mime = array(
'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
); ];
$mime_alias = array( $mime_alias = [
'application/x-ogg' => 'application/ogg', 'application/x-ogg' => 'application/ogg',
'audio/3gpp' => 'video/3gpp', 'audio/3gpp' => 'video/3gpp',
'audio/x-m4a' => 'audio/mp4a-latm',
'audio/x-mpeg' => 'audio/mpeg', 'audio/x-mpeg' => 'audio/mpeg',
'audio/x-musepack' => 'audio/musepack', 'audio/x-musepack' => 'audio/musepack',
'audio/webm' => 'video/webm', 'audio/webm' => 'video/webm',
'video/flv' => 'video/x-flv', 'video/flv' => 'video/x-flv',
'video/mp4' => 'application/mp4', 'video/mp4' => 'application/mp4',
'image/jpg' => 'image/jpeg' 'audio/mp4' => 'application/mp4',
); 'image/jpg' => 'image/jpeg',
];
{
"name": "spip/medias",
"description": "Gestion des medias dans SPIP",
"license": "GPL-3.0-or-later",
"type": "spip-plugin",
"authors": [
{
"name": "Collectif SPIP",
"homepage": "https://discuter.spip.net/c/spip-dev/5",
"role": "Maintainer"
}
],
"require": {
"php": "^8.2",
"james-heinrich/getid3": "^1.9",
"spip/archiviste": "^3.0"
},
"require-dev": {
"rector/rector": "^2.0",
"spip-league/easy-coding-standard": "^1.1",
"spip-league/sdk": "^1.0",
"symfony/console": "^7.2"
},
"repositories": {
"spip": {
"type": "composer",
"url": "https://get.spip.net/composer"
}
},
"autoload-dev": {
"files": [
"vendor/spip-league/sdk/src/Stub/functions_autoloading.php",
"vendor/spip-league/sdk/src/Stub/functions_cache.php",
"vendor/spip-league/sdk/src/Stub/functions_compiler.php",
"vendor/spip-league/sdk/src/Stub/functions_config.php",
"vendor/spip-league/sdk/src/Stub/functions_event_dispatching.php",
"vendor/spip-league/sdk/src/Stub/functions_filesystem.php",
"vendor/spip-league/sdk/src/Stub/functions_http_client.php",
"vendor/spip-league/sdk/src/Stub/functions_http_server.php",
"vendor/spip-league/sdk/src/Stub/functions_i18n.php",
"vendor/spip-league/sdk/src/Stub/functions_image_processing.php",
"vendor/spip-league/sdk/src/Stub/functions_logger.php",
"vendor/spip-league/sdk/src/Stub/functions_metas.php",
"vendor/spip-league/sdk/src/Stub/functions_objects_base.php",
"vendor/spip-league/sdk/src/Stub/functions_objects_documents.php",
"vendor/spip-league/sdk/src/Stub/functions_objects_rubriques.php",
"vendor/spip-league/sdk/src/Stub/functions_path.php",
"vendor/spip-league/sdk/src/Stub/functions_plugin_management.php",
"vendor/spip-league/sdk/src/Stub/functions_sql_query.php",
"vendor/spip-league/sdk/src/Stub/functions_templating.php",
"vendor/spip-league/sdk/src/Stub/functions_text_processing.php",
"vendor/spip-league/sdk/src/Stub/functions_user_management.php"
]
},
"config": {
"platform": {
"php": "8.2.26"
}
},
"extra": {
"branch-alias": {
"dev-master": "5.0.x-dev"
}
},
"scripts": {
"analyse": "vendor/bin/phpstan --memory-limit=-1",
"check-cs": "vendor/bin/ecs check --ansi",
"fix-cs": "vendor/bin/ecs check --fix --ansi",
"rector": "vendor/bin/rector process --ansi",
"rector-dry-run": "vendor/bin/rector process --dry-run --ansi"
}
}
<?php
use SpipLeague\EasyCodingStandard\Set\SetList;
use Symplify\EasyCodingStandard\Config\ECSConfig;
return ECSConfig::configure()
->withSets([SetList::SPIP])
->withPaths([__DIR__])
->withRootFiles()
->withSkip([__DIR__ . '/lang', __DIR__ . '/vendor', __DIR__ . '/lib'])
;
<div class='formulaire_spip formulaire_changer_fichier_document' id='formulaire_changer_fichier_document-#ENV{id,new}'>
[<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>]
[(#ENV{editable})
<form action="#ENV{action}#formulaire_changer_fichier_document-#ENV{id,new}" method="post" enctype='multipart/form-data'><div>
#ACTION_FORMULAIRE
<div class="editer-groupe">
<div class="editer editer_fichier[ (#ENV**{erreurs}|table_valeur{fichier}|oui)erreur]">
<label for="fichier"><:medias:label_fichier:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{fichier})</span>
]
[(#ENV{fichier}) ]
<p class='actions'>
[(#ENV{distant}|=={oui}|oui)<input type='submit' class='btn submit' name='copier_local' value='<:medias:bouton_copier_local|attribut_html:>' />]
&#91;<a href='#' onclick='jQuery("#changer_fichier_document").toggle("fast");return false;'><:bouton_changer:></a>&#93;
</p>
<div id='changer_fichier_document' style='display:none;'>
[(#INCLURE{fond=formulaires/inc-upload_document, env})]
</div>
</div>
</div>
</div></form>
]
</div>
\ No newline at end of file
<?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. *
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function formulaires_changer_fichier_document_charger_dist($id_document) {
$valeurs = sql_fetsel('id_document,fichier,distant', 'spip_documents', 'id_document=' . intval($id_document));
if (!$valeurs) {
return array('editable' => false);
}
$charger = charger_fonction('charger', 'formulaires/joindre_document');
$valeurs = array_merge($valeurs, $charger($id_document, 0, '', 'choix'));
$valeurs['_hidden'] .= "<input name='id_document' value='$id_document' type='hidden' />";
return $valeurs;
}
function formulaires_changer_fichier_document_verifier_dist($id_document) {
$erreurs = array();
if (_request('copier_local')) {
} else {
$verifier = charger_fonction('verifier', 'formulaires/joindre_document');
$erreurs = $verifier($id_document);
}
return $erreurs;
}
function formulaires_changer_fichier_document_traiter_dist($id_document) {
if (_request('copier_local')) {
$copier_local = charger_fonction('copier_local', 'action');
$res = array('editable' => true);
if (($err = $copier_local($id_document)) === true) {
$res['message_ok'] = _T('medias:document_copie_locale_succes');
} else {
$res['message_erreur'] = $err;
}
} else {
// liberer le nom de l'ancien fichier pour permettre le remplacement par un fichier du meme nom
if ($ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document))
and @file_exists($f = get_spip_doc($ancien_fichier))
) {
spip_unlink($f);
}
$traiter = charger_fonction('traiter', 'formulaires/joindre_document');
$res = $traiter($id_document);
}
return $res;
}
<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}">
<h3 class='titrem'><img src="#CHEMIN_IMAGE{document-24.png}" class="cadre-icone" /><:medias:titre_documents_joints:></h3> <h3 class='titrem'><img src="#CHEMIN_IMAGE{document-24.png}" class="cadre-icone" /><:medias:titre_documents_joints:></h3>
[<p class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV*{message_ok})</p>] [<div class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV*{message_ok})</div>]
[<p class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV*{message_erreur})</p>] [<div class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV*{message_erreur})</div>]
[(#ENV{editable}) [(#ENV{editable})
<p><:medias:texte_documents_joints:></p> <p><:medias:texte_documents_joints:></p>
<p class="explication"><:medias:texte_documents_joints_2:></p> <p class="explication"><:medias:texte_documents_joints_2:></p>
...@@ -10,13 +10,13 @@ ...@@ -10,13 +10,13 @@
parametre : url d'action ] parametre : url d'action ]
#ACTION_FORMULAIRE #ACTION_FORMULAIRE
<div class="editer-groupe"> <div class="editer-groupe">
#SET{name,documents_objets}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} #SET{name,documents_objets}#SET{erreurs,#ENV*{erreurs/#GET{name}}}
<div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label><:medias:label_activer_document_objets:></label>[ <label><:medias:label_activer_document_objets:></label>[
<span class='erreur_message'>(#GET{erreurs})</span> <span class='erreur_message'>(#GET{erreurs})</span>
]#INCLURE{fond=formulaires/inc-choisir-objets,name=#GET{name},selected=#ENV**{#GET{name}},exclus=spip_documents} ]#INCLURE{fond=formulaires/inc-choisir-objets,name=#GET{name},selected=#ENV{#GET{name}},exclus=spip_documents}
</div> </div>
#SET{name,documents_date}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} #SET{name,documents_date}#SET{erreurs,#ENV*{erreurs/#GET{name}}}
<div class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <div class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
[ [
<span class='erreur_message'>(#GET{erreurs})</span> <span class='erreur_message'>(#GET{erreurs})</span>
...@@ -35,4 +35,4 @@ ...@@ -35,4 +35,4 @@
<p class='boutons'><span class='image_loading'>&nbsp;</span><input type='submit' class='btn submit' value='<:bouton_enregistrer:>' /></p> <p class='boutons'><span class='image_loading'>&nbsp;</span><input type='submit' class='btn submit' value='<:bouton_enregistrer:>' /></p>
</div></form> </div></form>
] ]
</div> </div>
\ No newline at end of file
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * Ce programme est un logiciel libre distribué sous licence GNU/GPL.
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. * */
\***************************************************************************/
/** /**
* Gestion du formulaire de configuration des documents * Gestion du formulaire de configuration des documents
* *
* @package SPIP\Medias\Formulaires * @package SPIP\Medias\Formulaires
**/ */
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
} }
...@@ -25,16 +23,15 @@ if (!defined('_ECRIRE_INC_VERSION')) { ...@@ -25,16 +23,15 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* *
* @return array * @return array
* Environnement du formulaire * Environnement du formulaire
**/ */
function formulaires_configurer_documents_charger_dist() { function formulaires_configurer_documents_charger_dist() {
$valeurs = array(); $valeurs = [];
foreach (array( foreach (
'documents_objets', ['documents_objets', 'documents_date'] as $m
'documents_date', ) {
) as $m) { $valeurs[$m] = $GLOBALS['meta'][$m] ?? '';
$valeurs[$m] = isset($GLOBALS['meta'][$m]) ? $GLOBALS['meta'][$m] : '';
} }
$valeurs['documents_objets'] = explode(',', $valeurs['documents_objets']); $valeurs['documents_objets'] = explode(',', (string) $valeurs['documents_objets']);
return $valeurs; return $valeurs;
} }
...@@ -44,13 +41,13 @@ function formulaires_configurer_documents_charger_dist() { ...@@ -44,13 +41,13 @@ function formulaires_configurer_documents_charger_dist() {
* *
* @return array * @return array
* Retours du traitement * Retours du traitement
**/ */
function formulaires_configurer_documents_traiter_dist() { function formulaires_configurer_documents_traiter_dist() {
$res = array('editable' => true); $res = ['editable' => true];
if (!is_null($v = _request($m = 'documents_date'))) { if (null !== ($v = _request($m = 'documents_date'))) {
ecrire_meta($m, $v == 'oui' ? 'oui' : 'non'); ecrire_meta($m, $v == 'oui' ? 'oui' : 'non');
} }
if (!is_null($v = _request($m = 'documents_objets'))) { if (null !== ($v = _request($m = 'documents_objets'))) {
ecrire_meta($m, is_array($v) ? implode(',', $v) : ''); ecrire_meta($m, is_array($v) ? implode(',', $v) : '');
} }
......
<div class='formulaire_spip formulaire_editer formulaire_editer_document formulaire_editer_document-#ENV{id_document,nouveau}'> <div class='formulaire_spip formulaire_editer formulaire_editer_document formulaire_editer_document-#ENV{id_document,nouveau}'>
[<p class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV**{message_ok})</p>] [<div class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV**{message_ok})</div>]
[<p class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV*{message_erreur})</p>] [<div class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV*{message_erreur})</div>]
[(#ENV{editable}) [(#ENV{editable})
<form method='post' action='#ENV{action}' enctype='multipart/form-data'><div> <form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire [(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ] parametre : url d'action ]
#ACTION_FORMULAIRE #ACTION_FORMULAIRE
<input type='hidden' name='id_document' value='#ENV{id_document}' /> <input type='hidden' name='id_document' value='#ENV{id_document}' />
...@@ -12,26 +12,38 @@ ...@@ -12,26 +12,38 @@
] ]
<div style="position:absolute;#LANG_LEFT:-10000px;" class="invisible-first-save-button"><input type='submit' class='btn submit' tabindex="-1" value='<:bouton_enregistrer:>' /></div> <div style="position:absolute;#LANG_LEFT:-10000px;" class="invisible-first-save-button"><input type='submit' class='btn submit' tabindex="-1" value='<:bouton_enregistrer:>' /></div>
<div class="editer-groupe"> <div class="editer-groupe">
<div class="editer editer_titre[ (#ENV**{erreurs}|table_valeur{titre}|oui)erreur]"> <div class="editer editer_titre[ (#ENV*{erreurs/titre}|oui)erreur]">
<label for="titre">[(#ENV{mode}|=={document}|?{<:medias:entree_titre_document:>,<:medias:entree_titre_image:>})]</label>[ <label for="titre">[(#ENV{mode}|=={document}|?{<:medias:entree_titre_document:>,<:medias:entree_titre_image:>})]</label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{titre})</span> <span class='erreur_message'>(#ENV*{erreurs/titre})</span>
]<input type='text' class='text' name='titre' id='titre' value="[(#ENV**{titre,''})]" /> ]<input type='text' class='text' name='titre' id='titre' value="[(#ENV{titre,''})]" />
</div> </div>
<div class='editer editer_parent[ (#ENV**{erreurs}|table_valeur{parents}|oui)erreur]'> <div class='editer editer_parent[ (#ENV*{erreurs/parents}|oui)erreur]'>
<label for="parents"><:medias:label_parents:></label>[ <label for="parents"><:medias:label_parents:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{parents})</span> <span class='erreur_message'>(#ENV*{erreurs/parents})</span>
]<INCLURE{fond=formulaires/selecteur/articles, selected=#ENV{parents}, name=parents, rubriques=1, articles=1} /> ]<INCLURE{fond=formulaires/selecteur/articles, selected=#ENV{parents}, name=parents, rubriques=1, articles=1} />
</div> </div>
[<div class="editer editer_fichier[ (#ENV**{erreurs}|table_valeur{fichier}|oui)erreur]"> [<div class="editer editer_fichier[ (#ENV*{erreurs/fichier}|oui)erreur]">
<label for="fichier"><:medias:label_fichier:></label>[ <label for="fichier"><:medias:label_fichier:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{fichier})</span> <span class='erreur_message'>(#ENV*{erreurs/fichier})</span>
] ]
(#ENV{fichier}) (#ENV{fichier})
<p class='actions right'> <p class='actions right'>
[(#ENV{distant}|=={oui}|et{#TAILLE|<{#CONST{_COPIE_LOCALE_MAX_SIZE}}}|oui)<input type='submit' class='btn submit btn_mini' name='copier_local' value='<:medias:bouton_copier_local|attribut_html:>' />] [(#ENV{distant}|=={oui}|et{#TAILLE|<{#CONST{_COPIE_LOCALE_MAX_SIZE}}}|oui)<input type='submit' class='btn submit btn_mini' name='copier_local' value='<:medias:bouton_copier_local|attribut_html:>' />]
[(#PIPELINE{editer_document_actions,#ARRAY{args,#ARRAY{id_document,#ENV{id_document,nouveau}},data,''}})] [(#PIPELINE{editer_document_actions,#ARRAY{args,#ARRAY{id_document,#ENV{id_document,nouveau}},data,''}})]
<a class="btn btn_secondaire btn_mini" href='#' onclick='jQuery("#changer_fichier_document").toggle("fast");return false;'><:bouton_changer:></a> <a class="btn btn_secondaire btn_mini" name="bouton_changer_fichier_document"><:bouton_changer:></a>
</p> </p>
[<!--(#REM) TODO : remplacer par une fonction générique de type bouton_toggle -->]
<script type="module">
import { slideToggle , debounce } from 'ajaxCallback.js';
const btn = document.querySelector('.formulaire_editer_document .btn[name="bouton_changer_fichier_document"]');
btn.addEventListener('click', debounce(
async (e) => {
e.preventDefault();
await slideToggle(document.getElementById('changer_fichier_document'),200);
},
200)
);
</script>
#SET{upload,#INCLURE{fond=formulaires/inc-upload_document, env, joindre_upload=oui, multi=non}} #SET{upload,#INCLURE{fond=formulaires/inc-upload_document, env, joindre_upload=oui, multi=non}}
<div id='changer_fichier_document' class="[(#GET{upload}|match{erreur}|non)none-js]"> <div id='changer_fichier_document' class="[(#GET{upload}|match{erreur}|non)none-js]">
#GET{upload} #GET{upload}
...@@ -60,47 +72,47 @@ ...@@ -60,47 +72,47 @@
<div class="editer editer_infos"> <div class="editer editer_infos">
<label><:medias:label_caracteristiques:></label> <label><:medias:label_caracteristiques:></label>
[<span class='type'>(#ENV{type_document}) - </span>] [<span class='type'>(#ENV{type_document}) - </span>]
<span class='taille'>[(#LARGEUR|ou{#HAUTEUR}|oui)[(#VAL{info_largeur_vignette}|_T{#ARRAY{largeur_vignette,#LARGEUR,hauteur_vignette,#HAUTEUR}})] - <span class='taille'>[(#LARGEUR|ou{#HAUTEUR}|oui)[(#VAL{info_largeur_vignette}|_T{#ARRAY{largeur_vignette,#LARGEUR,hauteur_vignette,#HAUTEUR}})] -
][(#TAILLE|taille_en_octets|texte_backend)]</span> ][(#TAILLE|taille_en_octets|texte_backend)]</span>
[(#ENV{_taille_modif}|oui)<div class='taille_modifiee'><:medias:fichier_modifie:><br />[(#ENV{_largeur_modif}|ou{#ENV{_hauteur_modif}}|oui)[(#VAL{info_largeur_vignette}|_T{#ARRAY{largeur_vignette,#ENV{_largeur_modif},hauteur_vignette,#ENV{_hauteur_modif}}})] - [(#ENV{_taille_modif}|oui)<div class='taille_modifiee'><:medias:fichier_modifie:><br />[(#ENV{_largeur_modif}|ou{#ENV{_hauteur_modif}}|oui)[(#VAL{info_largeur_vignette}|_T{#ARRAY{largeur_vignette,#ENV{_largeur_modif},hauteur_vignette,#ENV{_hauteur_modif}}})] -
][(#ENV{_taille_modif}|taille_en_octets|texte_backend)]</div>] ][(#ENV{_taille_modif}|taille_en_octets|texte_backend)]</div>]
[(#PIPELINE{afficher_metas_document,#ARRAY{args,#ARRAY{'quoi','editer_document','id_document',#ENV{id_document}},data,''}})] [(#PIPELINE{afficher_metas_document,#ARRAY{args,#ARRAY{'quoi','editer_document','id_document',#ENV{id_document}},data,''}})]
</div> </div>
<div class="editer editer_descriptif[ (#ENV**{erreurs}|table_valeur{descriptif}|oui)erreur]"> <div class="editer editer_descriptif[ (#ENV*{erreurs/descriptif}|oui)erreur]">
<label for="descriptif"><:info_description:></label>[ <label for="descriptif"><:medias:descriptif:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{descriptif})</span> <span class='erreur_message'>(#ENV*{erreurs/descriptif})</span>
]<textarea name='descriptif' id='descriptif'[ lang='(#LANGUE)'] rows='2' cols='40'>[(#ENV**{descriptif})]</textarea> ]<textarea name='descriptif' id='descriptif'[ lang='(#LANGUE)'] rows='2' cols='40'>[(#ENV{descriptif})]</textarea>
</div> </div>
[(#ENV{_editer_date}) [(#ENV{_editer_date})
<div class="editer editer_date[ (#ENV**{erreurs}|table_valeur{saisie_date}|oui)erreur][ (#ENV**{erreurs}|table_valeur{saisie_heure}|oui)erreur]"> <div class="editer editer_date[ (#ENV*{erreurs/saisie_date}|oui)erreur][ (#ENV*{erreurs/saisie_heure}|oui)erreur]">
<label for="saisie_date" class='date'><:date:></label>[ <label for="saisie_date" class='date'><:date:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{saisie_date})</span> <span class='erreur_message'>(#ENV*{erreurs/saisie_date})</span>
]<input type='text' class='text date' name='saisie_date' id='saisie_date' size="10" maxlength="10" value="[(#ENV{saisie_date})]" aria-describedby="format_date_doc_#ENV{id_document,nouveau}"/> ]<input type='text' class='text date' name='saisie_date' id='saisie_date' size="10" maxlength="10" value="[(#ENV{saisie_date})]" aria-describedby="format_date_doc_#ENV{id_document,nouveau}"/>
<span class='choix heure'> <span class='choix heure'>
<label for='saisie_heure' class='heure'><:medias:info_heure:></label>[ <label for='saisie_heure' class='heure'><:medias:info_heure:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{saisie_heure})</span>] <span class='erreur_message'>(#ENV*{erreurs/saisie_heure})</span>]
<input type='text' class='text heure' name='saisie_heure' id='saisie_heure' size="5" maxlength="5" value="[(#ENV{saisie_heure})]" aria-describedby="format_heure_doc_#ENV{id_document,nouveau}"/> <input type='text' class='text heure' name='saisie_heure' id='saisie_heure' size="5" maxlength="5" value="[(#ENV{saisie_heure})]" aria-describedby="format_heure_doc_#ENV{id_document,nouveau}"/>
</span> </span>
<p hidden id="format_date_doc_#ENV{id_document,nouveau}"><:format_date_attendu:></p> <p hidden id="format_date_doc_#ENV{id_document,nouveau}"><:format_date_attendu:></p>
<p hidden id="format_heure_doc_#ENV{id_document,nouveau}"><:format_heure_attendu:></p> <p hidden id="format_heure_doc_#ENV{id_document,nouveau}"><:format_heure_attendu:></p>
</div>] </div>]
<div class="editer editer_credits[ (#ENV**{erreurs}|table_valeur{credits}|oui)erreur]"> <div class="editer editer_credits[ (#ENV*{erreurs/credits}|oui)erreur]">
<label for="credits"><:medias:label_credits:></label>[ <label for="credits"><:medias:label_credits:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{credits})</span> <span class='erreur_message'>(#ENV*{erreurs/credits})</span>
]<input type='text' class='text' name='credits' id='credits' value="#ENV**{credits,''}" /> ]<input type='text' class='text' name='credits' id='credits' value="#ENV{credits,''}" />
</div> </div>
[(#MEDIA|=={image}|oui) [(#MEDIA|=={image}|oui)
<div class="editer editer_alt[ (#ENV**{erreurs}|table_valeur{alt}|oui)erreur]"> <div class="editer editer_alt[ (#ENV*{erreurs/alt}|oui)erreur]">
<label for="alt"><:medias:label_alt:></label>[ <label for="alt"><:medias:label_alt:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{alt})</span> <span class='erreur_message'>(#ENV*{erreurs/alt})</span>
]<p class="explication"><:medias:info_alt:></p> ]<p class="explication"><:medias:info_alt:></p>
<input type='text' class='text' name='alt' id='alt' value="#ENV**{alt,''}" /> <input type='text' class='text' name='alt' id='alt' value="#ENV{alt,''}" />
</div> </div>
] ]
[(#ENV{_editer_dimension}) [(#ENV{_editer_dimension})
<div class="editer editer_dimensions[ (#ENV**{erreurs}|table_valeur{dimensions}|oui)erreur]"> <div class="editer editer_dimensions[ (#ENV*{erreurs/dimensions}|oui)erreur]">
<label><:medias:entree_dimensions:></label>[ <label><:medias:entree_dimensions:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{dimensions})</span>] <span class='erreur_message'>(#ENV*{erreurs/dimensions})</span>]
<span class='choix largeur'> <span class='choix largeur'>
<label for='largeur' class='largeur'><:medias:info_largeur:></label> <label for='largeur' class='largeur'><:medias:info_largeur:></label>
<input type='text' class='text' name='largeur' id='largeur' value="[(#ENV{largeur})]" /> <input type='text' class='text' name='largeur' id='largeur' value="[(#ENV{largeur})]" />
...@@ -115,5 +127,5 @@ ...@@ -115,5 +127,5 @@
<!--extra--> <!--extra-->
<p class="boutons"><span class='image_loading'>&nbsp;</span><input type='submit' class='btn submit' value='<:bouton_enregistrer:>' /></p> <p class="boutons"><span class='image_loading'>&nbsp;</span><input type='submit' class='btn submit' value='<:bouton_enregistrer:>' /></p>
</div></form> </div></form>
#INCLURE{fond=formulaires/dateur/inc-dateur}] #INCLURE{fond=formulaires/dateur/inc-dateur}
</div> </div>
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * Ce programme est un logiciel libre distribué sous licence GNU/GPL.
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. * */
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
...@@ -25,22 +24,30 @@ function formulaires_editer_document_charger_dist( ...@@ -25,22 +24,30 @@ function formulaires_editer_document_charger_dist(
$retour = '', $retour = '',
$lier_trad = 0, $lier_trad = 0,
$config_fonc = 'documents_edit_config', $config_fonc = 'documents_edit_config',
$row = array(), $row = [],
$hidden = '' $hidden = ''
) { ) {
$valeurs = formulaires_editer_objet_charger('document', $id_document, $id_parent, $lier_trad, $retour, $config_fonc, $row, $hidden); $valeurs = formulaires_editer_objet_charger(
'document',
$id_document,
$id_parent,
$lier_trad,
$retour,
$config_fonc,
$row,
$hidden
);
if (intval($id_document) and !autoriser('modifier', 'document', intval($id_document))) { if (intval($id_document) && !autoriser('modifier', 'document', intval($id_document))) {
$valeurs['editable'] = ''; $valeurs['editable'] = '';
} }
// relier les parents // relier les parents
$valeurs['parents'] = array(); $valeurs['parents'] = [];
$valeurs['_hidden'] = ''; $valeurs['_hidden'] = '';
$parents = sql_allfetsel('objet,id_objet', 'spip_documents_liens', 'id_document=' . intval($id_document)); $parents = sql_allfetsel('objet,id_objet', 'spip_documents_liens', 'id_document=' . intval($id_document));
foreach ($parents as $p) { foreach ($parents as $p) {
if (in_array($p['objet'], array('article', 'rubrique')) and $p['id_objet'] > 0) { if (in_array($p['objet'], ['article', 'rubrique']) && $p['id_objet'] > 0) {
$valeurs['parents'][] = $p['objet'] . '|' . $p['id_objet']; $valeurs['parents'][] = $p['objet'] . '|' . $p['id_objet'];
} else { } else {
$valeurs['_hidden'] .= "<input type='hidden' name='parents[]' value='" . $p['objet'] . '|' . $p['id_objet'] . "' />"; $valeurs['_hidden'] .= "<input type='hidden' name='parents[]' value='" . $p['objet'] . '|' . $p['id_objet'] . "' />";
...@@ -66,7 +73,8 @@ function formulaires_editer_document_charger_dist( ...@@ -66,7 +73,8 @@ function formulaires_editer_document_charger_dist(
); );
$valeurs['type_document'] = $row['type_document']; $valeurs['type_document'] = $row['type_document'];
$valeurs['_inclus'] = $row['inclus']; $valeurs['_inclus'] = $row['inclus'];
if (in_array($valeurs['extension'], array('jpg', 'gif', 'png', 'svg'))) { include_spip('inc/filtres_images_lib_mini');
if (in_array($valeurs['extension'], _image_extensions_acceptees_en_entree())) {
$valeurs['apercu'] = get_spip_doc($valeurs['fichier']); $valeurs['apercu'] = get_spip_doc($valeurs['fichier']);
} }
...@@ -75,10 +83,11 @@ function formulaires_editer_document_charger_dist( ...@@ -75,10 +83,11 @@ function formulaires_editer_document_charger_dist(
if ($valeurs['distant'] !== 'oui') { if ($valeurs['distant'] !== 'oui') {
include_spip('inc/renseigner_document'); include_spip('inc/renseigner_document');
$infos = renseigner_taille_dimension_image(get_spip_doc($valeurs['fichier']), $valeurs['extension']); $infos = renseigner_taille_dimension_image(get_spip_doc($valeurs['fichier']), $valeurs['extension']);
if ($infos and is_array($infos) and isset($infos['taille'])) { if ($infos && is_array($infos) && isset($infos['taille'])) {
if ($infos['taille'] != $valeurs['taille'] if (
or ($infos['type_image'] && ($infos['largeur'] != $valeurs['largeur'])) $infos['taille'] != $valeurs['taille']
or ($infos['type_image'] && ($infos['hauteur'] != $valeurs['hauteur'])) || $infos['type_image'] && $infos['largeur'] != $valeurs['largeur']
|| $infos['type_image'] && $infos['hauteur'] != $valeurs['hauteur']
) { ) {
$valeurs['_taille_modif'] = $infos['taille']; $valeurs['_taille_modif'] = $infos['taille'];
$valeurs['_largeur_modif'] = $infos['largeur']; $valeurs['_largeur_modif'] = $infos['largeur'];
...@@ -91,7 +100,6 @@ function formulaires_editer_document_charger_dist( ...@@ -91,7 +100,6 @@ function formulaires_editer_document_charger_dist(
} }
} }
// pour l'upload d'un nouveau doc // pour l'upload d'un nouveau doc
if ($valeurs['fichier']) { if ($valeurs['fichier']) {
$charger = charger_fonction('charger', 'formulaires/joindre_document'); $charger = charger_fonction('charger', 'formulaires/joindre_document');
...@@ -106,7 +114,7 @@ function formulaires_editer_document_charger_dist( ...@@ -106,7 +114,7 @@ function formulaires_editer_document_charger_dist(
function documents_edit_config($row) { function documents_edit_config($row) {
global $spip_lang; global $spip_lang;
$config = array();//$GLOBALS['meta']; $config = []; //$GLOBALS['meta'];
$config['lignes'] = 8; $config['lignes'] = 8;
$config['langue'] = $spip_lang; $config['langue'] = $spip_lang;
...@@ -121,13 +129,13 @@ function formulaires_editer_document_verifier_dist( ...@@ -121,13 +129,13 @@ function formulaires_editer_document_verifier_dist(
$retour = '', $retour = '',
$lier_trad = 0, $lier_trad = 0,
$config_fonc = 'documents_edit_config', $config_fonc = 'documents_edit_config',
$row = array(), $row = [],
$hidden = '' $hidden = ''
) { ) {
$erreurs = formulaires_editer_objet_verifier('document', $id_document, is_numeric($id_document) ? array() : array('titre')); $erreurs = formulaires_editer_objet_verifier('document', $id_document, is_numeric($id_document) ? [] : ['titre']);
// verifier l'upload si on a demande a changer le document // verifier l'upload si on a demande a changer le document
if (_request('joindre_upload') or _request('joindre_ftp') or _request('joindre_distant')) { if (_request('joindre_upload') || _request('joindre_ftp') || _request('joindre_distant')) {
if (_request('copier_local')) { if (_request('copier_local')) {
} else { } else {
$verifier = charger_fonction('verifier', 'formulaires/joindre_document'); $verifier = charger_fonction('verifier', 'formulaires/joindre_document');
...@@ -137,8 +145,9 @@ function formulaires_editer_document_verifier_dist( ...@@ -137,8 +145,9 @@ function formulaires_editer_document_verifier_dist(
// On ne vérifie la date que si on avait le droit de la modifier // On ne vérifie la date que si on avait le droit de la modifier
if (lire_config('documents_date') == 'oui') { if (lire_config('documents_date') == 'oui') {
if (!$date = recup_date(_request('saisie_date') . ' ' . _request('saisie_heure') . ':00') if (
or !($date = mktime($date[3], $date[4], 0, $date[1], $date[2], $date[0])) !($date = recup_date(_request('saisie_date') . ' ' . _request('saisie_heure') . ':00'))
|| !($date = mktime($date[3], $date[4], 0, $date[1], $date[2], $date[0]))
) { ) {
$erreurs['saisie_date'] = _T('medias:format_date_incorrect'); $erreurs['saisie_date'] = _T('medias:format_date_incorrect');
} else { } else {
...@@ -151,41 +160,48 @@ function formulaires_editer_document_verifier_dist( ...@@ -151,41 +160,48 @@ function formulaires_editer_document_verifier_dist(
return $erreurs; return $erreurs;
} }
// https://code.spip.net/@inc_editer_article_dist
function formulaires_editer_document_traiter_dist( function formulaires_editer_document_traiter_dist(
$id_document = 'new', $id_document = 'new',
$id_parent = '', $id_parent = '',
$retour = '', $retour = '',
$lier_trad = 0, $lier_trad = 0,
$config_fonc = 'documents_edit_config', $config_fonc = 'documents_edit_config',
$row = array(), $row = [],
$hidden = '' $hidden = ''
) { ) {
if (is_null(_request('parents'))) { $rename = null;
set_request('parents', array()); if (_request('parents') === null) {
set_request('parents', []);
} }
// verifier les infos de taille et dimensions sur les fichiers locaux // verifier les infos de taille et dimensions sur les fichiers locaux
// cas des maj de fichier directes par ftp // cas des maj de fichier directes par ftp
foreach (array('taille', 'largeur', 'hauteur') as $c) { foreach (['taille', 'largeur', 'hauteur'] as $c) {
if (($v = _request("_{$c}_modif")) and !_request($c)) { if (($v = _request("_{$c}_modif")) && !_request($c)) {
set_request($c, $v); set_request($c, $v);
} }
} }
$res = formulaires_editer_objet_traiter('document', $id_document, $id_parent, $lier_trad, $retour, $config_fonc, $row, $hidden); $res = formulaires_editer_objet_traiter(
'document',
$id_document,
$id_parent,
$lier_trad,
$retour,
$config_fonc,
$row,
$hidden
);
set_request('parents'); set_request('parents');
$autoclose = "<script type='text/javascript'>if (window.jQuery) jQuery.modalboxclose();</script>"; $autoclose = '<script>if (window.jQuery) jQuery.modalboxclose();</script>';
if (_request('copier_local') $mode = sql_getfetsel('mode', 'spip_documents', "id_document = $id_document");
or _request('joindre_upload') if (
or _request('joindre_ftp') _request('copier_local') || _request('joindre_upload') || _request('joindre_ftp') || _request('joindre_distant') || _request('joindre_zip')
or _request('joindre_distant')
or _request('joindre_zip')
) { ) {
$autoclose = ''; $autoclose = '';
if (_request('copier_local')) { if (_request('copier_local')) {
$copier_local = charger_fonction('copier_local', 'action'); $copier_local = charger_fonction('copier_local', 'action');
$res = array('editable' => true); $res = ['editable' => true];
if (($err = $copier_local($id_document)) === true) { if (($err = $copier_local($id_document)) === true) {
$res['message_ok'] = (isset($res['message_ok']) ? $res['message_ok'] . '<br />' : '') . _T('medias:document_copie_locale_succes'); $res['message_ok'] = (isset($res['message_ok']) ? $res['message_ok'] . '<br />' : '') . _T('medias:document_copie_locale_succes');
} else { } else {
...@@ -194,22 +210,22 @@ function formulaires_editer_document_traiter_dist( ...@@ -194,22 +210,22 @@ function formulaires_editer_document_traiter_dist(
set_request('credits'); // modifie par la copie locale set_request('credits'); // modifie par la copie locale
} else { } else {
// liberer le nom de l'ancien fichier pour permettre le remplacement par un fichier du meme nom // liberer le nom de l'ancien fichier pour permettre le remplacement par un fichier du meme nom
if ($ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document)) if (
and !tester_url_absolue($ancien_fichier) ($ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document)))
and @file_exists($rename = get_spip_doc($ancien_fichier)) && !tester_url_absolue($ancien_fichier)
&& @file_exists($rename = get_spip_doc($ancien_fichier))
) { ) {
@rename($rename, "$rename--.old"); @rename($rename, "$rename--.old");
} }
$traiter = charger_fonction('traiter', 'formulaires/joindre_document'); $traiter = charger_fonction('traiter', 'formulaires/joindre_document');
$res2 = $traiter($id_document); $res2 = $traiter($id_document, 0, '', $mode);
if (isset($res2['message_erreur'])) { if (isset($res2['message_erreur'])) {
$res['message_erreur'] = $res2['message_erreur']; $res['message_erreur'] = $res2['message_erreur'];
// retablir le fichier ! // retablir le fichier !
if ($rename) { if ($rename) {
@rename("$rename--.old", $rename); @rename("$rename--.old", $rename);
} }
} else // supprimer vraiment le fichier initial } else { // supprimer vraiment le fichier initial
{
spip_unlink("$rename--.old"); spip_unlink("$rename--.old");
} }
} }
...@@ -220,13 +236,13 @@ function formulaires_editer_document_traiter_dist( ...@@ -220,13 +236,13 @@ function formulaires_editer_document_traiter_dist(
// regarder si une demande de rotation a eu lieu // regarder si une demande de rotation a eu lieu
// c'est un bouton image, dont on a pas toujours le name en request, on fait avec // c'est un bouton image, dont on a pas toujours le name en request, on fait avec
$angle = 0; $angle = 0;
if (_request('tournerL90') or _request('tournerL90_x')) { if (_request('tournerL90') || _request('tournerL90_x')) {
$angle = -90; $angle = -90;
} }
if (_request('tournerR90') or _request('tournerR90_x')) { if (_request('tournerR90') || _request('tournerR90_x')) {
$angle = 90; $angle = 90;
} }
if (_request('tourner180') or _request('tourner180_x')) { if (_request('tourner180') || _request('tourner180_x')) {
$angle = 180; $angle = 180;
} }
if ($angle) { if ($angle) {
...@@ -244,7 +260,11 @@ function formulaires_editer_document_traiter_dist( ...@@ -244,7 +260,11 @@ function formulaires_editer_document_traiter_dist(
} }
if ($res['message_ok']) { if ($res['message_ok']) {
$res['message_ok'] .= '<script type="text/javascript">if (window.jQuery) ajaxReload("document_infos");</script>'; if (!str_contains((string) $mode, 'logo')) {
$res['message_ok'] .= '<script>ajaxReload("document_infos");</script>';
} else {
$res['message_ok'] .= '<script>ajaxReload("navigation");</script>';
}
} }
return $res; return $res;
......
<div class='formulaire_spip formulaire_illustrer_document' id='formulaire_illustrer_document-#ENV{id,new}'> <div class='formulaire_spip formulaire_illustrer_document' id='formulaire_illustrer_document-#ENV{id,new}'>
[<p class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV*{message_ok})</p>] [<div class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV*{message_ok})</div>]
[<p class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV*{message_erreur})</p>] [<div class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV*{message_erreur})</div>]
[(#ENV{editable}) [(#ENV{editable})
<form action="#ENV{action}#formulaire_illustrer_document-#ENV{id,new}" method="post" enctype='multipart/form-data'><div> <form action="#ENV{action}#formulaire_illustrer_document-#ENV{id,new}" method="post" enctype='multipart/form-data'><div>
#ACTION_FORMULAIRE #ACTION_FORMULAIRE
<div class="editer-groupe"> <div class="editer-groupe">
<div class="editer editer_fichier[ (#ENV**{erreurs}|table_valeur{fichier}|oui)erreur]"> <div class="editer editer_fichier[ (#ENV*{erreurs/fichier}|oui)erreur]">
<label for="fichier"><:medias:label_fichier_vignette:></label>[ <label for="fichier"><:medias:label_fichier_vignette:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{fichier})</span> <span class='erreur_message'>(#ENV*{erreurs/fichier})</span>
][<tt>(#ENV{vignette}|set_spip_doc)</tt><br />][ ][<tt>(#ENV{vignette}|set_spip_doc)</tt><br />][
(#CONFIG{taille_preview}|intval|?{#ENV*{vignette}|image_reduire{#CONFIG{taille_preview}},#ENV*{vignette}|balise_img}) (#CONFIG{taille_preview}|intval|?{#ENV*{vignette}|image_reduire{#CONFIG{taille_preview}},#ENV*{vignette}|balise_img})
][(#ENV*{vignette}|non)<:medias:aucune_vignette:> ][(#ENV*{vignette}|non)<:medias:aucune_vignette:>
...@@ -15,7 +15,9 @@ ...@@ -15,7 +15,9 @@
] ]
<p class='actions float-end'> <p class='actions float-end'>
[(#ENV{id_vignette}|oui|et{#AUTORISER{supprimer,document,#ENV{id_vignette}}}) <input type='submit' class='btn btn_mini btn_secondaire submit' name='supprimer' value='<:medias:bouton_supprimer|attribut_html:>' />] [(#ENV{id_vignette}|oui|et{#AUTORISER{supprimer,document,#ENV{id_vignette}}}) <input type='submit' class='btn btn_mini btn_secondaire submit' name='supprimer' value='<:medias:bouton_supprimer|attribut_html:>' />]
[(#ENV{id_vignette}|non|ou{#AUTORISER{modifier,document,#ENV{id_vignette}}}) <a class="btn btn_mini btn_secondaire" href='#' onclick='jQuery("#illustrer_document").toggle("fast");return false;'><:bouton_changer:></a>] [(#ENV{id_vignette}|non|ou{#AUTORISER{modifier,document,#ENV{id_vignette}}})
[<!--(#REM) TODO : remplacer par une fonction générique de type bouton_toggle -->]
<a class="btn btn_mini btn_secondaire" href='javascript:' onclick='jQuery("#illustrer_document").toggle("fast");return false;'><:bouton_changer:></a>]
<span class='image_loading'>&nbsp;</span> <span class='image_loading'>&nbsp;</span>
</p> </p>
<div id='illustrer_document' style='display:none;'> <div id='illustrer_document' style='display:none;'>
...@@ -24,4 +26,4 @@ ...@@ -24,4 +26,4 @@
</div> </div>
</div> </div>
</div></form>] </div></form>]
</div> </div>
\ No newline at end of file
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * Ce programme est un logiciel libre distribué sous licence GNU/GPL.
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. * */
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
...@@ -16,15 +15,25 @@ if (!defined('_ECRIRE_INC_VERSION')) { ...@@ -16,15 +15,25 @@ if (!defined('_ECRIRE_INC_VERSION')) {
function formulaires_illustrer_document_charger_dist($id_document) { function formulaires_illustrer_document_charger_dist($id_document) {
include_spip('inc/documents'); include_spip('inc/documents');
$valeurs = sql_fetsel('id_document,mode,id_vignette,extension,media', 'spip_documents', 'id_document=' . intval($id_document)); $valeurs = sql_fetsel(
if (!$valeurs /*OR in_array($valeurs['extension'],array('jpg','gif','png'))*/) { 'id_document,mode,id_vignette,extension,media',
return array('editable' => false, 'id' => $id_document); 'spip_documents',
'id_document=' . intval($id_document)
);
if (
!$valeurs || in_array($valeurs['mode'], ['logoon', 'logooff'])
) {
return ['editable' => false, 'id' => $id_document];
} }
$valeurs['id'] = $id_document; $valeurs['id'] = $id_document;
$valeurs['_hidden'] = "<input name='id_document' value='$id_document' type='hidden' />"; $valeurs['_hidden'] = "<input name='id_document' value='$id_document' type='hidden' />";
$valeurs['mode'] = 'vignette'; // pour les id dans le dom $valeurs['mode'] = 'vignette'; // pour les id dans le dom
$vignette = sql_fetsel('fichier,largeur,hauteur,id_document', 'spip_documents', 'id_document=' . $valeurs['id_vignette']); $vignette = sql_fetsel(
'fichier,largeur,hauteur,id_document',
'spip_documents',
'id_document=' . $valeurs['id_vignette']
);
if ($vignette) { if ($vignette) {
$valeurs['vignette'] = get_spip_doc($vignette['fichier']); $valeurs['vignette'] = get_spip_doc($vignette['fichier']);
$valeurs['hauteur'] = $vignette['hauteur']; $valeurs['hauteur'] = $vignette['hauteur'];
...@@ -36,9 +45,9 @@ function formulaires_illustrer_document_charger_dist($id_document) { ...@@ -36,9 +45,9 @@ function formulaires_illustrer_document_charger_dist($id_document) {
$valeurs['largeur'] = null; $valeurs['largeur'] = null;
$valeurs['id_vignette'] = null; $valeurs['id_vignette'] = null;
} }
$valeurs['_pipeline'] = array('editer_contenu_objet', array('type' => 'illustrer_document', 'id' => $id_document)); $valeurs['_pipeline'] = ['editer_contenu_objet', ['type' => 'illustrer_document', 'id' => $id_document]];
if (intval($id_document) and !autoriser('modifier', 'document', intval($id_document))) { if (intval($id_document) && !autoriser('modifier', 'document', intval($id_document))) {
$valeurs['editable'] = ''; $valeurs['editable'] = '';
} }
...@@ -46,7 +55,7 @@ function formulaires_illustrer_document_charger_dist($id_document) { ...@@ -46,7 +55,7 @@ function formulaires_illustrer_document_charger_dist($id_document) {
} }
function formulaires_illustrer_document_verifier_dist($id_document) { function formulaires_illustrer_document_verifier_dist($id_document) {
$erreurs = array(); $erreurs = [];
if (_request('supprimer')) { if (_request('supprimer')) {
} else { } else {
$id_vignette = sql_getfetsel('id_vignette', 'spip_documents', 'id_document=' . intval($id_document)); $id_vignette = sql_getfetsel('id_vignette', 'spip_documents', 'id_document=' . intval($id_document));
...@@ -59,10 +68,10 @@ function formulaires_illustrer_document_verifier_dist($id_document) { ...@@ -59,10 +68,10 @@ function formulaires_illustrer_document_verifier_dist($id_document) {
function formulaires_illustrer_document_traiter_dist($id_document) { function formulaires_illustrer_document_traiter_dist($id_document) {
$id_vignette = sql_getfetsel('id_vignette', 'spip_documents', 'id_document=' . intval($id_document)); $id_vignette = sql_getfetsel('id_vignette', 'spip_documents', 'id_document=' . intval($id_document));
$res = array('editable' => true); $res = ['editable' => true];
if (_request('supprimer')) { if (_request('supprimer')) {
$supprimer_document = charger_fonction('supprimer_document', 'action'); $supprimer_document = charger_fonction('supprimer_document', 'action');
if ($id_vignette and $supprimer_document($id_vignette)) { if ($id_vignette && $supprimer_document($id_vignette)) {
$res['message_ok'] = _T('medias:vignette_supprimee'); $res['message_ok'] = _T('medias:vignette_supprimee');
} else { } else {
$res['message_erreur'] = _T('medias:erreur_suppression_vignette'); $res['message_erreur'] = _T('medias:erreur_suppression_vignette');
...@@ -75,11 +84,11 @@ function formulaires_illustrer_document_traiter_dist($id_document) { ...@@ -75,11 +84,11 @@ function formulaires_illustrer_document_traiter_dist($id_document) {
$ajoute = $ajouter_documents($id_vignette, $files, '', 0, 'vignette'); $ajoute = $ajouter_documents($id_vignette, $files, '', 0, 'vignette');
if (is_numeric(reset($ajoute)) if (
and $id_vignette = reset($ajoute) is_numeric(reset($ajoute)) && ($id_vignette = reset($ajoute))
) { ) {
include_spip('action/editer_document'); include_spip('action/editer_document');
document_modifier($id_document, array('id_vignette' => $id_vignette, 'mode' => 'document')); document_modifier($id_document, ['id_vignette' => $id_vignette, 'mode' => 'document']);
$res['message_ok'] = _T('medias:document_installe_succes'); $res['message_ok'] = _T('medias:document_installe_succes');
} else { } else {
$res['message_erreur'] = reset($ajoute); $res['message_erreur'] = reset($ajoute);
......
#SET{domid,_#ENV{mode}|concat{'_',#ENV{id,new}}} #SET{domid,_#ENV{mode}|concat{'_',#ENV{id,new}}}
#SET{methode,upload}
[(#ENV{joindre_mediatheque}|oui)#SET{methode,mediatheque}]
[(#ENV{joindre_distant}|oui)#SET{methode,distant}]
[(#ENV{joindre_ftp}|oui)#SET{methode,ftp}]
[(#REM) On récupère la liste des méthodes disponibles ]
#SET{methodes_upload,#ENV**|medias_lister_methodes_upload} #SET{methodes_upload,#ENV**|medias_lister_methodes_upload}
[(#ENV{methode_focus}|et{#GET{methodes_upload}|is_array}|et{#ENV{methode_focus}|array_key_exists{#GET{methodes_upload}}}|oui)#SET{methode,#ENV{methode_focus}}]
[(#REM) On ouvre par défaut sur la première méthode de la liste ]
#SET{methode, #GET{methodes_upload}|key}
[(#REM) Veut-on forcer l'ouverture sur une méthode précise ? ]
[(#ENV{joindre_mediatheque}|oui)#SET{methode_focus,mediatheque}]
[(#ENV{joindre_distant}|oui)#SET{methode_focus,distant}]
[(#ENV{joindre_ftp}|oui)#SET{methode_focus,ftp}]
[(#ENV{methode_focus}|oui)#SET{methode_focus, #ENV{methode_focus}}]
[(#GET{methode_focus}|et{#GET{methodes_upload}|is_array}|et{#GET{methode_focus}|array_key_exists{#GET{methodes_upload}}}|oui)#SET{methode,#GET{methode_focus}}]
<div id="defaultsubmit#GET{domid}" class="none"></div> <div id="defaultsubmit#GET{domid}" class="none"></div>
<BOUCLE_methodes(DATA){source tableau,#GET{methodes_upload}}> <BOUCLE_methodes(DATA){source tableau,#GET{methodes_upload}}>
...@@ -13,7 +20,7 @@ ...@@ -13,7 +20,7 @@
<div class='joindre_mode#GET{domid}[(#GET{methode}|=={#CLE}|non)none-js]' id='joindre_#CLE#GET{domid}'> <div class='joindre_mode#GET{domid}[(#GET{methode}|=={#CLE}|non)none-js]' id='joindre_#CLE#GET{domid}'>
<INCLURE{fond=formulaires/methodes_upload/#CLE,env,domid=#GET{domid}} /> <INCLURE{fond=formulaires/methodes_upload/#CLE,env,domid=#GET{domid}} />
[(#GET{methodes_upload}|count|>{1}|oui) [(#GET{methodes_upload}|count|>{1}|oui)
<div class='sourceup'> <div class='sourceup'>
<:medias:bouton_download_depuis:> <:medias:bouton_download_depuis:>
...@@ -22,31 +29,69 @@ ...@@ -22,31 +29,69 @@
#VALEUR{label_lien} #VALEUR{label_lien}
] ]
[(#GET{methode_upload}|=={#CLE}|non) [(#GET{methode_upload}|=={#CLE}|non)
<a href='#' onclick="change_methode('#GET{domid}','#CLE');return false;">#VALEUR{label_lien}</a> <a href="javascript:" class="bouton_choix_joindre"[ data-methode='(#ARRAY{domid,#GET{domid},methode,#CLE}|json_encode|attribut_html)']>#VALEUR{label_lien}</a>
] ]
</BOUCLE_methodes_liens> </BOUCLE_methodes_liens>
</div> </div>
] ]
<p class='boutons'><input class='btn submit' type="submit" name="joindre_#CLE" value="#VALEUR{label_bouton}"/></p> <p class="boutons"><input class='btn submit' type="submit" name="joindre_#CLE" value="#VALEUR{label_bouton}"/></p>
</div> </div>
</BOUCLE_methodes> </BOUCLE_methodes>
[(#REM) Formulaire pour deballer un zip] [(#REM) Formulaire pour deballer un zip]
[<div class="editer-groupe"><div class='fieldset deballer_zip'>(#ENV**{erreurs}|table_valeur{lister_contenu_archive})</div></div>] [<div class="editer-groupe"><div class='fieldset deballer_zip'>(#ENV**{erreurs/lister_contenu_archive})</div></div>]
<script type='text/javascript'>/*<!\[CDATA\[*/ <script type="module">
if (window.jQuery){
function change_methode(domid,methode){ import { onAjaxLoad, slideDown, slideUp } from "ajaxCallback.js";
var id = "#joindre_"+methode+domid;
if (jQuery(id).is(':hidden')) { const change_methode = (domid, methode) => {
jQuery('div.joindre_mode'+domid+':visible').slideUp('fast');
jQuery(id).slideDown('fast'); const id = document.getElementById(`joindre_${methode}${domid}`);
if (id && window.getComputedStyle(id).display === "none") {
for (const section of [...document.querySelectorAll('[id^="joindre_"]')]) {
if (section.id.indexOf(`joindre_${methode}`) === -1) {
section.slideUp(200);
}
}
id.slideDown(200);
} }
// placer en haut du formulaire les boutons submit par defaut correspondant a la methode active // placer en haut du formulaire les boutons submit par defaut correspondant a la methode active
jQuery("#defaultsubmit"+domid).html('').append(jQuery(id).find('.boutons').eq(-1).find('input').clone(true)); const id__btn = [...id.querySelectorAll(".boutons")].splice(-1)[0];
var joindre = jQuery(id).find('.boutons').eq(-1).find('input').prop('name').replace('joindre_', ''); const submit_defaut = document.getElementById(`defaultsubmit${domid}`);
jQuery("#defaultsubmit"+domid).append($('<input>').attr({type: 'hidden', id: 'methode_focus', name: 'methode_focus', value: joindre}));
} const submit_on = id__btn.querySelector("input");
jQuery(function(){change_methode('#GET{domid}','#GET{methode}');}); submit_on.name = submit_on.name.replace("joindre_", ""); //desactiver
}
/*\]\]>*/</script> const hidden_focus = document.createElement("input");
hidden_focus.type = "hidden";
hidden_focus.name = "methode_focus";
hidden_focus.id = hidden_focus.name;
hidden_focus.value = "joindre";
const hidden_on = document.createElement("input");
hidden_on.type = "hidden";
hidden_on.name = `joindre_${methode}`;
hidden_on.value = submit_on.name ?? 1;
submit_defaut.innerHTML = "";
submit_defaut.appendChild(hidden_focus);
submit_defaut.appendChild(hidden_on);
};
const init_boutons_choix_joindre_document = () => {
for (const btn of [
...document.querySelectorAll(".bouton_choix_joindre:not([data-loaded])"),
]) {
const data = JSON.parse(btn?.dataset?.methode);
btn.addEventListener("click", (e) => {
change_methode(data.domid, data.methode);
});
btn.setAttribute("data-loaded", true); // une seule fois
}
};
init_boutons_choix_joindre_document();
onAjaxLoad(init_boutons_choix_joindre_document);
</script>
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
] ]
<span class="image_loading"></span> <span class="image_loading"></span>
[<div class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV**{message_ok})</div>] [<div class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV**{message_ok})</div>]
[<p class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV**{message_erreur})</p>] [<div class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV**{message_erreur})</div>]
<form action="#ENV{action}#formulaire_joindre_document-#ENV{id,new}" method="post" enctype='multipart/form-data'><div> <form action="#ENV{action}#formulaire_joindre_document-#ENV{id,new}" method="post" enctype='multipart/form-data'><div>
#ACTION_FORMULAIRE #ACTION_FORMULAIRE
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
</div></form> </div></form>
</div>] </div>]
[(#ENV{_galerie,''}|oui) [(#REM) @deprecated 4.0 - SPIP 4.1 ]
[(#INCLURE{fond=#ENV{_galerie}|spip_sanitize_from_request{_galerie,vide}, env, ajax})] [(#ENV{_galerie,''}|joindre_document_galerie_valide|oui)
[(#INCLURE{fond=#ENV{_galerie}, env, ajax})]
] ]
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * Ce programme est un logiciel libre distribué sous licence GNU/GPL.
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. * */
\***************************************************************************/
/** /**
* Gestion du formulaire de téléversement de documents * Gestion du formulaire de téléversement de documents
...@@ -28,7 +27,7 @@ if (!defined('_ECRIRE_INC_VERSION')) { ...@@ -28,7 +27,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* L'identifiant numérique du document à remplacer ou "new" par défaut * L'identifiant numérique du document à remplacer ou "new" par défaut
* @param string $objet * @param string $objet
* Le type d'objet sur lequel ajouter le document * Le type d'objet sur lequel ajouter le document
* @return string $mode * @return string
* Le mode définitif * Le mode définitif
*/ */
function joindre_determiner_mode($mode, $id_document, $objet) { function joindre_determiner_mode($mode, $id_document, $objet) {
...@@ -36,10 +35,11 @@ function joindre_determiner_mode($mode, $id_document, $objet) { ...@@ -36,10 +35,11 @@ function joindre_determiner_mode($mode, $id_document, $objet) {
if (intval($id_document)) { if (intval($id_document)) {
$mode = sql_getfetsel('mode', 'spip_documents', 'id_document=' . intval($id_document)); $mode = sql_getfetsel('mode', 'spip_documents', 'id_document=' . intval($id_document));
} }
if (!in_array($mode, array('choix', 'document', 'image'))) { if (!in_array($mode, ['choix', 'document', 'image'])) {
$mode = 'choix'; $mode = 'choix';
if ($objet if (
and !in_array(table_objet_sql($objet), explode(',', $GLOBALS['meta']['documents_objets']))) { $objet && !in_array(table_objet_sql($objet), explode(',', (string) $GLOBALS['meta']['documents_objets']))
) {
$mode = 'image'; $mode = 'image';
} }
} }
...@@ -48,6 +48,21 @@ function joindre_determiner_mode($mode, $id_document, $objet) { ...@@ -48,6 +48,21 @@ function joindre_determiner_mode($mode, $id_document, $objet) {
return $mode; return $mode;
} }
/**
* Indique si une galerie demandée est valide
*
* @deprecated 4.0 (SPIP 4.1) L’inclusion de galerie est déprécié (non utilisé depuis SPIP 3.0). Préferez ajax_reload() après upload.
* @global array medias_deprecated_liste_galeries Liste de chemins de fichiers depuis la racine SPIP autorisés.
* @param string|null $galerie Le fichier de galerie désiré
*/
function joindre_document_galerie_valide(?string $galerie): bool {
$galeries = [];
if (isset($GLOBALS['medias_deprecated_liste_galeries']) && is_array($GLOBALS['medias_deprecated_liste_galeries'])) {
$galeries = $GLOBALS['medias_deprecated_liste_galeries'];
}
return in_array($galerie, $galeries);
}
/** /**
* Chargement du formulaire * Chargement du formulaire
* *
...@@ -60,6 +75,7 @@ function joindre_determiner_mode($mode, $id_document, $objet) { ...@@ -60,6 +75,7 @@ function joindre_determiner_mode($mode, $id_document, $objet) {
* @param string $mode * @param string $mode
* Le mode du document (auto,choix,document,image,vignette...), par défaut auto * Le mode du document (auto,choix,document,image,vignette...), par défaut auto
* @param string $galerie * @param string $galerie
* Deprecated 4.0 (SPIP 4.1)
* Passer optionnellement une galerie jointe au form, plus utilise nativement, * Passer optionnellement une galerie jointe au form, plus utilise nativement,
* on prefere la mise a jour apres upload par ajaxReload('documents') * on prefere la mise a jour apres upload par ajaxReload('documents')
* @param bool|string $proposer_media * @param bool|string $proposer_media
...@@ -68,7 +84,7 @@ function joindre_determiner_mode($mode, $id_document, $objet) { ...@@ -68,7 +84,7 @@ function joindre_determiner_mode($mode, $id_document, $objet) {
* @param bool|string $proposer_ftp * @param bool|string $proposer_ftp
* Doit on afficher le ftp ? par défaut oui * Doit on afficher le ftp ? par défaut oui
* Valeurs possibles si string : false,'non','no'. * Valeurs possibles si string : false,'non','no'.
* @return array $valeurs * @return array
* Les valeurs chargées dans le formulaire * Les valeurs chargées dans le formulaire
*/ */
function formulaires_joindre_document_charger_dist( function formulaires_joindre_document_charger_dist(
...@@ -80,10 +96,9 @@ function formulaires_joindre_document_charger_dist( ...@@ -80,10 +96,9 @@ function formulaires_joindre_document_charger_dist(
$proposer_media = true, $proposer_media = true,
$proposer_ftp = true $proposer_ftp = true
) { ) {
$valeurs = array(); $valeurs = [];
$mode = joindre_determiner_mode($mode, $id_document, $objet); $mode = joindre_determiner_mode($mode, $id_document, $objet);
$valeurs['id'] = $id_document; $valeurs['id'] = $id_document;
$valeurs['_mode'] = $mode; $valeurs['_mode'] = $mode;
...@@ -91,7 +106,7 @@ function formulaires_joindre_document_charger_dist( ...@@ -91,7 +106,7 @@ function formulaires_joindre_document_charger_dist(
$valeurs['fichier_upload'] = $valeurs['_options_upload_ftp'] = $valeurs['_dir_upload_ftp'] = ''; $valeurs['fichier_upload'] = $valeurs['_options_upload_ftp'] = $valeurs['_dir_upload_ftp'] = '';
$valeurs['joindre_upload'] = $valeurs['joindre_distant'] = $valeurs['joindre_upload'] = $valeurs['joindre_distant'] =
$valeurs['joindre_ftp'] = $valeurs['joindre_mediatheque'] = ''; $valeurs['joindre_ftp'] = $valeurs['joindre_mediatheque'] = '';
// gérer le focus de la méthode d'upload lorsque le formulaire est envoyé // gérer le focus de la méthode d'upload lorsque le formulaire est envoyé
$valeurs['methode_focus'] = _request('methode_focus'); $valeurs['methode_focus'] = _request('methode_focus');
...@@ -107,12 +122,7 @@ function formulaires_joindre_document_charger_dist( ...@@ -107,12 +122,7 @@ function formulaires_joindre_document_charger_dist(
# regarder si un choix d'upload FTP est vraiment possible # regarder si un choix d'upload FTP est vraiment possible
if ( if (
$valeurs['proposer_ftp'] $valeurs['proposer_ftp'] && test_espace_prive() && $mode != 'image' && $mode != 'vignette' # si c'est pour un document
and test_espace_prive() # ??
and ($mode != 'image') and ($mode != 'vignette') # si c'est pour un document
//AND !$vignette_de_doc
// pas pour une vignette (NB: la ligne precedente suffit, mais si on la supprime il faut conserver ce test-ci)
and $GLOBALS['flag_upload']
) { ) {
include_spip('inc/documents'); include_spip('inc/documents');
if ($dir = determine_upload('documents')) { if ($dir = determine_upload('documents')) {
...@@ -120,21 +130,22 @@ function formulaires_joindre_document_charger_dist( ...@@ -120,21 +130,22 @@ function formulaires_joindre_document_charger_dist(
$valeurs['_options_upload_ftp'] = joindre_options_upload_ftp($dir, $mode); $valeurs['_options_upload_ftp'] = joindre_options_upload_ftp($dir, $mode);
// s'il n'y en a pas, on affiche un message d'aide // s'il n'y en a pas, on affiche un message d'aide
// en mode document, mais pas en mode image // en mode document, mais pas en mode image
if ($valeurs['_options_upload_ftp'] or ($mode == 'document' or $mode == 'choix')) { if ($valeurs['_options_upload_ftp'] || ($mode == 'document' || $mode == 'choix')) {
$valeurs['_dir_upload_ftp'] = '<b>' . joli_repertoire($dir) . '</b>'; $valeurs['_dir_upload_ftp'] = '<b>' . joli_repertoire($dir) . '</b>';
} }
} }
} }
// On ne propose le FTP que si on a des choses a afficher // On ne propose le FTP que si on a des choses a afficher
$valeurs['proposer_ftp'] = ($valeurs['_options_upload_ftp'] or $valeurs['_dir_upload_ftp']); $valeurs['proposer_ftp'] = ($valeurs['_options_upload_ftp'] || $valeurs['_dir_upload_ftp']);
if ($galerie) { /** @deprecated 4.0 (SPIP 4.1). Utiliser ajaxReload('documents') après upload */
if ($galerie && joindre_document_galerie_valide($galerie)) {
# passer optionnellement une galerie jointe au form # passer optionnellement une galerie jointe au form
# plus utilise nativement, on prefere la mise a jour # plus utilise nativement, on prefere la mise a jour
# apres upload par ajaxReload('documents') # apres upload par ajaxReload('documents')
$valeurs['_galerie'] = $galerie; $valeurs['_galerie'] = $galerie;
} }
if ($objet and $id_objet) { if ($objet && $id_objet) {
$valeurs['id_objet'] = $id_objet; $valeurs['id_objet'] = $id_objet;
$valeurs['objet'] = $objet; $valeurs['objet'] = $objet;
$valeurs['refdoc_joindre'] = ''; $valeurs['refdoc_joindre'] = '';
...@@ -159,6 +170,7 @@ function formulaires_joindre_document_charger_dist( ...@@ -159,6 +170,7 @@ function formulaires_joindre_document_charger_dist(
* @param string $mode * @param string $mode
* Le mode du document (auto,choix,document,image,vignette...), par défaut auto * Le mode du document (auto,choix,document,image,vignette...), par défaut auto
* @param string $galerie * @param string $galerie
* Deprecated 4.0 (SPIP 4.1)
* Passer optionnellement une galerie jointe au form, plus utilise nativement, * Passer optionnellement une galerie jointe au form, plus utilise nativement,
* on prefere la mise a jour apres upload par ajaxReload('documents') * on prefere la mise a jour apres upload par ajaxReload('documents')
* @param bool|string $proposer_media * @param bool|string $proposer_media
...@@ -167,7 +179,7 @@ function formulaires_joindre_document_charger_dist( ...@@ -167,7 +179,7 @@ function formulaires_joindre_document_charger_dist(
* @param bool|string $proposer_ftp * @param bool|string $proposer_ftp
* Doit on afficher le ftp ? par défaut oui * Doit on afficher le ftp ? par défaut oui
* Valeurs possibles si string : false,'non','no'. * Valeurs possibles si string : false,'non','no'.
* @return array $erreurs * @return array
* Les erreurs éventuelles dans un tableau * Les erreurs éventuelles dans un tableau
*/ */
function formulaires_joindre_document_verifier_dist( function formulaires_joindre_document_verifier_dist(
...@@ -181,10 +193,10 @@ function formulaires_joindre_document_verifier_dist( ...@@ -181,10 +193,10 @@ function formulaires_joindre_document_verifier_dist(
) { ) {
include_spip('inc/joindre_document'); include_spip('inc/joindre_document');
$erreurs = array(); $erreurs = [];
// on joint un document deja dans le site // on joint un document deja dans le site
if (_request('joindre_mediatheque')) { if (_request('joindre_mediatheque')) {
$refdoc_joindre = intval(preg_replace(',^(doc|document|img),', '', _request('refdoc_joindre'))); $refdoc_joindre = intval(preg_replace(',^(doc|document|img),', '', (string) _request('refdoc_joindre')));
if (!sql_getfetsel('id_document', 'spip_documents', 'id_document=' . intval($refdoc_joindre))) { if (!sql_getfetsel('id_document', 'spip_documents', 'id_document=' . intval($refdoc_joindre))) {
$erreurs['message_erreur'] = _T('medias:erreur_aucun_document'); $erreurs['message_erreur'] = _T('medias:erreur_aucun_document');
} }
...@@ -200,8 +212,9 @@ function formulaires_joindre_document_verifier_dist( ...@@ -200,8 +212,9 @@ function formulaires_joindre_document_verifier_dist(
} else { } else {
// regarder si on a eu une erreur sur l'upload d'un fichier // regarder si on a eu une erreur sur l'upload d'un fichier
foreach ($files as $file) { foreach ($files as $file) {
if (isset($file['error']) if (
and $test = joindre_upload_error($file['error']) isset($file['error'])
&& ($test = joindre_upload_error($file['error']))
) { ) {
if (is_string($test)) { if (is_string($test)) {
$erreurs['message_erreur'] = $test; $erreurs['message_erreur'] = $test;
...@@ -213,22 +226,23 @@ function formulaires_joindre_document_verifier_dist( ...@@ -213,22 +226,23 @@ function formulaires_joindre_document_verifier_dist(
// si ce n'est pas deja un post de zip confirme // si ce n'est pas deja un post de zip confirme
// regarder si il faut lister le contenu du zip et le presenter // regarder si il faut lister le contenu du zip et le presenter
if (!count($erreurs) if (
and !_request('joindre_zip') !count($erreurs)
and $contenu_zip = joindre_verifier_zip($files) && !_request('joindre_zip')
&& ($contenu_zip = joindre_verifier_zip($files))
) { ) {
list($fichiers, $erreurs, $tmp_zip) = $contenu_zip; [$fichiers, $erreurs, $tmp_zip] = $contenu_zip;
if ($fichiers) { if ($fichiers) {
// on passe le md5 du fichier uniquement, on le retrouvera dans zip_to_clean de la session // on passe le md5 du fichier uniquement, on le retrouvera dans zip_to_clean de la session
$token_zip = md5($tmp_zip); $token_zip = md5((string) $tmp_zip);
$erreurs['message_erreur'] = ''; $erreurs['message_erreur'] = '';
$erreurs['lister_contenu_archive'] = recuperer_fond( $erreurs['lister_contenu_archive'] = recuperer_fond(
'formulaires/inc-lister_archive_jointe', 'formulaires/inc-lister_archive_jointe',
array( [
'chemin_zip' => $token_zip, 'chemin_zip' => $token_zip,
'liste_fichiers_zip' => $fichiers, 'liste_fichiers_zip' => $fichiers,
'erreurs_fichier_zip' => $erreurs 'erreurs_fichier_zip' => $erreurs,
) ]
); );
} else { } else {
$erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier'); $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier');
...@@ -237,7 +251,7 @@ function formulaires_joindre_document_verifier_dist( ...@@ -237,7 +251,7 @@ function formulaires_joindre_document_verifier_dist(
} }
} }
if (count($erreurs) and defined('_TMP_DIR')) { if (count($erreurs) && defined('_TMP_DIR')) {
effacer_repertoire_temporaire(_TMP_DIR); effacer_repertoire_temporaire(_TMP_DIR);
} }
} }
...@@ -257,6 +271,7 @@ function formulaires_joindre_document_verifier_dist( ...@@ -257,6 +271,7 @@ function formulaires_joindre_document_verifier_dist(
* @param string $mode * @param string $mode
* Le mode du document (auto,choix,document,image,vignette...), par défaut auto * Le mode du document (auto,choix,document,image,vignette...), par défaut auto
* @param string $galerie * @param string $galerie
* Deprecated 4.0 (SPIP 4.1)
* Passer optionnellement une galerie jointe au form, plus utilise nativement, * Passer optionnellement une galerie jointe au form, plus utilise nativement,
* on prefere la mise a jour apres upload par ajaxReload('documents') * on prefere la mise a jour apres upload par ajaxReload('documents')
* @param bool|string $proposer_media * @param bool|string $proposer_media
...@@ -265,7 +280,7 @@ function formulaires_joindre_document_verifier_dist( ...@@ -265,7 +280,7 @@ function formulaires_joindre_document_verifier_dist(
* @param bool|string $proposer_ftp * @param bool|string $proposer_ftp
* Doit on afficher le ftp ? par défaut oui * Doit on afficher le ftp ? par défaut oui
* Valeurs possibles si string : false,'non','no'. * Valeurs possibles si string : false,'non','no'.
* @return array $res * @return array
* Le tableau renvoyé par les CVT avec le message et editable * Le tableau renvoyé par les CVT avec le message et editable
*/ */
function formulaires_joindre_document_traiter_dist( function formulaires_joindre_document_traiter_dist(
...@@ -277,24 +292,24 @@ function formulaires_joindre_document_traiter_dist( ...@@ -277,24 +292,24 @@ function formulaires_joindre_document_traiter_dist(
$proposer_media = true, $proposer_media = true,
$proposer_ftp = true $proposer_ftp = true
) { ) {
$res = array('editable' => true); $res = ['editable' => true];
$ancre = ''; $ancre = '';
// on joint un document deja dans le site // on joint un document deja dans le site
if (_request('joindre_mediatheque')) { if (_request('joindre_mediatheque')) {
$sel = array(); $sel = [];
$refdoc_joindre = _request('refdoc_joindre'); $refdoc_joindre = _request('refdoc_joindre');
$refdoc_joindre = strtr($refdoc_joindre, ';,', ' '); $refdoc_joindre = strtr($refdoc_joindre, ';,', ' ');
$refdoc_joindre = preg_replace(',\b(doc|document|img),', '', $refdoc_joindre); $refdoc_joindre = preg_replace(',\b(doc|document|img),', '', $refdoc_joindre);
// expliciter les intervales xxx-yyy // expliciter les intervales xxx-yyy
while (preg_match(",\b(\d+)-(\d+)\b,", $refdoc_joindre, $m)) { while (preg_match(",\b(\d+)-(\d+)\b,", (string) $refdoc_joindre, $m)) {
$refdoc_joindre = str_replace($m[0], implode(' ', range($m[1], $m[2])), $refdoc_joindre); $refdoc_joindre = str_replace($m[0], implode(' ', range($m[1], $m[2])), $refdoc_joindre);
} }
$refdoc_joindre = explode(' ', $refdoc_joindre); $refdoc_joindre = explode(' ', (string) $refdoc_joindre);
include_spip('action/editer_document'); include_spip('action/editer_document');
foreach ($refdoc_joindre as $j) { foreach ($refdoc_joindre as $j) {
if ($j = intval(preg_replace(',^(doc|document|img),', '', $j))) { if ($j = intval(preg_replace(',^(doc|document|img),', '', $j))) {
// lier le parent en plus // lier le parent en plus
$champs = array('ajout_parents' => array("$objet|$id_objet")); $champs = ['ajout_parents' => ["$objet|$id_objet"]];
document_modifier($j, $champs); document_modifier($j, $champs);
if (!$ancre) { if (!$ancre) {
$ancre = $j; $ancre = $j;
...@@ -329,14 +344,14 @@ function formulaires_joindre_document_traiter_dist( ...@@ -329,14 +344,14 @@ function formulaires_joindre_document_traiter_dist(
} }
// checker les erreurs eventuelles // checker les erreurs eventuelles
$messages_erreur = array(); $messages_erreur = [];
$sel = array(); $sel = [];
foreach ($nouveaux_doc as $doc) { foreach ($nouveaux_doc as $doc) {
if (!is_numeric($doc)) { if (!is_numeric($doc)) {
$messages_erreur[] = $doc; $messages_erreur[] = $doc;
} // cas qui devrait etre traite en amont } // cas qui devrait etre traite en amont
elseif (!$doc) { elseif (!$doc) {
$messages_erreur[] = _T('medias:erreur_insertion_document_base', array('fichier' => '<em>???</em>')); $messages_erreur[] = _T('medias:erreur_insertion_document_base', ['fichier' => '<em>???</em>']);
} else { } else {
if (!$ancre) { if (!$ancre) {
$ancre = $doc; $ancre = $doc;
...@@ -358,7 +373,7 @@ function formulaires_joindre_document_traiter_dist( ...@@ -358,7 +373,7 @@ function formulaires_joindre_document_traiter_dist(
$res['redirect'] = "#doc$ancre"; $res['redirect'] = "#doc$ancre";
} }
} }
if (count($sel) or isset($res['message_ok'])) { if (count($sel) || isset($res['message_ok'])) {
$callback = ''; $callback = '';
if ($ancre) { if ($ancre) {
$callback .= "jQuery('#doc$ancre a.editbox').eq(0).focus();"; $callback .= "jQuery('#doc$ancre a.editbox').eq(0).focus();";
...@@ -389,21 +404,21 @@ function formulaires_joindre_document_traiter_dist( ...@@ -389,21 +404,21 @@ function formulaires_joindre_document_traiter_dist(
* Le répertoire de recherche des documents * Le répertoire de recherche des documents
* @param string $mode * @param string $mode
* Le mode d'ajout de document * Le mode d'ajout de document
* @return string $texte * @return string
* Le contenu HTML du selecteur de documents * Le contenu HTML du selecteur de documents
*/ */
function joindre_options_upload_ftp($dir, $mode = 'document') { function joindre_options_upload_ftp($dir, $mode = 'document') {
$fichiers = preg_files($dir); $fichiers = preg_files($dir);
$exts = $dirs = $texte_upload = array(); $exts = $dirs = $texte_upload = [];
// en mode "charger une image", ne proposer que les inclus // en mode "charger une image", ne proposer que les inclus
$inclus = ($mode == 'image' or $mode == 'vignette') $inclus = ($mode == 'image' || $mode == 'vignette')
? " AND inclus='image'" ? " AND inclus='image'"
: ''; : '';
foreach ($fichiers as $f) { foreach ($fichiers as $f) {
$f = preg_replace(",^$dir,", '', $f); $f = preg_replace(",^$dir,", '', $f);
if (preg_match(',\.([^.]+)$,', $f, $match)) { if (preg_match(',\.([^.]+)$,', (string) $f, $match)) {
$ext = strtolower($match[1]); $ext = strtolower($match[1]);
if (!isset($exts[$ext])) { if (!isset($exts[$ext])) {
include_spip('action/ajouter_documents'); include_spip('action/ajouter_documents');
...@@ -415,17 +430,17 @@ function joindre_options_upload_ftp($dir, $mode = 'document') { ...@@ -415,17 +430,17 @@ function joindre_options_upload_ftp($dir, $mode = 'document') {
} }
} }
$k = 2 * substr_count($f, '/'); $k = 2 * substr_count((string) $f, '/');
$n = strrpos($f, '/'); $n = strrpos((string) $f, '/');
if ($n === false) { if ($n === false) {
$lefichier = $f; $lefichier = $f;
} else { } else {
$lefichier = substr($f, $n + 1, strlen($f)); $lefichier = substr((string) $f, $n + 1, strlen((string) $f));
$ledossier = substr($f, 0, $n); $ledossier = substr((string) $f, 0, $n);
if (!in_array($ledossier, $dirs)) { if (!in_array($ledossier, $dirs)) {
$texte_upload[] = "\n<option value=\"$ledossier\">" $texte_upload[] = "\n<option value=\"$ledossier/\">"
. str_repeat('&nbsp;', $k) . str_repeat('&nbsp;', $k)
. _T('medias:tout_dossier_upload', array('upload' => $ledossier)) . _T('medias:tout_dossier_upload', ['upload' => $ledossier])
. '</option>'; . '</option>';
$dirs[] = $ledossier; $dirs[] = $ledossier;
} }
...@@ -450,13 +465,12 @@ function joindre_options_upload_ftp($dir, $mode = 'document') { ...@@ -450,13 +465,12 @@ function joindre_options_upload_ftp($dir, $mode = 'document') {
return $texte; return $texte;
} }
/** /**
* Lister les fichiers contenus dans un zip * Lister les fichiers contenus dans un zip
* *
* @param array $files * @param array $files
* La liste des fichiers * La liste des fichiers
* @return string $res * @return string
* La liste HTML des fichiers <li>...</li> * La liste HTML des fichiers <li>...</li>
*/ */
function joindre_liste_contenu_tailles_archive($files) { function joindre_liste_contenu_tailles_archive($files) {
...@@ -481,7 +495,7 @@ function joindre_liste_contenu_tailles_archive($files) { ...@@ -481,7 +495,7 @@ function joindre_liste_contenu_tailles_archive($files) {
* *
* @param array $erreurs * @param array $erreurs
* La liste des erreurs * La liste des erreurs
* @return string $res * @return string
* Le code HTML des erreurs * Le code HTML des erreurs
*/ */
function joindre_liste_erreurs_to_li($erreurs) { function joindre_liste_erreurs_to_li($erreurs) {
...@@ -496,7 +510,7 @@ function joindre_liste_erreurs_to_li($erreurs) { ...@@ -496,7 +510,7 @@ function joindre_liste_erreurs_to_li($erreurs) {
if (count($erreurs) > 4) { if (count($erreurs) > 4) {
$res = "<p style='cursor:pointer;' onclick='jQuery(this).siblings(\"ul\").toggle();return false;'>" . _T( $res = "<p style='cursor:pointer;' onclick='jQuery(this).siblings(\"ul\").toggle();return false;'>" . _T(
'medias:erreurs_voir', 'medias:erreurs_voir',
array('nb' => count($erreurs)) ['nb' => count($erreurs)]
) . '</p><ul class="spip none-js">' . $res . '</ul>'; ) . '</p><ul class="spip none-js">' . $res . '</ul>';
} else { } else {
$res = "<ul class=\"spip\">$res</ul>"; $res = "<ul class=\"spip\">$res</ul>";
......
<div class="editer-groupe"> <div class="editer-groupe">
<div class='editer editer_url[ (#ENV**{erreurs}|table_valeur{url}|oui)erreur]'> <div class='editer editer_url[ (#ENV*{erreurs/url}|oui)erreur]'>
<label for='url#ENV{domid}'><:medias:info_referencer_doc_distant:></label>[ <label for='url#ENV{domid}'><:medias:info_referencer_doc_distant:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{url})</span> <span class='erreur_message'>(#ENV*{erreurs/url})</span>
]<input class='text' placeholder="http://" type="text" name="url" value='#ENV{url}' id="url#ENV{domid}"/> ]<input class='text' placeholder="https://" type="text" name="url" value='#ENV{url}' id="url#ENV{domid}"/>
<!--editer_url--> <!--editer_url-->
</div> </div>
</div> </div>
<div class="editer-groupe"> <div class="editer-groupe">
[<div class='editer editer_cheminftp[ (#ENV**{erreurs}|table_valeur{cheminftp}|oui)erreur]'> [<div class='editer editer_cheminftp[ (#ENV*{erreurs/cheminftp}|oui)erreur]'>
<label for='cheminftp#ENV{domid}'>[(#VAL{info_selectionner_fichier}|_T{#ARRAY{upload,#ENV*{_dir_upload_ftp}}})]</label>[ <label for='cheminftp#ENV{domid}'>[(#VAL{info_selectionner_fichier}|_T{#ARRAY{upload,#ENV*{_dir_upload_ftp}}})]</label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{cheminftp})</span> <span class='erreur_message'>(#ENV*{erreurs/cheminftp})</span>
]<select name='cheminftp' id='cheminftp#ENV{domid}' size='1'> ]<select name='cheminftp' id='cheminftp#ENV{domid}' size='1'>
<option value=''>&gt;&gt;</option> <option value=''>&gt;&gt;</option>
(#ENV*{_options_upload_ftp}) (#ENV*{_options_upload_ftp})
......
<div class="editer-groupe"> <div class="editer-groupe">
<div class='editer editer_refdoc_joindre[ (#ENV**{erreurs}|table_valeur{refdoc_joindre}|oui)erreur]'> <div class='editer editer_refdoc_joindre[ (#ENV*{erreurs/refdoc_joindre}|oui)erreur]'>
<label for='refdoc_joindre#ENV{domid}'><:medias:label_refdoc_joindre:></label>[ <label for='refdoc_joindre#ENV{domid}'><:medias:label_refdoc_joindre:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{refdoc_joindre})</span> <span class='erreur_message'>(#ENV*{erreurs/refdoc_joindre})</span>
]<input class='text' type="text" name="refdoc_joindre" value='#ENV{refdoc_joindre}' id="refdoc_joindre#ENV{domid}"/> ]<input class='text' type="text" name="refdoc_joindre" value='#ENV{refdoc_joindre}' id="refdoc_joindre#ENV{domid}"/>
<input class='btn submit' type="button" name="parcourir" value="<:medias:bouton_parcourir:>" <input class='btn submit' type="button" name="parcourir" value="<:medias:bouton_parcourir:>"
onclick="jQuery.modalboxload('#URL_ECRIRE{popin-choisir_document,var_zajax=contenu&selectfunc=mediaselect#ENV{domid}}',{autoResize: true});" onclick="jQuery.modalboxload('#URL_ECRIRE{popin-choisir_document,var_zajax=contenu&selectfunc=mediaselect#ENV{domid}}',{autoResize: true});"
...@@ -9,6 +9,6 @@ ...@@ -9,6 +9,6 @@
<!--editer_refdoc_joindre--> <!--editer_refdoc_joindre-->
</div> </div>
</div> </div>
<script type="text/javascript">/*<!\[CDATA\[*/ <script>
function mediaselect#ENV{domid}(id){jQuery.modalboxclose();jQuery("#refdoc_joindre#ENV{domid}").attr('value','doc'+id).focus();jQuery('#joindre_mediatheque#ENV{domid}>.boutons input').get(0).click();} function mediaselect#ENV{domid}(id){jQuery.modalboxclose();jQuery("#refdoc_joindre#ENV{domid}").attr('value','doc'+id).focus();jQuery('#joindre_mediatheque#ENV{domid}>.boutons input').get(0).click();}
/*\]\]>*/</script> </script>
\ No newline at end of file \ No newline at end of file
<div class="editer-groupe"> <div class="editer-groupe">
<div class='editer editer_fichier_upload[ (#ENV**{erreurs}|table_valeur{fichier_upload}|oui)erreur]'> <div class='editer editer_fichier_upload[ (#ENV*{erreurs/fichier_upload}|oui)erreur]'>
<label for='fichier_upload#ENV{domid}'><:bouton_upload:></label>[ <label for='fichier_upload#ENV{domid}'><:bouton_upload:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{fichier_upload})</span> <span class='erreur_message'>(#ENV*{erreurs/fichier_upload})</span>
]<input class='file[(#ENV{multi}|=={non}|non) multi]' type="file" name="fichier_upload[]" value='[(#ENV{fichier_upload}|is_array|?{'', #ENV{fichier_upload}})]' id="fichier_upload#ENV{domid}" size='11' /> ]<input class='file[(#ENV{multi}|=={non}|non) multi]' type="file" name="fichier_upload[]" value='[(#ENV{fichier_upload}|is_array|?{'', #ENV{fichier_upload}})]' id="fichier_upload#ENV{domid}" size='11' />
<!--editer_fichier_upload--> <!--editer_fichier_upload-->
</div> </div>
......