Подмена пути источника файлов в текстовом редакторе

Суть проблемы. Сделал сайт, а далее клиенту нужно его наполнять, добавлять фото к статьям в редакторе. Всё бы хорошо, но когда источник файлов один единственный, то с ростом количества ресурсов, становится всё сложнее ориентироваться в папках с фотографиями. Люди начинают путаться, а ещё хуже переименовывать или перемещать уже созданные, случайно удалят, или пишут русскими буквами имена папок… Куча времени тратится на объяснение как надо работать с файловым менеджером.

Хорошо бы было, чтобы при нажатии на кнопку выбора фото (в редакторе), сразу открывалась папка конкретного ресурса, допустим, путь assets/manager/resources/id ресурса/.

Перерыл всё что можно по этой теме, так и не нашёл решения. Публикую неидеальное, но решение)

1) Создаём источник файлов с произвольным названием, в который добавляем новый параметр sourceFilesPrefixPath. В нём указываем путь к папкам ресурсов по номерам, например, assets/manager/resources/

2) Далее в системной настройке default_media_source (Источник файлов по умолчанию), выбираем созданный источник.

3) Создаём плагин на событие OnDocFormRender, допустим, replaceDefaultMediaSourcePath:

<?php
$managerUserId = 3;                        // id пользователя менеджер

if($modx->event->name = 'OnDocFormRender') {
    $resource = ($resource instanceof modResource) ? $modx->getObject('modResource', $resource->get('id')) : $modx->getObject('modResource', (int)$resource);
    
    if ( ($resource instanceof modResource) && ($modx->user->id == $managerUserId) ) {
        $resId = $resource->id;
        $sourceId = $modx->getOption('default_media_source');

        $source = $modx->getObject('sources.modFileMediaSource', $sourceId);
        
        if(!$source) return;

        $properties = $source->getProperties();
        $path = $properties['sourceFilesPrefixPath']['value'];
        if(!$path) return;
        
        $path .= "$resId/";
        
        // создаём папки по указанному в sourceFilesPrefixPath пути, если они не созданы
        $folderPath = MODX_BASE_PATH;
        $folders = explode('/', $path);
        foreach($folders as $folder) {
            if(!trim($folder)) break;
            
            $folderPath .= '/' . $folder;
            if(!file_exists($folderPath)) {
                mkdir($folderPath, 0755);
            }
        }

        $properties['basePath']['value'] = $path;
        $properties['baseUrl']['value'] = $path;
        
        $source->set('name', "($resId) " . $resource->pagetitle);
        $source->setProperties($properties);
        $source->save();
    }
}

В переменной $managerUserId указываем id пользователя, который будет редактировать ресурсы.
Все необходимые папки пути 'assets/manager/resources/id ресурса/' плагин автоматом создаст от корня сайта, если они не созданы.

Итого, если менеджер открывает на редактирование какой-то ресурс, то в наш источник файлов каждый раз подставляется новый путь assets/manager/resources/id открытого ресурса/. А когда в редакторе нажимает кнопку выбора фото, то в диспетчере файлов ему откроется папка текущего документа, а не все подряд.

Недостатки

А неидеально решение тем, что если в админке будут работать сразу 2 менеджера, то начнётся неразбериха с путями, один одно открыл — перезаписался источник, другой другое. Поэтому, дополнительно подменяется название источника на "(id) pagetitle". Чтобы при открытии диспетчера было видно, правильная ли папка открыта.

Стоит также создать отдельного пользователя, чтобы был admin для разработки, а manager для наполнения, чтобы друг другу не мешались, и admin не влиял никак на источник.

Также недостаток в том, что в консоли при открытии документа на редактирование все добавленные в статью фото почему-то появляются с 404 ошибкой, хотя в редакторе и на сайте всё как надо отображается.

Так как данный источник файлов определён как по умолчанию, то при создании TV с типом Изображение и в других местах, где требуется указать источник, там надо не забывать менять на нормальный.

Другого способа я не нашёл. Диспетчер файлов открывается во фрейме, как на него повлиять не знаю. Так что как есть, может кому пригодится.
Николай
25 марта 2019, 15:13
modx.pro
2
1 801
+4
Поблагодарить автора Отправить деньги

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

iWatchYouFromAfar
25 марта 2019, 19:49
+1
Решение конечно такое себе.

Я использую другой вариант плагина, подставляю источник файлов на основании шаблона. Проще говоря — каждому шаблону, свой источник файлов, без привязки к юзерам. Я тоже хотел свой плагин доработать, чтобы он создавал папки по текущему id ресурса. Но там всплывает множество подводных камней, типа что будет если у ресурса сменить шаблон или если удалить ресурс. Как потом удалять неиспользуемые файлы и папки и т.д. Посему управление диспетчером файлов я возлагаю на пользователей.

Например на своих сайтах я создаю папки и обрабатываю их плагином транслитерации и добавляю в название текущую дату. Так проще структуру соблюдать.

