Расширение формы 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'
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.