Pull to refresh

Делаем репозитарий для Evo на Ditto

Reading time4 min
Views3.1K
Здравствуйте! Сегодня я хотел бы поговорить о наболевшей проблеме — организации репозитариев (они же: файловые хранилища, файловые галереи, файловые архивы).

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

Что ж, поразмыслив, я подумал, что легче всего организовать файловый архив так, как реализуется практически все на MODx — через дерево ресурсов.

Для этого было решено использовать Ditto.

Итак, версия MODx Evo 1.0.4, Ditto стандартный, из дистрибутива.

Задача:

Дать возможность простому персоналу легко и не принужденно добавлять файлы, писать к ним описания, делать папки.

Идя:

В том, что бы использовать Ditto примерно так же, как, например, с выводом новостей, только вместо страниц — файлы.

Реализация:

Вообщем-то, я думаю, нужно пропустить размышления и тупиковые попытки и перейти сразу к окончательному варианту.

Структура файлового архива:

--Начальная страница архива
|---Папка 1
| |------Файл 1
| |------Файл 2
|---Файл 1
|---Файл 2
|---Файл 3

Т.е. примерно так:


Итак, для того, что бы отличать документы-файлы от документов-папок было решено сделать два дополнительных шаблона: один — для файлов, другой — для папок.

Шаблон файла — пустой (не удивляйтесь, Вы потом поймете для чего он нужен)
Шаблон для папки — содержит вызов Ditto.

В начальную страницу, Файловый архив, добавим вызов Ditto:
<h2>Файловый архив:</h2>
[!Ditto? &id=`archiv` &parents=`[*id*]` &noResults=` ` &filter=`template,15,8` &tpl=`repository` &sortBy=`createdon` &summarize=`30` &dateFormat=`%d.%m.%Y` &paginate=1 !]
[!Ditto? &id=`archiv` &parents=`[*id*]` &filter=`template,16,8` &tpl=`repository` &sortBy=`createdon` &summarize=`30` &dateFormat=`%d.%m.%Y` &paginate=1 !]
</div>
  	<div id="pagination">
		[+archiv_previous+]  - Стр.: [+archiv_pages+] -  [+archiv_next+]
	</div>


Пояснения:
1. Почему два вызова?
Два вызова тут потому, что с помощью одного вызова не получится сортировать раздельно папки и файлы (а ведь мы хотим, что бы папки были всегда первыми в списке).
2. Почему &id=`archiv`?
Это сделано на всякий случай, ведь на странице могут быть и другие вызовы Diito, например, Новости.
3. Зачем &noResults=` `?
А это для того, что бы вместо сообщения «Записей не найдено.» ничего не выводилось. Почему в одном вызове? Просто мы не хотим, что бы на странице не было этой надписи, если нет папок в поддиректории, а вот если не будет файлов — это надпись вполне уместна.
4. &filter=`template,15,8` и &filter=`template,16,8`
Вот тут выводим только то, что нужно: в первом файле выводим только те документы, которые с шаблоном id=15 (Шаблон папок), во втором только с шаблоном id=16 (Шаблон файлов).

Все остальное, я думаю, понятно.

Теперь те самые шаблоны: как я уже говорил, шаблон файлов может быть полностью пустым, а вот шаблон папок должен содержать вызов Ditto:

<h2>Файловый архив:</h2>
<div class="fd-example4">
<img src="assets/images/filetype/arrow_up.png"><a href="javascript:history.back()">Назад</a><hr>
[!Ditto? &id=`archiv` &parents=`[*id*]` &noResults=` ` &filter=`template,15,8` &tpl=`repository` &sortBy=`createdon` &summarize=`30` &dateFormat=`%d.%m.%Y` &paginate=1 !]
[!Ditto? &id=`archiv` &parents=`[*id*]` &filter=`template,16,8` &tpl=`repository` &sortBy=`createdon` &summarize=`30` &dateFormat=`%d.%m.%Y` &paginate=1 !]
</div>
  	<div id="pagination">
		[+archiv_previous+]  - Стр.: [+archiv_pages+] -  [+archiv_next+]
	</div>


Как Вы могли заметить, отличие только в том, что мы добавили ссылку Назад. И еще: к шаблону для Папок необходимо сделать TV параметр, я его назвал tvfile, а тип ввода сделал File.

Далее, что у нас содержит чанк &tpl=`repository`:
[[repome? &docId=`[+id+]` ]]


Т.е. в чанке у нас только вызов простого рукописного сниппета repome.
Что делает сниппет:
1. Ассоциирует различные расширения файлов с их иконками
2. Происходит подсчет размера файла, выделение имени файла
3. Распознавание шаблонов и формирование вывода

Сниппет RepoMe
Поясню основные параметры:
$idTemplateFolder - ID шаблона для Папки
$folderTitle - Какое поле использовать в качестве заголовка для папки
$folderDescription - Какое поле использовать для описания папки
$idTemplateFile - ID шаблона для Файла
$fileTitle - Какое поле использовать в качестве заголовка для файла
$fileDescription - Какое поле использовать для описания файла
$fileFile - Какое поле использовать для ссылки на файл
$fileDate - Какое поле использовать для показа время загрузки файла
$imgset - Ассоциация типов файлов с иконками
$imgPath - Путь к иконкам


Сам код сниппета я приводить не буду, я постарался его максимально прокомментировать и положил его в архив в конце статьи.

И, наконец, по стилям: те, кто используют FileDowload, наверное, заметили, что я использовал здесь его стили из примера — было лень переделывать (в архиве я приложил их).

Что должно получится:


И если войти в папку Вихревые генераторы:


О, и чуть не забыл: можно же ведь использовать ManagerManager. Убрав лишние поля (напомню, это делается через добавление иструкции mm_hideFields('список_полей_через_запятую', 'id_роли_пользователя', 'id_шаблона') в чанк mm_rules, если Вы держите правила там либо же в одноименный файл в директории managermanager).

Тогда, для менеджера, вид административной части будет такой:



Оцениваем:

+ Колоссальная простота использования, можно один раз объяснить принцип добавления новостей — а потом его же использовать при объяснении работы с файловым архивом
+ Реализуется на Ditto, а значит, теоретически, можно прикручивать всякие ditto примочки, например рейтинг
+ Реализуется в виде документов — а значит можно, имея фантазию, наделать кучу наворотов
+ Независимость названий файлов и папок от их имен
+ Независимость от физического расположения файлов
+ Поддержка иконок
+ В принципе, универсальность
+ Простой код: возможность допиливать как угодно

— Неудобная настройка вывода (отсутствие шаблонов и плейсхолдеров для них)
— Для максимальной адаптации для Вашего ресурса, возможно, придется много допиливать
— Все-таки до профессионального инструмента далековато

На что нужно обратить внимание:
Не забываем про
<base href='[(site_url)]'>

Не забываем разрешать менеджерам пользоваться FCKeditor'ом и загружать различные типы файлов

Скачать:
Архив со сниппетом и всем необходимым

На этом все. Возможно, если данная версия будет в ходу, будем ее улучшать, добавив шаблоны и прочие полезности.
Tags:
Hubs:
Total votes 9: ↑6 and ↓3+3
Comments3

Articles