А вообще, когда сайт разрастается, пользоваться встроенным диспетчером файлов становится не очень удобно.
    Николай
    25 марта 2019, 20:11
    0
    Решение конечно такое себе.
    Если контент-менеджер один, то проблем никаких. Мне кажется где-то лежит класс, отвечающий за диспетчер. Он же открывает источник по умолчанию. Вот этот момент если отловить где-то, то можно уже завести сколько угодно пользователей и каждому отдельный источник назначить. И тогда они мешать не будут друг другу.

    Как потом удалять неиспользуемые файлы и папки и т.д.
    Да и фик с ними) Каждому ресурсу своя папка, пусть она будет пустая. А вообще зная путь к этим папкам можно легко вычислить какие пустые и удалить, если очень надо. А неиспользованных файлов думаю будет минимум, иначе зачем их загружать. При обычном способе ситуация такая же. Можно и файлы неиспользуемые вычистить, перебирать ресурсы, искать ссылки на картинки в content, сравнивать с тем что есть в папке ресурса, и неиспользуемые файлы удалить. Довольно простой скрипт получится, опять же если очень надо)

    А вообще, когда сайт разрастается, пользоваться встроенным диспетчером файлов становится не очень удобно.
    Не то что клиенту, а даже мне неудобно) Мне ничего умнее в голову не приходит как по папкам с id ресурсов раскидывать файлы. С буквенными названиями ещё больше запутаешься. Но когда таких папок хотя бы 50+ штук, то каждую загружаемую фоточку в них искать это геморрой, а если их в одной статье десяток, то столько времени теряется на это…
    Андрей Степаненко
    25 марта 2019, 21:43
    0
    Банально modAccessManager.
    Источник файлов назначается пользователю
      Николай
      25 марта 2019, 23:42
      0
      Блин, а я ищу ищу класс такой, не найду, а это же дополнение))
      Николай
      02 апреля 2019, 03:17
      0
      Ещё один неплохой вариант применения способа. Если фоток много, то лазить за каждой через кнопку накладно, даже если сразу нужная папка откроется. Но CKEditor поддерживает перетаскивание фото мышью, и тогда можно делать вот так:



      Можно мышью накидать нужных фото по одной, прям без разбора, одну на другую, они добавятся в один абзац. Правда если кликнуть по ним двойным щелчком, то редактирование не откроется. Чтобы редактирование стало доступно достаточно нажать на источник, и обратно, и тогда можно редактировать фотки. Я сразу задал им необходимую высоту, чтобы во всё окно не растягивались. С помощью плагинов можно распарсить всё это дело, обернуть тегами, и даже fancybox прикрутить предварительно заменив оригиналы миниатюрами. А менеджерам останется показать простой алгоритм добавления галерей прямо в редакторе. Да мне и самому удобнее намного, теперь только так и буду делать. За пару минут можно наполнить галерею как на скрине.
        Николай
        02 апреля 2019, 03:31
        0
        Для наглядности на фронте вот так это смотрится. Это уже миниатюры, оригиналы открываются через fancybox.



        Обработаны плагином (событие OnLoadWebDocument) с помощью dom-парсера, мне нравится phpQuery. Названия методов и принцип работы такой же как в jQuery.
        Fi1osof
        03 августа 2019, 22:46
        +2
        В свое время пилил файл-манагер для сборки NewsModxBox. Задача была как раз в том, чтобы на сайте могло работать куча манагеров с большим количеством фото, при чем каждый мог искать не только по своим фоткам, но и по фоткам других манагеров (если права позволяют). Плюс рассчет был на многие тысячи файлов.
        Вот что получилось: www.youtube.com/watch?v=59oy6a09vlM&feature=youtu.be
        Я еще пытался загрузить побольше фоток, чтобы постраничность была, но потом только посмотрел, что там лимит в 100 фоток на страницу, а я столько не загрузил, потому что сразу предусматривалось не перетирать фотки с одним и тем же названием от одного манагера.
        Но в самостоятельный компонент это не вылилось и как именно работает, сейчас не скажу точно (точно можно сказать только то, что это дополнительный компонент для TinyMCE и вообще там все весьма не просто).

        Если кому интересно и захочет покопать, исходники сборки здесь: github.com/MODX-Club/NewsModxBox
        Заметка: modxclub.ru/topics/gotovaya-sborka-novostnogo-portala-newsmodxbox-1.0.0-beta-1879.html
        Можно попробовать установить у себя, но лучше на MODX не новее чем 2.6.5
        Напоминаю: ставить можно только на чистый MODX, на готовый сайт нельзя, все затрет.
          Николай
          04 августа 2019, 12:10
          0
          Хотя мне уже не актуально, но всё равно спасибо, Николай. Есть в чём покопаться, не знал, что дополнения твои старые доступны для скачивания)
            Fi1osof
            04 августа 2019, 14:57
            0
            Не за что!
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          9