Загрузка файла в 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)) пустое или заполнено файлом?            
                    
                Ну… если такая запись работает и все хорошо, нет необходимости менять.            
                    
                работает, спасибо)            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.