【问题标题】:Joomla Development File HandlingJoomla 开发文件处理
【发布时间】:2012-05-30 08:28:28
【问题描述】:

我正在按照 hello world 教程为 joomla 制作一个简单的 MVC 组件,其中包含一些文本字段和一个图像。

文本字段保存但“文件”字段不保存,有什么想法吗?

**Controller:**
    <?php
    // No direct access to this file
    defined('_JEXEC') or die('Restricted access');

    // import Joomla controllerform library
    jimport('joomla.application.component.controllerform');

    /**
     * MJob Controller
     */
    class MJobsControllerMJob extends JControllerForm
    {
    }

**Model:**

    <?php
    // No direct access to this file
    defined('_JEXEC') or die('Restricted access');

    // import Joomla modelform library
    jimport('joomla.application.component.modeladmin');

    class MJobsModelMJob extends JModelAdmin
    {
        public function getTable($type = 'MJob', $prefix = 'MJobsTable', $config = array()) 
        {
            return JTable::getInstance($type, $prefix, $config);
        }

        public function getForm($data = array(), $loadData = true) 
        {
            // Get the form.
            $form = $this->loadForm('com_mjobs.mjob', 'mjob', array('control' => 'jform', 'load_data' => $loadData));

            if (empty($form)) 
            {
                return false;
            }
            return $form;
        }

        protected function loadFormData() 
        {
            // Check the session for previously entered form data.
            $data = JFactory::getApplication()->getUserState('com_mjobs.edit.mjob.data', array());
            if (empty($data)) 
            {
                $data = $this->getItem();
            }
            return $data;
        }
    }

**view.html.php:**

    <?php
    // No direct access to this file
    defined('_JEXEC') or die('Restricted access');

    // import Joomla view library
    jimport('joomla.application.component.view');

    class MJobsViewMJob extends JView
    {

        public function display($tpl = null) 
        {
            // get the Data
            $form = $this->get('Form');
            $item = $this->get('Item');

            // Check for errors.
            if (count($errors = $this->get('Errors'))) 
            {
                JError::raiseError(500, implode('<br />', $errors));
                return false;
            }
            // Assign the Data
            $this->form = $form;
            $this->item = $item;

            // Set the toolbar
            $this->addToolBar();

            // Display the template
            parent::display($tpl);
        }

        protected function addToolBar() 
        {
            JRequest::setVar('hidemainmenu', true);
            $isNew = ($this->item->id == 0);
            JToolBarHelper::title($isNew ? JText::_('COM_MJOBS_MANAGER_MJOB_NEW') : JText::_('COM_MJOBS_MANAGER_MJOB_EDIT'));
            JToolBarHelper::apply('mjob.apply');
            JToolBarHelper::save('mjob.save');
            JToolBarHelper::save2new('mjob.save2new');
            JToolBarHelper::cancel('mjob.cancel', $isNew ? 'JTOOLBAR_CANCEL' : 'JTOOLBAR_CLOSE');
        }
    }

**VIEW (tmpl/edit.php):**
<?php
// No direct access
defined('_JEXEC') or die('Restricted access');
JHtml::_('behavior.tooltip');
echo "<b>MJOB EDIT START</b><br>";
?>
<form action="<?php echo JRoute::_('index.php?option=com_mjobs&layout=edit&id='.(int) $this->item->id); ?>"
      method="post" enctype="multipart/form-data" name="adminForm" id="mjob-form">
    <fieldset class="adminform">
        <legend><?php echo JText::_( 'COM_MJOBS_MJOB_DETAILS' ); ?></legend>
        <ul class="adminformlist">
            <?php foreach($this->form->getFieldset('details') as $field): ?>
                <li><?php echo $field->label;echo $field->input;?></li>
            <?php endforeach; ?>
        </ul>
    </fieldset>
    <div>
        <input type="hidden" name="task" value="mjob.edit" />
        <?php echo JHtml::_('form.token'); ?>
    </div>
</form>

【问题讨论】:

  • 如果您不提供任何代码,将无济于事。可能有多种原因。
  • Ho Lodder,它是一个完整的扩展,所以我不确定要发布什么代码,我正在看这篇文章:stackoverflow.com/questions/5415450/… 但我不知道该脚本应该去哪里,该模型?控制器?等等。

标签: php model-view-controller file-upload joomla file-handling


【解决方案1】:

我猜你正在使用 Joomla! 2.5 基于提供的代码。

因此,要检索已上传的文件,您需要执行以下操作:

$jFileInput = new JInput($_FILES);
$theFile = $jFileInput->get('jform',array(),'array');


// If there is no uploaded file, we have a problem...
if (!is_array($theFile)) {
    JError::raiseWarning('', 'No file was selected.');
    return false;
}

// Build the paths for our file to move to the components 'upload' directory
$theFileName = $theFile['name']['tablefile'];
$tmp_src    = $theFile['tmp_name']['tablefile'];
$tmp_dest   = JPATH_COMPONENT_ADMINISTRATOR . '/uploads/' . $theFileName;
$this->dataFile = $theFileName;

// Move uploaded file
jimport('joomla.filesystem.file');
$uploaded = JFile::upload($tmp_src, $tmp_dest);
// $uploaded contains boolean indicating success or failure
// $tmp_dest will contain final location of file if successful.

【讨论】:

  • 我应该把这个放在哪里?我可以让 PHP 代码工作,但我不知道把它放在 Joomla 的什么地方。这是否在模型/控制器/等中?
  • 通常与 Joomla! 的 MVC 保持一致,它将进入模型的 prepareTable() 或可能的表的 bind()。这取决于您对正在上传的文件执行的操作。
  • 如何在不覆盖原始函数的情况下将其放入这些函数中,我尝试使用 save() 做类似的事情,但它放弃了它应该做的事情,只做我告诉它的事情。有没有办法扩展默认功能?
  • 你可以通过parent::somefunc()调用类版本的函数
  • 打开一个新问题,包含错误详细信息和相关代码,以便我们正确回答,例如查看 Joomla 的代码!是最好的资源。
【解决方案2】:

还要确保在您的 html 表单中拥有

enctype="multipart/form-data"

启用,否则您将不会收到任何 php 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 2016-12-17
    • 2012-08-15
    • 2012-07-29
    • 2014-10-17
    • 2011-07-11
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多