probleme d'affichage d'un fichier

probleme d'affichage d'un fichier

par malika younes,
Nombre de réponses : 1

bonjour

lors de creation d'un instance de mon module ,il ya un fichier descriptif telechargé par l'enseignant .

mon but est d'affichier ce fichier sur la page view.php à coté du nom de l'instance du module donc pour ca j'ai fais les etapes suivants:

1. dans mod_form.php

apres la definition du class

 $mform->addElement('filemanager', 'files', null, null, $options);
     
   
   function data_preprocessing(&$default_values) {
 
    if ($this->current->instance) {
                // editing existing instance - copy existing files into draft area
                $draftitemid = file_get_submitted_draft_itemid('files');
           
                file_prepare_draft_area($draftitemid, $this->context->id, 'mod_memory', 'diplom', 0, array('subdirs'=>0, 'maxbytes' => $this->course->maxbytes, 'maxfiles' => 10));
            
                file_save_draft_area_files($draftitemid, $this->context->id,'mod_memory', 'diplom',0, array('subdirs'=>0, 'maxbytes' => $this->course->maxbytes, 'maxfiles' => 10));
                $fileinfo = file_get_draft_area_info($draftitemid);
            }
                       
                $default_values['files'] = $draftitemid;
                  
            }
           
          
          function validation($data, $files) {
              global $CFG;
          $errors=array();
              $errors = parent::validation($data,$files);
              return $errors;
          }
          
  //--------------dans lib.php-------------------------

function memory_pluginfile($course,
        $cm,
        $context,
        $filearea,
        $args,
        $forcedownload,
        array $options=array()) {
    
    
    global $DB, $CFG;
//-----------------------------------------------------------
    if ($context->contextlevel != CONTEXT_MODULE) {
       return false;
    }
//-----------------------------------------------------------

    require_login($course, true, $cm);
    
    if(!has_capability('mod/memory:view', $context)){
        return false;
    }
  //-----------------------------------------------------------   
    if($filearea!=='diplom'){
        return false;}
    //--------------------------------------------------------------    
        
    //removed the first element from array and return the value of element removed
    // $args extra arguments (itemid, path)
        $smid = (int) array_shift($args);
        
    //--------------------------File------------------------------------    
 
   $relativepath = implode('/', $args);//$URL=$CFG->wwwroot/pluginfile.php/$forumcontextid/mod_forum/post/$postid/image.jpg
    
   $fullpath = "/{$context->id}/mod_memory/$filearea/$swid/$relativepath";
  //--------------------------------------------------------------------------------------
    
   $fs = get_file_storage();
    
    if (!($file = $fs->get_file_by_hash(sha1($fullpath))) || $file->is_directory()) {
        return false; // return file  dans files tables si on donne la fullpath
    }

   //--------------------------------------------------------------------------------
            
 
    send_stored_file($file, 0, 0, true);
}
//-dans view.php-----------------------------//

$fs=get_file_storage();
$files=$fs->get_area_files($context->id, 'mod_memory','diplom');

foreach($files as $file){
    $file=$fs->get_filename();
    $url = $CFG->wwwroot.'/pluginfile.php/$context->id/mod_memory/diplom';
            $path = $url.$file->get_filepath().$file->get_itemid().'/'.$filename;
echo html_writer::link($path, $filename);

 

le probleme j'arrive pas à afficher le fichier pourquoi?

est ce qu'il ya quelque chose qui m'echappe,je lis bcp sur le file API  mais je trouve pas la reponse

merci pour votre aide

Moyenne des évaluations  -
En réponse à malika younes

Re: probleme d'affichage d'un fichier

par Valery Fremaux,
Avatar Développeurs de plugins

Il y a de l'idée dans ce que tu as fait :

memory_pluginfile() :

  $relativepath = implode('/', $args);//$URL=$CFG->wwwroot/pluginfile.php/$forumcontextid/mod_forum/post/$postid/image.jpg

???

un oubli d'adaptation ?

Formulaire :

data_preprocessing() : pas le plus judicieux dans ce cas

on travaille plutot dans une surcharge de set_data($defaults), pour en effet charger la zone tampon avec un éventuel fichiers déjà stocké, ou alors avec un tout nouvel id de file manager :

function set_data($defaults) {
 
        if ($this->current->instance) {
            // editing existing instance - copy existing files into draft area
            $draftitemid = file_get_submitted_draft_itemid('files');           
            file_prepare_draft_area($draftitemid, $this->context->id, 'mod_memory', 'diplom', 0, array('subdirs'=>0, 'maxbytes' => $this->course->maxbytes, 'maxfiles' => 10));            
            $defaults->files = $draftitmeid
        } 
parent::set_data($defaults); // très important pour l'initialisation des autres données.              
  }

Cela doit en principe suffire à transporter une éventuelle référence de fichier déjà stockée dans le module dans la zone tampon.

Il manque le moment de récupération de la zone tampon lors de la réception des fichiers et des données formulaire :

if ($data = $memoryform->get_data()){
   ...
       $filemanageritemid = required_param('files', PARAM_INT);

     file_save_draft_area_files($filemanageritemid, $context->id, 'mod_memory', 'diplom', 0);
   ...
}

et non pas dans data_preprocessing()