Загрузка файла в tickets
Делаю на tickets каталог с возможностью добавления анкеты зарегистрированным пользователем, проверкой этой анкеты админом и публикацией анкеты после проверки. Анкета после добавления имеет статус не опубликовано, до момента пока админ не проставит галку опубликовано. В анкете застрял на добавлении видео-файла.
ДАНО:
1) TV *video
2) чанк tickets.form.create.tpl создания самой анкеты:
Проблемы:
1) Видео файл передается в папку video в корне, но не отображается в TV video в самом документе.
2) Видео файл не передается при редактировании формы при tickets.form.update.tpl
3) При создании нескольких анкет файлы в папке видео просто затираются и в паке остается только один последний файл.
Есть ли у кого-то готовый рабочий пример передачи файла через тикет? Думаю, что накосепорил с событием и самимb чанками создани и обновления анкеты. Передаются все ТВ, загрузка изображений через msgallery, но один ТВ файл не хочет заводиться.
ДАНО:
1) TV *video
2) чанк tickets.form.create.tpl создания самой анкеты:
<form class="well create" enctype="multipart/form-data" method="post" action="" id="ticketForm">
...
<div class="col-md-12 col-sm-12 mt-2">
<label for="ticket-photo">Insert video (maximum size 3 Mb, only mp4)</label>
<div class="custom-file">
<input type="file" class="custom-file-input" name="video" id="video">
<label class="custom-file-label" for="customFile">Choose video file</label>
<span class="error" id="error_video"></span>
</div>
</div>
3) чанк tickets.form.update.tpl обновления анкеты после публикации (на случай испарвления)<form class="well update" method="post" action="" id="ticketForm">
....
<div class="col-md-12 col-sm-12 mt-2">
<label for="ticket-photo">Insert video (maximum size 3 Mb, only mp4)</label>
<div class="custom-file">
<input type="file" class="custom-file-input" name="video" id="video">
<label class="custom-file-label" for="customFile">Choose video file [[+video]]</label>
<span class="error" id="error_video"></span>
</div>
</div>
4) Плагин, который запускается по событию OnBeforeDocFormSave. На OnDocFormSave форма после нажатия сохранить вообще зависает.<?php
if ($modx->event->name == 'OnBeforeDocFormSave') {
if($mode == 'new'){
if (!empty($_FILES)) {
$id = $resource->get('id');
$folder = 'video'; // имя папки куда грузить, должна быть создана (в корне сайта)
$path = MODX_BASE_PATH.'/'.$folder.'/'; // Путь от корня до нужного места
$tv_name = 'video'; // имя нашей тв
// все значения файла
$nameFile = $_FILES['video']['name'];
$typeFile = $_FILES['video']['type'];
$tmpNameFile = $_FILES['video']['tmp_name'];
$sizeFile = $_FILES['video']['size'];
$limit_size = 3*1024*1024; // 3 Mb - максимальный размер загружаемого файла
$file_types = array("mp4", "MP4"); // доступные расширения для загрузки
$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); // запись в ТВ
}
}
}
}
}
}
5) Создан источник файлов Video и выбран для TV video в настройках самого TVПроблемы:
1) Видео файл передается в папку video в корне, но не отображается в TV video в самом документе.
2) Видео файл не передается при редактировании формы при tickets.form.update.tpl
3) При создании нескольких анкет файлы в папке видео просто затираются и в паке остается только один последний файл.
Есть ли у кого-то готовый рабочий пример передачи файла через тикет? Думаю, что накосепорил с событием и самимb чанками создани и обновления анкеты. Передаются все ТВ, загрузка изображений через msgallery, но один ТВ файл не хочет заводиться.
Комментарии: 14
1) Видео файл передается в папку video в корне, но не отображается в TV video в самом документе.
Думаю, нужно сохранять ресурс или выбрать другое событие.2) Видео файл не передается при редактировании формы при tickets.form.update.tpl
Если данные не записываются, то вполне логично, что и в форму редактирования они не передаются. А если бы и передавались, то это был бы не сам файл, а только его имя.3) При создании нескольких анкет файлы в папке видео просто затираются и в паке остается только один последний файл.
А в имени файла тебя ничего не смущает?
С именем файла согласен, косяк, нужно хотя-бы время добавить, чтобы перезаписи не было. Основной вопрос на какое событие вешать плагин? Ресурс создан из фронта и пока не опубликован, висит в не активном состоянии. Вчера перечитал все существующие события, ничего не подошло.
Я думаю чо если ты решишь проблему с именем всё наладится.
с именем решил вопрос, добавив секунды-минуты, проблема в самом главном. Файл не передается в TV video. На сервер летит, в папку кладется, в самом документе твшка пустая.
Сразу вопросы.
видео с фронта вы добавляете в общую галлерею? или вы прям отдельно хотите TV с файликом?
Если последнее, то я например делал так (мне нужно было грузить логотип-картинку отдельно).
Я сделал отдельный обработчик для подгрузки, обновления этого поля, он на tikets не завязан.
те логика такя:
1. Изначально тикет должен быть как-то создан минимально, чтобы был его id.
2. делаем php файл-коннектор (типа мелкий свой API) для загрузки файла. он Принимает файл и отвечает в json формате и выдает информацию, например, путь изображения. Этот путь мы записываем в TV (не полный а в зависимости от источника). Те в админке вы увидите файл. и сможете его, например, удалить как модератор, скачать тоже.
3. на js делаем AJax обработку — отправку и прием данных.
4. В тикетсовой форме вообще не упоминаем эту переменную, данные можно подгружать отдельно.
input file с помощью которого выбирается файл — только для этого и служит. остальное (отправка файла — на ajax своем (3).
— Я так делал по одной причине, что нужно было сделать превьюшку и чтобы фото сразу грузилось без лишних действий и сохранялось в документе.
видео с фронта вы добавляете в общую галлерею? или вы прям отдельно хотите TV с файликом?
Если последнее, то я например делал так (мне нужно было грузить логотип-картинку отдельно).
Я сделал отдельный обработчик для подгрузки, обновления этого поля, он на tikets не завязан.
те логика такя:
1. Изначально тикет должен быть как-то создан минимально, чтобы был его id.
2. делаем php файл-коннектор (типа мелкий свой API) для загрузки файла. он Принимает файл и отвечает в json формате и выдает информацию, например, путь изображения. Этот путь мы записываем в TV (не полный а в зависимости от источника). Те в админке вы увидите файл. и сможете его, например, удалить как модератор, скачать тоже.
3. на js делаем AJax обработку — отправку и прием данных.
4. В тикетсовой форме вообще не упоминаем эту переменную, данные можно подгружать отдельно.
input file с помощью которого выбирается файл — только для этого и служит. остальное (отправка файла — на ajax своем (3).
— Я так делал по одной причине, что нужно было сделать превьюшку и чтобы фото сразу грузилось без лишних действий и сохранялось в документе.
Отдельно созданная твшка с типом файл. Из фронта из большой формы с тектовыми инпутами заполнются параметры анкеты, прикрепляется видео, уходит на сервер. ПРоблема чисто в том, что это видео не отображается при просмотре документа из адмтинки. Поле пустое, но файл в паке в корне лежит, с присвоенным своим именем. Какая-то фигня получается, ощущение что тип ТВ файл не работает корректно, иначе почему все твшкуи передались, а видео нет, при том что в [[!TicketForm? &allowedFields video прописан
Так вы же вроде забыли сохранить изменения:
$resource->save();
надобно на следующей строчке после SETTVVALUE.
допускаю еще, что проблема в событии плагина, ресурс после направления еще в статусе неактивного получается
аа вы делаете на ДО того как сохраниться документ. Получается, походу что когда приходят данные, то поле video которое идет с формы — пустое. и подозреваю что setTVvalue реально затирается параметром.
вам нужно или событие OnDocFormSave или передавать input type text с нужным адресом сразу.
вам нужно или событие OnDocFormSave или передавать input type text с нужным адресом сразу.
проблема была в событии, с OnDocFormSave заработало. Видео при первичном создании тикета передается и записывается в твшку. Теперь другая проблема, когда тикет создан и опубликован, либо не опубликован еще, если пользователь хочет изменить видео в:
<form class="well update" method="post" action="" id="ticketForm">
....
<div class="col-md-12 col-sm-12 mt-2">
<label for="ticket-photo">Insert video (maximum size 3 Mb, only mp4)</label>
<div class="custom-file">
<input type="file" class="custom-file-input" name="video" id="video">
<label class="custom-file-label" for="customFile">Choose video file [[+video]]</label>
<span class="error" id="error_video"></span>
</div>
</div>
файл видео отказывается передаваться и обновляться. Добавлял в форму и enctype=«multipart/form-data» — ни фига, допускаю, что плагин уже не подходит, т.к. твшка заполнена и mod не new.if($mode == 'new'){
if (!empty($_FILES)) {
Как правильно прописать в плагине?if($mode == MODE_UPD){
if (!empty($_FILES)) {
не силен в этом if($mode == 'upd'){ ... }
Исправил. upd
А следующую конструкцию как лучше прописать? Если if (!empty($_FILES)) пустое или заполнено файлом?
Ну… если такая запись работает и все хорошо, нет необходимости менять.
работает, спасибо)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.