Расширение формы Tickets
        Здравствуйте!
Столкнулся с проблемой, необходимо в существующую форму создания тикета добавить загрузку изображения.
В чем заключается трудность. Для того, чтобы передавать файлы через форму, атрибут формы enctype должен быть равен multipart/form-data. После этого, файл помещается в глобальный массив $_FILES, и информация о файле доступна в $_FILES['имя-поля-с-типом-file'] -> name,size,tmp_name.
Сейчас у формы создания тикетов не задан атрибут enctype и по умолчанию он равен application/x-www-form-urlencoded. Если изменить значение enctype у формы создания тикета на multipart/form-data, тогда данные теряются и ничего не создается.
Пытался вытащить значение в функции saveTicket из массива $_FILES — но ничего не вышло.
    
    
                                                                                
            Столкнулся с проблемой, необходимо в существующую форму создания тикета добавить загрузку изображения.
В чем заключается трудность. Для того, чтобы передавать файлы через форму, атрибут формы enctype должен быть равен multipart/form-data. После этого, файл помещается в глобальный массив $_FILES, и информация о файле доступна в $_FILES['имя-поля-с-типом-file'] -> name,size,tmp_name.
Сейчас у формы создания тикетов не задан атрибут enctype и по умолчанию он равен application/x-www-form-urlencoded. Если изменить значение enctype у формы создания тикета на multipart/form-data, тогда данные теряются и ничего не создается.
Пытался вытащить значение в функции saveTicket из массива $_FILES — но ничего не вышло.
Комментарии: 21
                Там обычная POST форма, нет никаких заморочек.
По идее, $_FILES надо ловить плагином по событию OnDocFormSave.
                    По идее, $_FILES надо ловить плагином по событию OnDocFormSave.
                Денис, если сделаете это, поделитесь? Очень актуально для меня.            
                    
                Если страницы не обязательно создавать с фронта, то можно обойтись TV с типом image и вызовом сниппета TicketComments. Вот так просто и без заморочек можно добавить не только картинку, но и теги к статье. Я именно так и сделал у себя на блоге.            
                    
                У меня к тикету подвязанна своя таблица, как в мс2, мне нужно создать тикет и прикрепить к нему изображение, с загрузкой и обработкой. Естественно, из фронтенда.            
                    
                Спасибо за совет. В принципе, я буду это использовать (если так можно добавить теги, то это вообще отлично!). Но в данном случае у меня есть раздел, где именно надо с фронтенда.            
                    
                В чанке создания тикета добавь 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
      }Ну, а дальше, уже сам проверки на расширение, размер и т.д. добавь.            
                Спасибо, Денис!            
                    
                Весь плагин 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 параметром?
                С точкой разобрался
                    $uploadfile = $path.$hash.$ext; поменять на $uploadfile = $path.$hash.'.'.$ext;            
                у тебя файл загрузился на сервер?             
                    
                Да            
                    
                Пожалуйста, добавь готовое решение.            
                    
                Как назначить это TV параметром?            
                    
                Кто то пробовал это реализовать? у меня не выходит (            
                    
                Осталось только назначить его как TV параметр [[+image]] вот только как сделать не зная PHP, подскажет кто?            
                    
                Как проверить валидность формата? 
                    $types = array('','gif','jpeg','png');
    $ext = $types[$type];
    if ($ext) {
    	$func = 'imagecreatefrom'.$ext;
    	$img = $func($file_input);
    } else {
    	echo 'Формат файла неправильный';
		return;
    } Это то о что надо?            
                Теме Up! Даешь готовое решение.            
                    
                Теме Up! Даешь готовое решение.            
                    
                Загрузка изображений с фротэнда теперь реализована из коробки.
Вывод загруженного изо на странице такой:
                    Вывод загруженного изо на странице такой:
<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`]]">            
                это первой картинки, а если их 3, например?            
                    
                &limit='3'            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.