it-swarm.com.de

Datei-Upload im Admin-Backend - benutzerdefinierte Komponente

In meiner benutzerdefinierten Komponente/meinem benutzerdefinierten Administrator in der Elementbearbeitungsvorlage versuche ich, dem Benutzer das Hochladen einer Datei zu ermöglichen.

Das Problem ist, dass die Datei in meiner Speicherfunktion nicht übergeben wird. Es gibt nicht einmal im Array als Schlüssel. Wenn ich das enctype = "multipart/form-data" aus dem Formular entferne (was falsch ist, weil keine Datei übergeben wird), kommt das Feld mit dem Dateinamen als String.

[docfile] => my_file_to_upload.docx

aber mit dem enctype = "multipart/form-data" ergibt sich dann:

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] => 
)

Hier ist das Formular in der 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>

Das Feld in den XML-Modellen/Formularen/lautet:

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

und hier ist die überschriebene Speicherfunktion im Modell

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);
}

und dies sind die Protokolleinträge aus der Speicherfunktion:

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

Ich habe das Problem gefunden, wie ich die Datei in das Modell bekommen habe. Also habe ich gerade die folgende Zeile geändert:

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

mit

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

Und so bekomme ich ein Array mit allen Dateien.

1
mixahlos