Joomla 3.3 MVC file/pdf загрузить в пользовательский компонент базы

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

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

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

здесь только администратор файла детали /components/com_job/views/tmpl/edit.php с enctype="multipart/form-data"

<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 файла /components/com_job/models/forms/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"/>

    .....

здесь администратор контроллера /components/com_job/controllers/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();
}

1 ответ

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

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

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

error
name
size
tmp_name
type
Другие вопросы по тегам