2014-12-18 7 views
1

Я хочу загрузить pdf-файл из пользовательского компонента из бэкэнд в режиме редактирования. состояние находится сейчас, 1.- либо файл загружен правильно, но имя файла не записано в базе данных, 2.- или имя файла записано в базе данных, но файл PDF не рассматривается JFactory :: getApplication() -> вход;Joomla 3.3 MVC файл/pdf-загрузка в пользовательском компоненте backend

Я узнал, что имеет с enctype = "multipart/form-data". В случае ввода 1.- enctype = "multipart/form-data" и загружается pdf в случае 2.- имя файла pdf записывается в базу данных. Что делать? Мне нужны оба, конечно.

Вот так код, это небольшой компонент com_job с структурой MVC под Joomla! 3,3:

здесь только часть файла администратор/компоненты/com_job/просмотров/TMPL/edit.php с ENCTYPE = "многочастного/форма-данные"

<form method="post" action="<?php echo JRoute::_('index.php?option=com_job&layout=edit&id='.(int) $this->item->id); ?>" id="adminForm" name="adminForm" enctype="multipart/form-data"> 

     <fieldset class="adminform"> 
     <legend><?php echo JText::_('Details'); ?></legend> 

      <div class="control-group"> 
       <div class="control-label">     
        <?php echo $this->form->getLabel('title'); ?> 
       </div> 

       <div class="controls"> 
        <?php echo $this->form->getInput('title'); ?> 
       </div> 
      </div>  

      .... 
      <div class="control-group"> 
       <div class="control-label">     
        <?php echo $this->form->getLabel('upload_pdf'); ?> 
       </div> 

       <div class="controls"> 
        <?php echo $this->form->getInput('upload_pdf'); ?> 
       </div> 
      </div> 
      ........ 

здесь часть файла XML администратор/компоненты/com_job/модели/формы/job.xml

<?xml version="1.0" encoding="utf-8"?> 

...    

    <field 
     id="title" 
     name="title" 
     type="text" 
     required="true" 
     label="Title" 
     description="title_Desc" 
     class="inputbox" 
     size="40"/>      

    <field 
     id="upload_pdf" 
     name="upload_pdf" 
     type="file" 
     required="false" 
     label="Upload_pdf" 
     description="upload_pdf_Desc" 
     class="inputbox" 
     size="40" 
     accept="application/pdf"/> 

    ..... 

здесь администратор контроллера/компоненты/com_job/Контроллеры/job.php

jimport('joomla.application.component.controlleradmin'); 
jimport('joomla.application.component.controllerform'); 
jimport('joomla.filesystem.file'); 
jimport('joomla.filesystem.folder'); 

class JobControllerJob extends JControllerForm 
{ 
    public function save() 
    { 
     $jinput = JFactory::getApplication()->input; 
     $files = $jinput->files->get('jform', null); 

     $files['upload_pdf']['name'] = JFile::makeSafe($files['upload_pdf']['name']); 

     if (!empty($files['upload_pdf']['name'])) { 

      $pdf_path = JPATH_ROOT . '/images/upload_pdf'; 
      if (!JFolder::exists($pdf_path)) { 
       $status = JFolder::create($pdf_path); 
       if (!$status) { 
        JError::raiseWarning(100, JText::_('could not create directory pdf'), ''); 
       } 
      } 
      $file_path = JPath::clean($pdf_path . '/' . strtolower($files['upload_pdf']['name'])); 

      $status = JFile::upload($files['upload_pdf']['tmp_name'], $file_path); 
      if (!$status) { 
       JError::raiseWarning(100, JText::_('could not copy pdf'), ''); 
      } 
     } 
     return parent::save(); 
    } 
} 

где ошибка? Я попытался поместить enctype = "multipart/form-data" в форму в файле job.xml (models), но это не сработало.

Я нашел решение по времени, в функции сохранения в контроллере, добавить этот код:

  //$jform = $jinput->get(jform, null); 
      $pdf_filename = JFile::makeSafe($files['upload_pdf']['name']); 
      $jform = $_POST['jform']; 
      $tmp_pdf_filename = array('upload_pdf' => $pdf_filename); 
      $merged_jform = array_merge($jform,$tmp_pdf_filename); 
      $jinput->post->set('jform',$merged_jform); 

первая линия с $ jinput не работал. Я пробовал много способов с помощью $ jinput, но ничего не получилось. Поэтому, наконец, я использовал напрямую $ _POST. Конечно, это не правильный путь, но, по крайней мере, он работает.

здесь полная функция сохранения:

public function save() 
{ 
    $jinput = JFactory::getApplication()->input; 
    $files = $jinput->files->get('jform', null); 

    $pdf_filename = JFile::makeSafe($files['upload_pdf']['name']); 

    if (!empty($pdf_filename)) { 

     $pdf_path = JPATH_ROOT . '/images/upload_pdf'; 
     if (!JFolder::exists($pdf_path)) { 
      $status = JFolder::create($pdf_path); 
      if (!$status) { 
       JError::raiseWarning(100, JText::_('could not create directory pdf'), ''); 
      } 
     } 
     $file_path = JPath::clean($pdf_path . '/' . strtolower($files['upload_pdf']['name'])); 

     $status = JFile::upload($files['upload_pdf']['tmp_name'], $file_path); 
     if ($status) { 
      //$jform = $jinput->get(jform, null); 
      $jform = $_POST['jform']; 
      $tmp_pdf_filename = array('upload_pdf' => $pdf_filename); 
      $merged_jform = array_merge($jform,$tmp_pdf_filename); 
      $jinput->post->set('jform',$merged_jform); 
     } else { 
      JError::raiseWarning(100, JText::_('could not copy pdf'), ''); 
     } 
    } 
    return parent::save(); 
} 

ответ

0
$jinput = JFactory::getApplication()->input; 
$files = $jinput->files->get('jform'); 
$file = $files['upload_pdf']; 

Попробуйте это ... это истинный метод !!!

Это должно сделать трюк. Затем в массиве $ file хранятся следующие ключи:

error 
name 
size 
tmp_name 
type 
+0

Это должно сделать трюк. Затем в массиве $ file хранятся следующие ключи: ошибка имя размер tmp_name тип – user4592263

Смежные вопросы