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. Комментарии: 12
Теме up
Я бы сделал так:
1. Добавил элемент на форму
и получать данные изображения:
Алгоритм действия ясен?
1. Добавил элемент на форму
<input type="file" name="image">
2. Ловить плагином на событие if ($modx->event->name == 'OnDocFormSave')
(добавив какой-нибудь скрытый инпут, чтобы ловить именно эту форму, можно даже проверять на существование $_POST['image'])и получать данные изображения:
$file = $_FILES['image'];
$name = $_FILES['image']['name'];
3. Грузить файл, получать имя и делать setTVValue.Алгоритм действия ясен?
Ясен, но признаюсь, что сам реализовать не смогу — в php деревянный
Как будет время-настроение, оформи, пожалуйста, готовый плагин — толпа будет признательна 100%
Событие OnDocFormSave не имеет отношения в формам с фронтэнда, оно срабатывает на сохранение ресурса из менеджера.
Это же Tickets друг.
Ага, вы правы. Совсем забыл, что официальной документации верить нельзя и по факту OnDocFormSave вызывается при любом сохранении ресурса через процессор, даже если он вызван с фронтэнда.
Вот здесь есть решение:
Может кто спарвился?
<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
}
но мне не удается даже загрузить файл на сервак…Может кто спарвился?
Решение найдено?
Да… вот описал в статье… только для одной картинке пока, для более и двух не требовалось.
Напишу сюда пожалуй ещё:
Для начала создадим новую ТВ — назовём её «photo» (тип: изображение).
Затем давайте откопируем tpl для создания новых тикетов «tpl.Tickets.form.create» и назовём его «tpl.Tickets.form.create.my».
А теперь зайдём в эту tpl и добавим новое поле в нужное место.
Данный плагин будет получать глобальный массив $_FILES, с помощью которого будем получать все данные загруженного файла, а затем переносить этот файл в нужное место с новым именем и с дальнейшей записью его пути в нашу TV.
Сам плагин (событие — OnDocFormSave)
Напишу сюда пожалуй ещё:
Для начала создадим новую ТВ — назовём её «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); // запись в ТВ
}
}
}
}
}
}
а для tpl.Tickets.form.update будет также добавление enctype и кода?
пробовал при update, картинку не загружает
пробовал при update, картинку не загружает
Хочу грузить картинку в папку ресурса —
$folder = '/assets/images/resources/'.$id.'';
— но не грузит, видимо там папки этой на момент загрузки еще нет… кто нибудь делал такое? просто нужно потом удалять эту картинку, при удалении тикета, если грузить ее сразу в его папке, думаю, это решило бы проблему… чем писать еще доп плагин по удалению этих картинко, если их к тому же несколько… Может Василий подскажет? Как правильно грузить фотку?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.