Загрузка файла Joomla 3.0 MVC в серверную часть пользовательского компонента

РЕШЕНИЕ: Как сохранить имя загруженного файла в базе данных

это помогло мне.

я пытаюсь добавить загрузку файла в пользовательский компонент, используя XML и базу данных.

Я знаю, как выполнить загрузку файлов в статической среде PHP, но мои знания о структуре PHP MVC в joomla делают это, поэтому я не могу его добавить.

Что я сделал до сих пор:

• Добавлено поле в файл XML (типа файла)
• Добавлены поля формы в административном представлении проекта
• Добавлено дополнительное поле My_project table (такое же, как столбец загрузки изображения)

До этого момента он работает (поля отображаются в компоненте бэкэнда администратора)

Теперь, когда вы сохраняете документ с файлом, загруженным в админку, он не сохраняет его в базе данных.

если я поставлю медиа в качестве типа поля, то он работает, но когда я изменяю его на файл, он ломается.

XML-файл

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

  <field name="project_file" type="file"

            label="Upload file"
            description="Upload file"  
            directory="mysites" /> 


       <field name="main_image" type="media"

            label="COM_MYSITES_FORM_LBL_PROJECT_MAIN_IMAGE"
            description="COM_MYSITES_FORM_DESC_PROJECT_MAIN_IMAGE" 
            filter="raw"
            directory="mysites" /> 

 </fieldset>

Сценарий загрузки файла PHP, который я обычно использую

<?php
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);

if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

но какая часть идет в модель и какая часть идет в контроллер? и как это назвать.

весь вид вызывается в контроллере

class MysitesControllerProject extends JControllerForm {

    function __construct() {
        $this->view_list = 'projects';
        $jinput = JFactory::getApplication()->input;
        $files = $jinput->files->get('jform');
        $file = $files['project_file']; 
        $this->upload($file);
        parent::__construct();
    }

    public function upload($files)
    {
        $file_name = $files['name'];
        $src = $files['tmp_name'];
        $size = $files['size'];
        $upload_error = $files['error'];
        $type = $files['type'];
        $dest = "/home/vol3/byethost33.com/b33_13467508/bim-portfolio.cu.cc/htdocs/tmp";

        if (isset( $file_name)) {
            // Move the uploaded file.
            JFile::upload( $src, $filepath );
        }
    }

}

person user2617187    schedule 25.07.2013    source источник


Ответы (1)


Размещение нового поля в базе данных и XML-форме — это только половина работы. Вы также должны написать функцию сохранения/загрузки файлов. Есть два места, где вы можете это сделать. В контроллере (например, сохранить процедуру задачи) или модели (есть 2-3 функции, где это можно сделать). Посмотрите в этот файл /administrator/components/com_media/controllers/upload.php (процедура загрузки). Я бы просто расширил вашу функцию save, чтобы перед сохранением данных в файл базы данных они сохранялись в файловой системе. Вы можете найти оригинальное объявление функции сохранения в /libraries/legacy/controller/legacy.php (для Joomla 3.0.1, для других версий это не должно быть сложно найти)

Вот пример функции сохранения:

public function save($key = null, $urlVar = null){
    // youre file upload code

    return parent::save($key = null, $urlVar = null)
}
person Artur Stępień    schedule 12.08.2013
comment
я проверил медиа-файл com и нашел код контроллера, показанный выше (отредактированный основной пост). однако теперь он выдает предупреждение JFolder::create: обнаружен бесконечный цикл Предупреждение: не удалось переместить файл! --- и мой tmp/log и глобальная конфигурация доступны для записи. и изменение переменной $dest тоже не работает - person user2617187; 13.08.2013
comment
Я думаю, вам нужно сделать 2 вещи. Во-первых, вернитесь к изучению php, потому что у вас есть функцияt even declared $filepath. Then you pass string variable into upload`, и вы пытаетесь использовать ее как массив. Вторая проблема заключается в том, что вы не должны запускать задачи в конструкции. Я посоветовал вам переопределить функцию сохранения, чтобы перед сохранением данных в базе данных вы перемещали файл. Я думаю, что вам нужно больше узнать об объектно-ориентированном программировании на PHP. Настоятельно рекомендуется, прежде чем пытаться модифицировать систему или создавать расширения для Joomla, иначе вы застрянете практически на каждом, даже самом простом коде. - person Artur Stępień; 13.08.2013
comment
причина, по которой я поставил эту конструкцию, заключается в том, что я не могу вызывать методы в модели. обычно в С# я могу просто сделать CLass variable = new Class(); и тогда вы можете сделать varible.calltoMethod(), но Class::calltoMethod в php, похоже, не работает. и я знаю, что в joomla этот конкретный контроллер называется, поэтому я сделал ссылку, чтобы проверить. - person user2617187; 15.08.2013
comment
Вот почему я посоветовал вам больше узнать об объектно-ориентированном программировании на PHP. Если вы уже владеете C++, то на его освоение уйдет максимум 3-4 дня. Я разместил пример функции сохранения выше и отметил, где вы должны добавить код загрузки файла. - person Artur Stępień; 16.08.2013
comment
спасибо за вашу помощь: в ссылке я нашел еще один пост для дополнительной помощи по теме сохранения: stackoverflow.com/questions/16280955/ - person user2617187; 20.08.2013