Changeset 62557 in spip-zone


Ignore:
Timestamp:
Jun 14, 2012, 9:31:11 PM (7 years ago)
Author:
rastapopoulos@…
Message:

Code mieux qu'avant même si ça fait ne marche pas encore.

On passe par une fonction : formulaires_truc_fichiers() pour déclarer un tableau de noms de champs qui seront des fichiers.
return array('champ1', 'champ2');

Ensuite on ne passe que par des set_request() entre verifier(), le squelette, et traiter(). Le but étant de ne pas avoir à utiliser d'infos dans le HTML.

Pour l'instant là ça reconnait bien les champs fichiers simple ou multiple (name="fichiers[]") et quand un fichier est bien chargé mais qu'il y a une erreur dans un autre champ, alors ça remplace le champ file par la vignette + le nom de fichier.

Il manque la persistance des fichiers et de leurs infos quand on va revalider le formulaire.

Location:
_plugins_/cvt-upload
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/cvt-upload/cvtupload_pipelines.php

    r62470 r62557  
    44if (!defined("_ECRIRE_INC_VERSION")) return;
    55
     6function cvtupload_chercher_fichiers($form, $args){
     7        if ($fonction_fichiers = charger_fonction('fichiers', 'formulaires/'.$form, true)
     8                and $fichiers = call_user_func_array($fonction_fichiers, $args)
     9                and is_array($fichiers)
     10        ){
     11                return $fichiers;
     12        }
     13        else{
     14                return false;
     15        }
     16}
     17
     18function cvtupload_repertoire_tmp(){
     19        include_spip('inc/session');
     20        return session_get('hash_env').'_'._request('hash');
     21}
     22
    623function cvtupload_formulaire_charger($flux){
    7         $contexte =& $flux['data'];
    8        
    9         if ($contexte['_champs_fichiers'] and is_array($contexte['_champs_fichiers'])){
    10                 foreach ($contexte['_champs_fichiers'] as $champ){
    11                         $contexte['_hidden'] .= '<input type="hidden" name="_champs_fichiers[]" value="'.$champ.'" />';
    12                 }
     24        // S'il y a des champs fichiers de déclarés
     25        if ($champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])){
     26                $contexte =& $flux['data'];
    1327                // S'il n'y a pas déjà une action de configurée, on en force une pour avoir un hash unique par visiteur
    1428                if (!$contexte['_action'])
    15                         $contexte['_action'] = array('cvt_upload');
     29                        $contexte['_action'] = array('cvtupload', 'cvtupload');
    1630        }
    1731       
     
    2034
    2135function cvtupload_formulaire_verifier($flux){
    22         $erreurs =& $flux['data'];
    23        
    2436        // S'il y a des champs fichiers de déclarés
    25         if ($champs_fichiers = _request('_champs_fichiers') and is_array($champs_fichiers)){
     37        if ($champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])){
     38                $erreurs =& $flux['data'];
    2639                include_spip('inc/filtres');
    2740                include_spip('inc/documents');
    2841                include_spip('inc/getdocument');
    2942                include_spip('inc/charsets');
     43               
    3044                //Si le répertoire temporaire n'existe pas encore, il faut le créer.
    31                 $repertoire_tmp = _DIR_TMP.'cvt_upload/';
    32                 if (!is_dir($repertoire_tmp)) mkdir($repertoire_tmp);
    33                 $repertoire_tmp .= _request('hash').'/';
    34                 if (!is_dir($repertoire_tmp)) mkdir($repertoire_tmp);
     45                $repertoire_tmp = sous_repertoire(_DIR_TMP.'cvtupload/');
     46                $repertoire_tmp = sous_repertoire($repertoire_tmp, cvtupload_repertoire_tmp().'/');
    3547               
    3648                // On parcourt les champs déclarés comme étant des fichiers
    37                 $infos_fichiers = _request('_infos_fichiers');
     49                $infos_fichiers = _request('_infos_fichiers') ? _request('_infos_fichiers') : array();
    3850                foreach ($champs_fichiers as $champ){
    3951                        if ($_FILES[$champ]){
     
    4557                        }
    4658                }
    47                 if ($erreurs)
    48                         $erreurs = array_merge($erreurs, $infos_fichiers);
     59                set_request('_fichiers', $infos_fichiers);
    4960        }
    50         //var_dump($erreurs);
    5161       
    5262        return $flux;
    5363}
    5464
    55 function cvtupload_formulaire_traiter($flux){
    56         // On supprime tous les fichiers maintenant que les traitements sont faits
    57         if ($champs_fichiers = _request('_champs_fichiers') and is_array($champs_fichiers)){
    58                 $repertoire = _DIR_TMP.'cvt_upload/'._request('hash').'/';
    59                 if (is_dir($repertoire)){
    60                         $infos_fichiers = _request('_infos_fichiers');
    61                         foreach ($champs_fichiers as $champ){
    62                                 if ($infos_fichiers[$champ]['nom']){
    63                                         unlink($repertoire.$infos_fichiers[$champ]['nom']);
     65function cvtupload_formulaire_fond($flux){
     66        // Si ça a déjà été posté (après verifier()) et qu'il y a des champs fichiers déclarés
     67        if ($flux['args']['je_suis_poste']
     68                and $champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])
     69        ){
     70                $fichiers = _request('_fichiers');
     71                foreach ($champs_fichiers as $champ){
     72                        // Si le visiteur a bien réussi a charger un ou plusieurs fichiers dans ce champ
     73                        if (isset($fichiers[$champ])){
     74                                include_spip('inc/filtres_images');
     75                                // Si c'est un champ unique
     76                                if (isset($fichiers[$champ]['nom'])){
     77                                        $flux['data'] = preg_replace(
     78                                                "#<input[^>]*name=['\"]${champ}[^>]*>#i",
     79                                                image_reduire($fichiers[$champ]['vignette'],32).' '.$fichiers[$champ]['nom'],
     80                                                $flux['data']
     81                                        );
    6482                                }
    65                                 else foreach ($infos_fichiers[$champ] as $fichier){
    66                                         unlink($repertoire.$fichier['nom']);
     83                                // Sinon c'est un multiple
     84                                else{
     85                                        foreach($fichiers[$champ] as $cle=>$fichier){
     86                                                $flux['data'] = preg_replace(
     87                                                        "#<input[^>]*name=['\"]${champ}[^>]*>#i",
     88                                                        image_reduire($fichier['vignette'],32).' '.$fichier['nom'],
     89                                                        $flux['data'],
     90                                                        1 // seul le premier trouvé est remplacé
     91                                                );
     92                                        }
    6793                                }
    6894                        }
    69                         // On supprime le répertoire
    70                         rmdir($repertoire);
    7195                }
     96        }
     97        return $flux;
     98}
     99
     100function cvtupload_formulaire_traiter($flux){
     101        // S'il y a des champs fichiers de déclarés
     102        if ($champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])){
     103                // On supprime le répertoire unique comportant les fichiers du visiteur
     104                $repertoire = _DIR_TMP.'cvtupload/'.cvtupload_repertoire_tmp().'/';
     105                supprimer_repertoire($repertoire);
    72106        }
    73107       
     
    82116 */
    83117function cvtupload_deplacer_fichier($fichier, $repertoire){
     118        $vignette_par_defaut = charger_fonction('vignette', 'inc/');
    84119        $infos = array();
    85120        if (is_array($fichier['name'])){
     
    88123                        $nom = trim(preg_replace('/[\s]+/', '_', strtolower(translitteration($nom))));
    89124                        // Si le fichier a bien un nom et qu'il n'y a pas d'erreur associé à ce fichier
    90                         if (($nom != null) && ($fichier['error'][$cle] == 0)) {
     125                        if (($nom != null) and ($fichier['error'][$cle] == 0)) {
    91126                                //On vérifie qu'un fichier ne porte pas déjà le même nom, sinon on lui donne un nom aléatoire + nom original
    92127                                if (file_exists($repertoire.$nom))
     
    97132                                        // On en déduit l'extension et du coup la vignette
    98133                                        $infos[$cle]['extension'] = strtolower(preg_replace('/^.*\.([\w]+)$/i', '$1', $fichier['name'][$cle]));
    99                                         $infos[$cle]['vignette'] = vignette_par_defaut($infos[$cle]['extension'], false, true);
    100                                         //On récupère le tye MIME du fichier aussi
     134                                        $infos[$cle]['vignette'] = $vignette_par_defaut($infos[$cle]['extension'], false, true);
     135                                        //On récupère le type MIME du fichier aussi
    101136                                        $infos[$cle]['mime'] = $fichier['type'][$cle];
    102137                                }
     
    117152                                // On en déduit l'extension et du coup la vignette
    118153                                $infos['extension'] = strtolower(preg_replace('/^.*\.([\w]+)$/i', '$1', $fichier['name']));
    119                                 $infos['vignette'] = vignette_par_defaut($infos['extension'], false, true);
    120                                 //On récupère le tye MIME du fichier aussi
     154                                $infos['vignette'] = $vignette_par_defaut($infos['extension'], false, true);
     155                                //On récupère le type MIME du fichier aussi
    121156                                $infos['mime'] = $fichier['type'];
    122157                        }
  • _plugins_/cvt-upload/formulaires/test_upload.html

    r38028 r62557  
    2424                        <li class="editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    2525                                <label for="#GET{name}">Un fichier tout seul</label>
    26                                 [(#GET{erreurs}|non)
     26                                [<span class="erreur_message">(#GET{erreurs})</span>]
    2727                                <input type="file" class="file" name="#GET{name}" id="#GET{name}" size="40" />
    28                                 ]
    29                                 [(#GET{erreurs}|oui)
    30                                 [(#GET{erreurs}|table_valeur{vignette}|image_reduire{32})]
    31                                 [(#GET{erreurs}|table_valeur{nom})]
    32                                 <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;nom&#93;" value="[(#GET{erreurs}|table_valeur{nom})]" />
    33                                 <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;extension&#93;" value="[(#GET{erreurs}|table_valeur{extension})]" />
    34                                 <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;vignette&#93;" value="[(#GET{erreurs}|table_valeur{vignette})]" />
    35                                 <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;mime&#93;" value="[(#GET{erreurs}|table_valeur{mime})]" />
    36                                 ]
    3728                        </li>
    3829                       
     
    4233                        <li class="editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    4334                                <label>Plusieurs fichiers dans le même champ</label>
     35                                [<span class="erreur_message">(#GET{erreurs})</span>]
    4436                                <div class="choix">
    45                                         [(#GET{erreurs}|table_valeur{0}|non)
    4637                                        <input type="file" class="file" name="#GET{name}&#91;0&#93;" id="#GET{name}" size="40" />
    47                                         ]
    48                                         [(#GET{erreurs}|table_valeur{0}|oui)
    49                                         [(#GET{erreurs}|table_valeur{0}|table_valeur{vignette}|image_reduire{32})]
    50                                         [(#GET{erreurs}|table_valeur{0}|table_valeur{nom})]
    51                                         <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;0&#93;&#91;nom&#93;" value="[(#GET{erreurs}|table_valeur{0}|table_valeur{nom})]" />
    52                                         <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;0&#93;&#91;extension&#93;" value="[(#GET{erreurs}|table_valeur{0}|table_valeur{extension})]" />
    53                                         <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;0&#93;&#91;vignette&#93;" value="[(#GET{erreurs}|table_valeur{0}|table_valeur{vignette})]" />
    54                                         <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;0&#93;&#91;mime&#93;" value="[(#GET{erreurs}|table_valeur{0}|table_valeur{mime})]" />
    55                                         ]
    5638                                </div>
    5739                                <div class="choix">
    58                                         [(#GET{erreurs}|table_valeur{1}|non)
    5940                                        <input type="file" class="file" name="#GET{name}&#91;1&#93;" id="#GET{name}" size="40" />
    60                                         ]
    61                                         [(#GET{erreurs}|table_valeur{1}|oui)
    62                                         [(#GET{erreurs}|table_valeur{1}|table_valeur{vignette}|image_reduire{32})]
    63                                         [(#GET{erreurs}|table_valeur{1}|table_valeur{nom})]
    64                                         <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;1&#93;&#91;nom&#93;" value="[(#GET{erreurs}|table_valeur{1}|table_valeur{nom})]" />
    65                                         <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;1&#93;&#91;extension&#93;" value="[(#GET{erreurs}|table_valeur{1}|table_valeur{extension})]" />
    66                                         <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;1&#93;&#91;vignette&#93;" value="[(#GET{erreurs}|table_valeur{1}|table_valeur{vignette})]" />
    67                                         <input type="hidden" name="_infos_fichiers&#91;#GET{name}&#93;&#91;1&#93;&#91;mime&#93;" value="[(#GET{erreurs}|table_valeur{1}|table_valeur{mime})]" />
    68                                         ]
    6941                                </div>
    7042                        </li>
  • _plugins_/cvt-upload/formulaires/test_upload.php

    r38028 r62557  
    1212        );
    1313       
    14         $contexte['_champs_fichiers'] = array('seul', 'plusieurs');
    15        
    1614        return $contexte;
     15}
     16
     17function formulaires_test_upload_fichiers(){
     18        return array('seul', 'plusieurs');
    1719}
    1820
  • _plugins_/cvt-upload/paquet.xml

    r62469 r62557  
    1616        <pipeline nom="formulaire_charger" inclure="cvtupload_pipelines.php" />
    1717        <pipeline nom="formulaire_verifier" inclure="cvtupload_pipelines.php" />
     18        <pipeline nom="formulaire_fond" inclure="cvtupload_pipelines.php" />
    1819        <pipeline nom="formulaire_traiter" inclure="cvtupload_pipelines.php" />
     20       
     21        <utilise nom="saisies" />
    1922</paquet>
  • _plugins_/cvt-upload/plugin.xml

    r62469 r62557  
    1919        </pipeline>
    2020        <pipeline>
     21                <nom>formulaire_fond</nom>
     22                <inclure>cvtupload_pipelines.php</inclure>
     23        </pipeline>
     24        <pipeline>
    2125                <nom>formulaire_traiter</nom>
    2226                <inclure>cvtupload_pipelines.php</inclure>
Note: See TracChangeset for help on using the changeset viewer.