Расширение формы Tickets

Здравствуйте!
Столкнулся с проблемой, необходимо в существующую форму создания тикета добавить загрузку изображения.
В чем заключается трудность. Для того, чтобы передавать файлы через форму, атрибут формы enctype должен быть равен multipart/form-data. После этого, файл помещается в глобальный массив $_FILES, и информация о файле доступна в $_FILES['имя-поля-с-типом-file'] -> name,size,tmp_name.

Сейчас у формы создания тикетов не задан атрибут enctype и по умолчанию он равен application/x-www-form-urlencoded. Если изменить значение enctype у формы создания тикета на multipart/form-data, тогда данные теряются и ничего не создается.

Пытался вытащить значение в функции saveTicket из массива $_FILES — но ничего не вышло.
Denys Butenko
13 мая 2013, 16:26
modx.pro
5
4 545
0

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

Василий Наумкин
13 мая 2013, 20:46
0
Там обычная POST форма, нет никаких заморочек.

По идее, $_FILES надо ловить плагином по событию OnDocFormSave.
    Александр Донский
    13 мая 2013, 21:20
    0
    Денис, если сделаете это, поделитесь? Очень актуально для меня.
      Евгений Борисов
      13 мая 2013, 22:03
      0
      Если страницы не обязательно создавать с фронта, то можно обойтись TV с типом image и вызовом сниппета TicketComments. Вот так просто и без заморочек можно добавить не только картинку, но и теги к статье. Я именно так и сделал у себя на блоге.
        Denys Butenko
        13 мая 2013, 22:38
        0
        У меня к тикету подвязанна своя таблица, как в мс2, мне нужно создать тикет и прикрепить к нему изображение, с загрузкой и обработкой. Естественно, из фронтенда.
          Александр Донский
          14 мая 2013, 23:09
          0
          Спасибо за совет. В принципе, я буду это использовать (если так можно добавить теги, то это вообще отлично!). Но в данном случае у меня есть раздел, где именно надо с фронтенда.
          Denys Butenko
          14 мая 2013, 17:40
          0
          В чанке создания тикета добавь input с типом file и name, например, photo:
          <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
                }
          Ну, а дальше, уже сам проверки на расширение, размер и т.д. добавь.
            Александр Донский
            14 мая 2013, 23:10
            0
            Спасибо, Денис!
              Дмитрий Чумак
              16 июля 2013, 13:20
              0
              Весь плагин Tikets
              switch($modx->event->name) {
              case 'OnManagerPageInit':
              $cssFile = $modx->getOption('tickets.assets_url',null,$modx->getOption('assets_url').'components/tickets/').'css/mgr/tickets.css';
              $modx->regClientCSS($cssFile);
              break;
              
              case 'OnSiteRefresh':
              if ($modx->cacheManager->refresh(array('default/tickets' => array()))) {
              $modx->log(modX::LOG_LEVEL_INFO, $modx->lexicon('refresh_default').': Tickets');
              }
              break;
              
              case 'OnDocFormRender':
              if ($resource->class_key == "TicketsSection") {
              /* @var TicketsSection $resource */
              $resource->set('syncsite', 0);
              }
              break;
              
              case 'OnDocFormSave':
                    // Указываем путь, пробовал $modx->getOption('assets_url').'path/to/dir/';
                    // получается со слэшем вначале: /assets/images/.
                    $path = 'assets/images/blogs/'; 
                    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
                    
              /* @var TicketsSection $resource */
              if ($mode == 'upd' && $resource->class_key == 'TicketsSection') {
              if (method_exists($resource, 'clearCache')) {
              $resource->clearCache();
              }
              }}
              break;
              
              case 'OnWebPagePrerender':
              $output = & $modx->resource->_output;
              $output = str_replace(array('[',']'), array('[',']'), $output);
              break;
              
              case 'OnPageNotFound':
              // It is working only with friendly urls enabled
              $q = trim($_REQUEST['q']);
              $matches = explode('/', $q);
              $count = count($matches);
              if ($count < 3) {return;}
              
              $section = $matches[$count - 3];
              $ticket = $matches[$count - 2];
              
              // Redirect to requested page, when you moved ticket from one section to another
              if ($modx->getCount('TicketsSection',array('class_key' => 'TicketsSection', 'alias' => $section, 'deleted' => 0, 'published' => 1))) {
              if (preg_match('/^\d+$/', $ticket)) {
              if ($modx->getCount('Ticket', array('id' => $ticket, 'published' => 1, 'deleted' => 0))) {
              $url = $modx->makeUrl($ticket, '', '', 'full');
              $modx->sendRedirect($url);
              }
              }
              }
              break;
              
              case 'OnWebPageComplete':
              $Tickets = $modx->getService('tickets');
              $Tickets->logView($modx->resource->id);
              break;
              
              }
              Выдает файлы такого плана
              8c03a5ee81fb5a5c5054159cdf5a1771png
              , не проставляет точку к расширению. И как загруженый файл можно привязать чтобы он прописывался TV параметром?
                Дмитрий Чумак
                16 июля 2013, 16:19
                1
                0
                С точкой разобрался
                $uploadfile = $path.$hash.$ext;
                поменять на
                $uploadfile = $path.$hash.'.'.$ext;
                brioni
                21 февраля 2016, 13:16
                0
                Пожалуйста, добавь готовое решение.
                Дмитрий Чумак
                17 июля 2013, 18:53
                0
                Как назначить это TV параметром?
                  Vitea Kirichenko
                  26 октября 2013, 18:57
                  0
                  Кто то пробовал это реализовать? у меня не выходит (
                Дмитрий Чумак
                16 июля 2013, 16:38
                0
                Осталось только назначить его как TV параметр [[+image]] вот только как сделать не зная PHP, подскажет кто?
                  Дмитрий Чумак
                  16 июля 2013, 19:32
                  0
                  Как проверить валидность формата?
                  $types = array('','gif','jpeg','png');
                      $ext = $types[$type];
                      if ($ext) {
                      	$func = 'imagecreatefrom'.$ext;
                      	$img = $func($file_input);
                      } else {
                      	echo 'Формат файла неправильный';
                  		return;
                      }
                  Это то о что надо?
                  brioni
                  21 февраля 2016, 15:27
                  0
                  Теме Up! Даешь готовое решение.
                    Bluetenstadt
                    08 июля 2016, 11:36
                    0
                    Теме Up! Даешь готовое решение.
                      brioni
                      11 июля 2016, 18:42
                      1
                      +1
                      Загрузка изображений с фротэнда теперь реализована из коробки.
                      Вывод загруженного изо на странице такой:
                      <img src="[[pdoResources:default=`/path/заглушка.png`? &class=`TicketFile` &where=`{"parent":[[+id]]}`  &sortby=`createdon`  &sortdir=`ASC`  &limit=`1`  &tpl=`@INLINE [[+url]]`]]" >
                      или
                      <img src="[[pthumb? &input=`[[pdoResources:default=`[[*image]]`? &class=`TicketFile` &where=`{"parent":[[+id]]}`  &sortby=`createdon`  &sortdir=`ASC`  &limit=`1`  &tpl=`@INLINE [[+url]]`]]` &options=`w=79,h=54`]]">
                        Bluetenstadt
                        11 июля 2016, 23:28
                        0
                        это первой картинки, а если их 3, например?
                          brioni
                          13 июля 2016, 10:13
                          0
                          &limit='3'
                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    21