Загрузка изображения в TV через TicketForm / Фронт

Всех с наступающим Днём Мужчины!
Крайне признателен за создание и постоянное обновление дополнения Tickets — это реальный переворот в инди-сайтостроении. Фронтэнд отлично справляется с для создания текстовых полей, но вот вопрос с загрузкой фотки сразу в TV остается открытым.
Максимально подходящий, но до конца не реализованный способ описан здесь modx.pro/help/1188/, но мне не хватает php скилс, чтобы до конца его реализовать.
Парни, давайте сделаем подарок сообществу и допилим этот плагин до готового решения:
В чанке создания тикета tpl.Tickets.form.create добавь input с типом file и name, например, photo:
<input type="file" name="photo">
Дальше, добавь enctype атрибут для формы в чанке .
<form method="post" enctype="multipart/form-data" action="[[~[[*id]]]]">
Дальше в плагине Tickets добавляем обработку загрузки изображения:
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
      }
Ну, а дальше, уже сам проверки на расширение, размер и т.д. добавь.
— Однако, не удается даже создать новую директорию и загрузить файл на сервак, а ведь еще нужно добавить ссылку в TV *photo.
Автор поста ушел в подполье (последнее сообщение от него было в 2013) и на вопросы не отвечает, а что-то мне подсказывает, что до победы оставалось всего пару штрихов…
brioni
21 февраля 2016, 13:39
modx.pro
3
2 155
0

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

Василий Наумкин
21 февраля 2016, 16:40
0
У меня один глупый вопрос — нафига сохранять фото в ТВ, если Tickets отлично сохраняет его в свою таблицу?
    brioni
    21 февраля 2016, 16:42
    0
    Сори, что вопросом на вопрос, но как из этой таблицы вытащить ссылку и привязать её к созданному ресурсу? Плейсхолдер [[+thumb]] работает только веутри сниппета TicketForm
      Василий Наумкин
      21 февраля 2016, 16:45
      0
      Есть сниппет TicketMeta, есть сниппет pdoResources, есть, в конце-концов API MODX, которое позволяет работать напрямую с БД.

      Запихивать что-то в ТВ, когда оно отлично хранится в своей таблице — это очень странное решение.
        brioni
        21 февраля 2016, 16:53
        0
        А как через pdoResource вызвать изображение загруженное при создании тикета через фротэнд?
        И будет ли вызов работать внутри сниппетов getTickets, mSearch, tagLister?
          Василий Наумкин
          21 февраля 2016, 16:57
          +1
          На счёт tagLister без понятия, а всё что основано на pdoTools — без проблем.
          docs.modx.pro/components/pdotools/classes/pdofetch#Метод-addJoins
            brioni
            21 февраля 2016, 16:59
            0
            Ушел по ссылке, спасибо.
              brioni
              21 февраля 2016, 19:24
              0
              Извините, но я так и не понял как вывести загруженное из фронтэнда изображение на странице тикета вне поля content.
              Можно пример вызова [[!pdoResources?]] для этой цели?
      brioni
      21 февраля 2016, 20:36
      0
      Ребята, как из кода ниже сделать вывод загруженного через TicketForm изображения ?

      Все ветки обсуждений перелопачены и нигде нет короткого, но пипец важного примера, а тыкак-самотыкать я уже заколебался.
      [[!pdoResources?
      	&parents=`0`
      	&class=`modResource`
      	&loadModels=`ms2gallery`
      	&leftJoin=`{
      		"Image": {
      			"class": "msResourceFile",
      			"on": "modResource.id = Image.resource_id AND Image.parent = 0"
      		},
      		"Thumb": {
      			"class": "msResourceFile",
      			"on": "Image.id = Thumb.parent AND Thumb.path LIKE '%120x90%'"
      		}
      	}`
      	&select=`{
      		"modResource": "*",
      		"Image": "Image.url as image",
      		"Thumb": "Thumb.url as thumb"
      	}`
      	&showLog=`1`
      	&sortby=`id`
      	&sortdir=`ASC`
      ]]
      Ясно, что удаляем &parents=`0`, &class=`modResource`заменяем на &class=`TicketFile`, а дальше всё — тупик.
        brioni
        21 февраля 2016, 21:02
        0
        На странице вывод нашел здесь
        <img src="[[pdoResources:default=`/path/заглушка.png`? &class=`TicketFile` &where=`{"parent":[[+id]]}`  &sortby=`createdon`  &sortdir=`ASC`  &limit=`1`  &tpl=`@INLINE [[+url]]`]]" >
        P.S. — при оформлении вопросов, как указано в блоке справа, подробнее, т.е максимум ключевых слов описывайте проблему. Ответ на свой вопрос найден по запросу: «Tickets has_files», что не совсем логично…

        Далее отправляюсь на поиски вывода изображений в списке ресурсов через phptrumb/
        Отпишусь по результату — новички оценят.
          Jenya Filimonov
          22 февраля 2016, 09:02
          0
          Да: ) Отпишитесь если не сложно, если решите этот вопрос. Тоже интересовал, но ответа я так и не нашел на него. Отложил до лучших времен.
            brioni
            23 февраля 2016, 12:20
            2
            0
            Получилось с первого раза, тупо заменив параметр &input внутри вызова pthumb:
            <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`]]">
            Рассчитывал на то, что придется создавать обрезанные превью для каждого размера фотки как описано здесь, а затем выводить их в нужных местах сайта — но оказалось всё гораздо проще. Чему я очень рад :)
        Алексей
        21 апреля 2023, 17:58
        0
        Друзья, выручите! Хочу возродить эту тему, т.к. нужно научиться разные TV грузить картинки и просто файлы.
        Вот это не работает:
        daruse.ru/zagruzka-izobrazheniya-v-tv-dlya-tickets-v-modx-revo
          Алексей Смирнов
          21 апреля 2023, 22:05
          0
          Сразу вопрос. Зачем фото и файлы грузить в разные ТВ?
          Зачем усложнение такое?
            Алексей
            22 апреля 2023, 19:09
            0
            5 фото + несколько файлов. У каждого своё назначение. Пользователю важно загрузить без ошибок эти файлы и фото на фронте по одному файлу.
            Далее надо без гемора вывести каждое фото в РАЗНЫХ блоках в опубликованном тикете.
            Я реализовывал тикеты с галереями, где фото все кучей — всё норм. Но сейчас нужно именно в TV.
            Может у тикетс это предусмотрено, но я что-то не нашёл за неделю. Выше в комментариях вообще что-то не то.
              Алексей Смирнов
              22 апреля 2023, 21:47
              0
              Распихивание фоток в ТВ точно не предусмотрено.
              Я могу лишь посоветовать как-то помечать сами файлы, что загружаются со стороны стандартной загрузки и помечать в поле description (если оно не используется) или в поле properties добавлять в json формате пометку про файл (там есть некие данные, вам просто добавить в них нужно).
              Даже уже в этом варианте без TV можно будет уже вытаскивать нужные файлы. Если сможете помечать файлы, то и потом в ТВ путь к файлу спокойно сможете вставить.
              Ну и еще момент, у всех файлов тикета (tickets_files) есть поле type — туда записывается ТИП файла, если у вас разделение фотки — документы, то по типу еще можно отбрасывать и выводить (Images, pdf,doc) и т.д.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          15