Автосоздание папок в файловой системе для ресурсов

Добрый день.
Появилась задача по созданию для каждого ресурса своей отдельной папки и ограничению просмотра в файл-менеджере именно этой папки при редактировании ресурса. Вопрос как это реализовать.

Задача вроде простая — при создании ресурса для него должна создаваться отдельная папка в ФС и доступ должен быть только к ней (анпример при закгрузке картинок в tinyMCE). Причина такого ограничения банальна — девочки менеджеры в легкую удаляют целые каталоги несмотря на кучу предупреждений, поэтому давать им доступ к папке с файлами всех ресурсов очень чревато, в то же время запрещать удаление не хочется т.к. файлы периодически обновляются и замусоривать папки не хочется.

Явное решение — опираться на id ресурса. И для редактирования уже существующего ресурса оно вполне подходит (mediasource + сниппет из migx). Но проблема в том что для новых ресурсов не существует id.
Варианты решений:
1) прятать редактор текста и tv при создании ресурса и показывать при редактировании (после сохранения). Вариант некрасивый и не очень удобный так как не все ресурсы будут содержать какие либо файлы.
2) автосохранять ресурсы при нажатии «создать новый ресурс». тоже не очень красиво, но в принципе терпимо. Проблема в том на событие OnDocFormRender нам не приходит resource и мы не можем документ сразу сохранить. Можно конечно вызвать яваскриптом клик по кнопке сохранить, но хотелось бы поизящнее.
3) Автосохранять документ только при попытке вызвать файлменеджер. Не придумал как отловить это событие :-[
4) Пожалуй самое незаметное решение — добавить скрытый tv в который при создании нового документа будет генерироваться уникальное значение, на все аякс запросы добавить параметр с этим значением и соответственно в сниппете генерировать папку на основе этого значения…

Собственно вопрос кто что думает и может подскажет? Мне почему то кажется что я изобретаю велосипед и где-нибудь есть решение поставленной задачи, но я к сожалению ничего не нашел :(
Андрей Иванников
12 марта 2014, 08:58
modx.pro
2 130
0

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

Володя
12 марта 2014, 13:25
+1
    Андрей Иванников
    12 марта 2014, 13:37
    0
    [[+id]] if available, the ID of the current resource. Added in 1.2.7
    Я так понимаю будет та же самая проблема — для новых ресурсов айди не существует до первого сохранения.
      Володя
      12 марта 2014, 13:50
      0
      таки да… А создать ресурс и нажать кнопку сохранить… а потом заниматься размещением контента.
        Андрей Иванников
        12 марта 2014, 14:14
        0
        Ну это мы с вами люди опытные и не забудем, а если вдруг забудем то поймем что не так. А девочки способные удалить папку с итогами за полгода несмотря на два предупреждения… :) Потому и скрывать редактор не хочу, будут же звонки с вопросами «я создаю страничку а где текст вводить не пойму», даже если там капсом написать что вначале документ надо сохранить. Вот к сожалению контингент пользователей будет именно как в анекдотах и цитатах с баша, поэтому пытаюсь придумать что-нибудь внешне незаметное, но при этом ограничивающее шаловливые ручки.
    Юрий Волощук
    16 марта 2014, 23:58
    0
    а что если отлавливать сам факт создания документа. зашёл менеджер, нажал создать документ, а в это время плагин создает документ и менеджер получает уже созданный документ. для менеджера это выглядит как только что созданный, а на самом деле документ уже создан, имеет id и другие параметры.
    надеюсь донёс идею.
      Konstantin
      13 января 2023, 11:00
      0
      Хоть и старая тема, но может кому-то как и мне нужен подобный функционал, поэтому выкладываю простое решение здесь

      1) ставим пакет mixedimage который создает поле загрузки файлов с расширенными параметрами
      2) создаем поле TV из mixedimage и указываем в настройках путь до файла {id}/ и теперь загружаться фотка будет в отдельную папку с номером ID ресурса
      3) создаем новый плагин и выбираем событие OnResourceDelete, и прописываем такой код:

      /** recursive remove dir function */
          function rrmdir($dir) {
              if (is_dir($dir)) {
                  $objects = scandir($dir);
                  foreach ($objects as $object) {
      				if ($object != "." && $object != "..") {
      					if (filetype($dir . "/" . $object) == "dir") {
      						rrmdir($dir . "/" . $object);
      					} else {
      						@unlink($dir . "/" . $object);
      					}
      				}
      			}
                  reset($objects);
                  $success = @rmdir($dir);
              }
      
          }
      
      $path = $modx->getOption('base_path') . 'assets/images/';  // replace with actual path to directory
      
      $path .=  $id;
       
      rrmdir($path);
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        6