web-dev-qa-db-fra.com

téléchargement de fichier dans le backend admin - composant personnalisé

Dans mon composant/admin personnalisé, dans le modèle de modification d'élément, j'essaie de laisser l'utilisateur télécharger un fichier.

Le problème est que le fichier n'est pas transmis dans ma fonction de sauvegarde. Il n'y a même pas dans le tableau comme clé. Si je supprime le enctype = "multipart/form-data" du formulaire (ce qui est faux car aucun fichier ne sera transmis), le champ contient alors le nom du fichier sous forme de chaîne.

[docfile] => my_file_to_upload.docx

mais avec le enctype = "multipart/form-data" alors, le résultat est:

2018-07-28T07:10:12+00:00       DEBUG 127.0.0.1 save_override_function_in_model Data $data : Array
(
    [id] => 2
    [title] => test
    [alias] => test-test
    [catid] => 0
    [client_id] => 240
    [published] => 0
    [created] => 2018-07-20 06:07:43
    [tags] => 
)

Voici le formulaire dans le fichier tmpl/edit.php

<form action="<?php echo JRoute::_('index.php?option=com_comtest&layout=edit&id=' . (int) $this->item->id); ?>" method="post"
      id="adminForm" enctype="multipart/form-data" class="form-validate">
  <div class="form-horizontal">
    <fieldset class="adminform">
      <?php echo JHtml::_('bootstrap.startPane', 'myTab', array('active' => 'details')); ?>
      <?php
      echo JHtml::_('bootstrap.addPanel', 'myTab', 'details', empty($this->item->id) ?
                      JText::_('COM_COMTEST_NEW_CONTRACT', true) :
                      JText::sprintf('COM_COMTEST_EDIT_CONTRACT', $this->item->id, true));
      ?>
      <div class="row-fluid">
        <?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>
      </div>
      <div class="row-fluid">
        <div class="span6">
          <?php echo $this->form->renderField('catid'); ?>
          <?php echo $this->form->renderField('client_id'); ?>
          <?php echo $this->form->renderField('published'); ?>
          <?php echo $this->form->renderField('created'); ?>
          <?php echo $this->form->renderField('docfile'); ?>
        </div>
      </div>
      <?php echo JHtml::_('bootstrap.endPanel'); ?>
      <input type="hidden" name="task" value="" />
      <?php echo JHtml::_('form.token'); ?>
      <?php echo JHtml::_('bootstrap.endPane'); ?>
    </fieldset>
  </div>
</form>

Le champ dans les modèles xml/forms/est:

<field name="docfile" type="file" label="Select File" description="Select a doc/docx file to upload" 
         size="40" accept=".doc, .docx" />

et voici la fonction saveiden dans le modèle

public function save($data = null, $key = null) {
    JRequest::checkToken() or die('Invalid Token');
    $file = JFactory::getApplication()->input->get('docfile');
    jimport('joomla.filesystem.folder');
    jimport('joomla.filesystem.file');

    JLog::add('Post $_POST : ' . print_r($_POST, TRUE), JLog::DEBUG, 'save_override_function_in_model');
    JLog::add('Data $data : ' . print_r($data, TRUE), JLog::DEBUG, 'save_override_function_in_model');
    JLog::add('File $file : ' . print_r($file, TRUE), JLog::DEBUG, 'save_override_function_in_model');

    return parent::save($data);
}

et theese sont les entrées de journal de la fonction de sauvegarde:

2018-07-28T07:18:04+00:00       DEBUG 127.0.0.1 save_override_function_in_model Post $_POST : Array
(
    [jform] => Array
        (
            [title] => test
            [alias] => test-test
            [catid] => 0
            [client_id] => 240
            [published] => 0
            [created] => 2018-07-20 06:07:43
        )

    [task] => testcom.apply
    [8c0a826f880ab2cd2842de2040510c6d] => 1
)

2018-07-28T07:18:04+00:00       DEBUG 127.0.0.1 save_override_function_in_model Data $data : Array
(
    [id] => 2
    [title] => test
    [alias] => test-test
    [catid] => 0
    [client_id] => 240
    [published] => 0
    [created] => 2018-07-20 06:07:43
    [tags] => 
)

2018-07-28T07:18:04+00:00       DEBUG 127.0.0.1 save_override_function_in_model File $file : Array
(
    [0] => 
)
1
mixahlos

J'ai trouvé le problème qui était la façon dont je obtenais le fichier dans le modèle. Alors j'ai juste changé la ligne suivante:

$file = JFactory::getApplication()->input->get('docfile');

avec

$file = JFactory::getApplication()->input->files->get('jform', null, 'raw');

Et de cette façon, je reçois un tableau avec tous les fichiers.

1
mixahlos