Загрузка файла в tickets

Делаю на tickets каталог с возможностью добавления анкеты зарегистрированным пользователем, проверкой этой анкеты админом и публикацией анкеты после проверки. Анкета после добавления имеет статус не опубликовано, до момента пока админ не проставит галку опубликовано. В анкете застрял на добавлении видео-файла.
ДАНО:
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, но один ТВ файл не хочет заводиться.
Антон
26 июля 2022, 00:49
modx.pro
749
0

Комментарии: 14

Артур Шевченко
26 июля 2022, 11:17
0
1) Видео файл передается в папку video в корне, но не отображается в TV video в самом документе.
Думаю, нужно сохранять ресурс или выбрать другое событие.

2) Видео файл не передается при редактировании формы при tickets.form.update.tpl
Если данные не записываются, то вполне логично, что и в форму редактирования они не передаются. А если бы и передавались, то это был бы не сам файл, а только его имя.

3) При создании нескольких анкет файлы в папке видео просто затираются и в паке остается только один последний файл.
А в имени файла тебя ничего не смущает?
    Антон
    26 июля 2022, 11:51
    0
    С именем файла согласен, косяк, нужно хотя-бы время добавить, чтобы перезаписи не было. Основной вопрос на какое событие вешать плагин? Ресурс создан из фронта и пока не опубликован, висит в не активном состоянии. Вчера перечитал все существующие события, ничего не подошло.
      Артур Шевченко
      26 июля 2022, 21:33
      0
      Я думаю чо если ты решишь проблему с именем всё наладится.
        Антон
        26 июля 2022, 21:37
        0
        с именем решил вопрос, добавив секунды-минуты, проблема в самом главном. Файл не передается в TV video. На сервер летит, в папку кладется, в самом документе твшка пустая.
    Алексей Смирнов
    26 июля 2022, 22:33
    0
    Сразу вопросы.
    видео с фронта вы добавляете в общую галлерею? или вы прям отдельно хотите TV с файликом?
    Если последнее, то я например делал так (мне нужно было грузить логотип-картинку отдельно).
    Я сделал отдельный обработчик для подгрузки, обновления этого поля, он на tikets не завязан.
    те логика такя:
    1. Изначально тикет должен быть как-то создан минимально, чтобы был его id.
    2. делаем php файл-коннектор (типа мелкий свой API) для загрузки файла. он Принимает файл и отвечает в json формате и выдает информацию, например, путь изображения. Этот путь мы записываем в TV (не полный а в зависимости от источника). Те в админке вы увидите файл. и сможете его, например, удалить как модератор, скачать тоже.
    3. на js делаем AJax обработку — отправку и прием данных.
    4. В тикетсовой форме вообще не упоминаем эту переменную, данные можно подгружать отдельно.
    input file с помощью которого выбирается файл — только для этого и служит. остальное (отправка файла — на ajax своем (3).
    — Я так делал по одной причине, что нужно было сделать превьюшку и чтобы фото сразу грузилось без лишних действий и сохранялось в документе.
      Антон
      26 июля 2022, 22:43
      0
      Отдельно созданная твшка с типом файл. Из фронта из большой формы с тектовыми инпутами заполнются параметры анкеты, прикрепляется видео, уходит на сервер. ПРоблема чисто в том, что это видео не отображается при просмотре документа из адмтинки. Поле пустое, но файл в паке в корне лежит, с присвоенным своим именем. Какая-то фигня получается, ощущение что тип ТВ файл не работает корректно, иначе почему все твшкуи передались, а видео нет, при том что в [[!TicketForm? &allowedFields video прописан
        Алексей Смирнов
        26 июля 2022, 22:47
        0
        Так вы же вроде забыли сохранить изменения:
        $resource->save();
        надобно на следующей строчке после SETTVVALUE.
        Антон
        26 июля 2022, 22:45
        0
        допускаю еще, что проблема в событии плагина, ресурс после направления еще в статусе неактивного получается
          Алексей Смирнов
          26 июля 2022, 22:51
          0
          аа вы делаете на ДО того как сохраниться документ. Получается, походу что когда приходят данные, то поле video которое идет с формы — пустое. и подозреваю что setTVvalue реально затирается параметром.
          вам нужно или событие OnDocFormSave или передавать input type text с нужным адресом сразу.
            Антон
            27 июля 2022, 00:22
            0
            проблема была в событии, с 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)) {
            не силен в этом
              Алексей Смирнов
              27 июля 2022, 11:05
              +1
              if($mode == 'upd'){ ... }
              Исправил. upd
                Антон
                27 июля 2022, 13:45
                0
                А следующую конструкцию как лучше прописать? Если if (!empty($_FILES)) пустое или заполнено файлом?
                  Алексей Смирнов
                  27 июля 2022, 16:19
                  1
                  0
                  Ну… если такая запись работает и все хорошо, нет необходимости менять.
                    Антон
                    27 июля 2022, 21:48
                    0
                    работает, спасибо)
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        14