tickets загрузка изображения через форму в tv

Привет.
Подскажите пожалуйста.

На фронтенде есть форма для создания тикета.
[[TicketForm? 
    &tplFormCreate=`tpl.Tickets.form.create.news_press_reliz` 
    &resources=`16`
    &redirectUnpublished=`6561`
    &allowedFields=`pagetitle,content,img_preview`
]]
Нужно через поле img_preview (TV — типа изображение) загрузить картинку на сервер и записать путь до неё в это TV.

<div class="form-group">
		<label for="ticket-img">Изображение</label>
		<input type="text" class="form-control" placeholder="Изображение" name="img_preview" value="" maxlength="50" id="ticket-img"/>
		<span class="error"></span>
	</div>
Попробовав так, в это поле записался текст, значит данные записываются нормально. Но с изображением куда все тяжелее. Подскажите, может кто сталкивался с подобной задачей. Надо именно загрузить файл с фронтенда и записать его путь в TV.
Павел
10 сентября 2015, 07:10
modx.pro
3
3 998
0

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

brioni
20 февраля 2016, 22:18
0
Теме up
    Роман Садоян
    20 февраля 2016, 23:01
    1
    +1
    Я бы сделал так:
    1. Добавил элемент на форму
    <input type="file" name="image">
    2. Ловить плагином на событие
    if ($modx->event->name == 'OnDocFormSave')
    (добавив какой-нибудь скрытый инпут, чтобы ловить именно эту форму, можно даже проверять на существование $_POST['image'])
    и получать данные изображения:
    $file = $_FILES['image'];
        $name =  $_FILES['image']['name'];
    3. Грузить файл, получать имя и делать setTVValue.

    Алгоритм действия ясен?
      brioni
      20 февраля 2016, 23:37
      0
      Ясен, но признаюсь, что сам реализовать не смогу — в php деревянный
        brioni
        20 февраля 2016, 23:57
        0
        Как будет время-настроение, оформи, пожалуйста, готовый плагин — толпа будет признательна 100%
          Антон Пастухов
          21 февраля 2016, 00:03
          0
          Событие OnDocFormSave не имеет отношения в формам с фронтэнда, оно срабатывает на сохранение ресурса из менеджера.
            Роман Садоян
            21 февраля 2016, 00:24
            0
            Это же Tickets друг.
              Антон Пастухов
              21 февраля 2016, 00:46
              0
              Ага, вы правы. Совсем забыл, что официальной документации верить нельзя и по факту OnDocFormSave вызывается при любом сохранении ресурса через процессор, даже если он вызван с фронтэнда.
                brioni
                21 февраля 2016, 15:46
                0
                Вот здесь есть решение:
                <input type="file" name="photo">
                Дальше, добавь enctype атрибут для формы.
                <form method="post" enctype="multipart/form-data" action="[[~[[*id]]]]">
                Дальше в плагине добавляем обработку загрузки изображения:
                case 'OnDocFormSave':
                      // Указываем путь, пробовал $modx->getOption('assets_url').'path/to/dir/';
                      // получается со слэшем вначале: /assets/images/.
                      $path = 'assets/images/'; 
                      if($mode == 'new'){  // Режим создания документа
                        if (!empty($_FILES)) {  // Проверка на пустоту массива $_FILES
                          @mkdir($path, 0777, true); // Создаем папку для хранения изображений, с правами 0777, третий аргумент - рекурсивное создание папок.
                          foreach($_FILES as $k => $v) {
                            $name = $v['name'];
                            $size = $v['size'];
                            $tmp = $v['tmp_name'];
                
                            $ext = pathinfo($name, PATHINFO_EXTENSION); //получаем расширение файла
                            $hash = md5(time().$name.$size); // новое название файла
                            $uploadfile = $path.$hash.$ext; // объединяем в конечный путь к файлу
                
                            if (copy($tmp, $uploadfile)) { // копируем изображения из временной папки в нужное место
                              $resource->set('photo', $uploadfile); 
                              $resource->save(); // Сохраняем объект.
                            }
                          }
                        }
                      } else {
                        //resource update
                      }
                но мне не удается даже загрузить файл на сервак…
                Может кто спарвился?
                  Bluetenstadt
                  08 июля 2016, 11:26
                  0
                  Решение найдено?
                    Павел
                    13 июля 2016, 15:47
                    1
                    +2
                    Да… вот описал в статье… только для одной картинке пока, для более и двух не требовалось.
                    Напишу сюда пожалуй ещё:

                    Для начала создадим новую ТВ — назовём её «photo» (тип: изображение).

                    Затем давайте откопируем tpl для создания новых тикетов «tpl.Tickets.form.create» и назовём его «tpl.Tickets.form.create.my».

                    А теперь зайдём в эту tpl и добавим новое поле в нужное место.

                    <div class="form-group">
                        <label for="ticket-photo">Изображение</label>
                        <input type="file" class="form-control" name="photo" id="ticketphoto"/>
                        <span class="error" id="error_ticketphoto"></span>
                    </div>
                    Также добавим атрибут «enctype» в тег формы, чтобы она могла поддерживать загрузку файлов на сервер.

                    <form class="well create" method="post" action="" id="ticketForm" enctype="multipart/form-data" >
                    Вызов сниппета соответственно такой:
                    [[TicketForm?
                        &tplFormCreate=`tpl.Tickets.form.create.my`
                    ]]
                    Отлично, новое поле у нас в форме есть. Но чтобы оно загрузилось, мы должны написать плагин, который будет срабатывать на событие «создания нового документа», а именно «OnDocFormSave».

                    Данный плагин будет получать глобальный массив $_FILES, с помощью которого будем получать все данные загруженного файла, а затем переносить этот файл в нужное место с новым именем и с дальнейшей записью его пути в нашу TV.

                    Сам плагин (событие — OnDocFormSave)

                    <?php
                    if ($modx->event->name == 'OnDocFormSave') {
                          if($mode == 'new'){  
                            if (!empty($_FILES)) { 
                                 
                                $id = $resource->get('id');
                                $folder = 'uploads'; // имя папки куда грузить, должна быть создана (в корне сайта)
                                $path = MODX_BASE_PATH.'/'.$folder.'/'; // Путь от корня до нужного места
                                $tv_name = 'photo'; // имя нашей тв
                                 
                                // все значения файла
                                $nameFile = $_FILES['photo']['name'];
                                $typeFile = $_FILES['photo']['type'];
                                $tmpNameFile = $_FILES['photo']['tmp_name'];
                                $sizeFile = $_FILES['photo']['size']; 
                                 
                                $limit_size = 3*1024*1024; // 3 Mb - максимальный размер загружаемого файла
                                $file_types = array("jpeg", "jpg", "gif", "png"); // доступные расширения для загрузки
                                $extensionFile = substr(strrchr($nameFile, '.'), 1); // получаем расширение файла
                                 
                                $NewNameFile = 'id_'.$id.'_'.date("m_d_y").'.'.$extensionFile;  // наше новое имя файла
                                 
                                if(is_uploaded_file($tmpNameFile)) // проверяем зашёл ли файл
                                {
                                    if($limit_size > $sizeFile)
                                    { // Проверка на размер
                                        if(in_array($extensionFile, $file_types)){ // проверка на тип
                                             move_uploaded_file($tmpNameFile, $path.$NewNameFile); // загрузка файла
                                             $resource->setTVValue($tv_name, $folder.'/'.$NewNameFile); // запись в ТВ
                                        }
                                    }
                                }
                            }
                        } 
                    }
                      Roman
                      08 сентября 2016, 06:55
                      0
                      а для tpl.Tickets.form.update будет также добавление enctype и кода?
                      пробовал при update, картинку не загружает
                        Pavel
                        25 мая 2019, 16:58
                        0
                        Хочу грузить картинку в папку ресурса —
                        $folder = '/assets/images/resources/'.$id.'';
                        — но не грузит, видимо там папки этой на момент загрузки еще нет… кто нибудь делал такое? просто нужно потом удалять эту картинку, при удалении тикета, если грузить ее сразу в его папке, думаю, это решило бы проблему… чем писать еще доп плагин по удалению этих картинко, если их к тому же несколько… Может Василий подскажет? Как правильно грузить фотку?
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            12