1

我想在编辑模式下从后端的自定义组件上传 pdf。现在的状态是,1.- pdf 正确上传但文件名未写入数据库,2.- 或文件名写入数据库,但 JFactory::getApplication 看不到 pdf ()->输入;

我发现有 enctype="multipart/form-data" 要做。在情况 1.- enctype="multipart/form-data" 中,并且在情况 2.- 中上传 pdf 时,将 pdf 文件名写入数据库中。该怎么做才知道?当然,我两者都需要。

这里so code,是Joomla下的一个MVC结构的com_job小组件!3.3:

这里只是部分文件 administrator/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文件administrator/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(模型)中的表单中,但它没有用。

我找到了一个临时解决方案,在控制器的保存功能中,我添加了以下代码:

            //$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();
}
4

1 回答 1

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

试试这个......这是真正的方法!

这应该够了吧。然后 $file 数组包含以下键:

error
name
size
tmp_name
type
于 2015-02-21T20:30:00.723 回答