Отправка файла с заказом

Как реализовать отправку файла с заказом в minishop2?
Я попробовал тип одного из input'ов в заказе изменить на файл, добавил форме enctype, но после выбора файла в assets/components/minishop2/action.php массив S_FILES пуст. При отправке заказа тоже.
Подскажите, хотя бы, в каком направлении читать мануалы.
Виктор
11 апреля 2016, 13:22
modx.pro
6
3 937
+1

Комментарии: 16

Денис Дыранов
28 апреля 2016, 12:59
0
Та же задача. Похоже этот вопрос везде игнорируется. Нашли решение?
    Виктор
    28 апреля 2016, 15:24
    0
    Как это сделать в рамках minishop я не разобрался. Отложил задачу на потом. Последней идеей было грузить на странице заказа iframe с формой отправки файла и своим обработчиком.
      Денис Дыранов
      28 апреля 2016, 18:29
      0
      У меня пока идея: грузить файлы куда-то в tmp и как-то аттачить к заказу, после чего удалять. Пока кажется что это реально. Попробую.
    Wassi Wassinen
    28 апреля 2016, 18:40
    0
      Konstantin
      28 апреля 2016, 18:41
      0
      Создаете табу в базе
      в нее пишите пути сохренения файла и айди заказа

      На странице где оформляется заказ, то бишь корзина сделать форму отправки файла
      эта форма без перезагрузки страницы загружает файл и пишет в табу данные

      Главное узнать айди заказа )

      Надеюсь помог
        Денис Дыранов
        28 апреля 2016, 18:46
        0
        Задача, в моём случае — увеличить стоимость товара при загрузке файла пользователем. Файл — фотка. Делаем продукт с фоткой пользователя — увеличиваем его стоимость. Так что загружаться файл должен ещё до добавления товара в корзину.
          Konstantin
          28 апреля 2016, 18:55
          0
          плагином в корзине делаем проверку если файл был загружен то добавляем в корзину какой то товар с определенной стоимостью, возможно обновляем корзину.

          Хз ) чисто размышления.
            Денис Дыранов
            28 апреля 2016, 19:02
            0
            Это понятно. Осталось решить две «простецких» задачи: аккуартно и безопасно загрузить файл куда-то и как-то приаттачить его к письму менеджеру. А потом ещё удалить, чтоб не создавать помойку на хостинге.
              Konstantin
              28 апреля 2016, 19:05
              0
              Ну приаттачить к письму можно ссылкой на файл, там же рядом сделать ссылку на удаление файла. Свой сниппет будет удалять файл и строку из таблицы аттачей
                Денис Дыранов
                28 апреля 2016, 19:11
                0
                Это слишком геморойно для менеджеров. Почта практически бесконечна, в отличии от хостинга. Нужно чтоб файлы именно аттачились к письму, а не были ссылкой на файл, который в скором времени исчезнет, пусть даже это случится через месяц. Заставлять манагеров удалять файлы самостоятельно (пусть даже ссылкой) — гиблое дело. Забьют.
                  Konstantin
                  28 апреля 2016, 19:17
                  0
                  Письмо будет отправляться минишопом?
                  Тогда в чанке письма менеджеру вы размещаете сниппет который будет отправлять например второе письмо менеджеру) с аттачем, например используя это
                  /*Активируем почтовый сервис MODX*/
                  $modx->getService('mail', 'mail.modPHPMailer');
        Денис Дыранов
        29 апреля 2016, 15:46
        0
        Пока решение такое.
        1. На странице товара, добавил dropzone в отдельной форме. То есть в шаблоне у меня есть такое:

        <script src="/assets/js/dropzone.js"></script>
        <link rel="stylesheet" href="/assets/js/dropzone.css">
        <form action="/upload.php" class="dropzone">
          <div class="fallback">
            <input name="file" type="file" multiple />
          </div>
        </form>

        2. Сделал тупой загрузчик upload.php:
        <?php
        session_start();
        $ds          = DIRECTORY_SEPARATOR;  //1
         $ses = session_id();
        $storeFolder = 'uploads/'.$ses;   //2
        
        if (!is_dir($storeFolder))
            mkdir($storeFolder);
         
        if (!empty($_FILES)) {
             
            $tempFile = $_FILES['file']['tmp_name'];          //3             
              
            $targetPath = dirname( __FILE__ ) . $ds. $storeFolder . $ds;  //4
             
            $targetFile =  $targetPath. $_FILES['file']['name'];  //5
         
            move_uploaded_file($tempFile,$targetFile); //6
             
        }
        ?>
        Загруженный файл сохраняется в папку /uploads/session_id/.

        3. В /core/components/minishop2/model/minishop2/minishop2.class.php изменил функцию sendEmail, следующим образом:

        public function sendEmail($email, $subject, $body = 'no body set') {
        		if (!isset($this->modx->mail) || !is_object($this->modx->mail)) {
        			$this->modx->getService('mail', 'mail.modPHPMailer');
        		}
        		$this->modx->mail->set(modMail::MAIL_FROM, $this->modx->getOption('emailsender'));
        		$this->modx->mail->set(modMail::MAIL_FROM_NAME, $this->modx->getOption('site_name'));
        		$this->modx->mail->setHTML(true);
        		$this->modx->mail->set(modMail::MAIL_SUBJECT, trim($subject));
        		$this->modx->mail->set(modMail::MAIL_BODY, $body);
        		$this->modx->mail->address('to', trim($email));
        		$storeFolder = MODX_BASE_PATH .'uploads/'.session_id();
        		if (is_dir($storeFolder)){
        			$files = scandir($storeFolder);
        			foreach($files as $file) {
        			  $attachment = $storeFolder.'/'.$file;
        			  $this->modx->mail->attach($attachment);
        			}
        		}
        
        		if (!$this->modx->mail->send()) {
        			$this->modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$this->modx->mail->mailer->ErrorInfo);
        		}
        		$this->modx->mail->reset();
        		
        		if($files){
        		    foreach ($files as $file) {
        		            unlink($storeFolder.'/'.$file);
        		    }
        		    rmdir($storeFolder);
        		    }
        	}
        Функция цепляет все файлы из папки /uploads/session_id/ к отправляемому письму и удаляет папку.

        Ясно, что нужно расширять класс, а не править minishop2.class.php. Что удалять папку нужно в другом месте (сейчас аттачи приходят только менеджеру). Но, вроде работает. Попробую допилить дальше. Хотя есть сомнения в правильности такого способа. Как я уже 100 раз говорил, я дизайнер, а не программист. Хотелось бы услышать мнение программистов.
          Никита Серов
          28 марта 2019, 17:39
          0
          Здравствуйте, удалось, решить данный вопрос?
          Юрий
          17 января 2017, 13:49
          0
          Хорошее решение! Не подскажите в чём может быть проблема на тестовом сайте всё работает норм, делаю на рабочий папочка с сессией создаётся и удаляется, а вот файлик не аттачиться.
            Юрий
            18 января 2017, 13:36
            0
            Не приходит файл, почему?
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              16