Нодус
Один из вариантов перевода слова "nodus" на русский язык звучит как "сложное сплетение обстоятельств". Компонент Нодус именно для таких случаев и предназначен:
- когда контент сайта состоит из материалов разного типа с разным реквизитным составом
- материалы могут быть взаимосвязаны друг с другом единичной и множественной связью
- материалы могут быть связаны с различными рубрикаторами единичной и множественной связью
- существует потребность делать выборки материалов по различным критериям
В Нодусе применена технология DB.Schema - автоматическая настройка структуры базы данных, поэтому программисту не придется лезть в SQL-менеджер для создания таблиц и полей в них. Достаточно описать поля в PHP-файлах, и структура базы данных будет изменена автоматически. При заливке (или обновлении) проекта на хостинг также нет нужды беспокоиться о заливке и синхронизации таблиц - достаточно только залить PHP-файлы.
Базовые понятия
Материалы (записи, итемы, items)
Весь контент состоит из единичных материалов. Это страницы, новости, статьи, элементы каталога товаров и пр.
- Материал может быть отображен как в виде отдельной страницы, так и в виде блока на другой странице (или в обрамлении сайта).
- Каждому материалу можно задать его полный URL (для отображения в виде отдельной страницы). Если URL не задан, то он будет сформирован автоматически на основе его числового идентификатора.
- Каждый материал в Нодусе принадлежит к какому-либо типу данных.
- Можно делать выборки материалов по разным критериям.
Режим отображения (display mode)
Один и тот же материал можно отобразить в разных режимах. Возьмем, к примеру, элемент каталога товаров. Его можно отобразить как:
- Элемент в листинге раздела каталога
- Элемент витрины
- Строка при отображении содержимого корзины
- Карточка товара. Причем, если информации много, то у одного товара может быть и несколько карточек. Например: общая информация, технические характеристики, фотогалерея - везде отображается один и тот же материал, только в разных режимах.
- На карточке товара может быть отображен список сопутствующих товаров, внешний вид которого отличается от всех остальных режимов.
В самом простом случае (по умолчанию) у каждого материала есть два режима отображения:
- full - полная версия. Информация по материалу, отображаемая на отдельной странице
- teaser - "приманка", "завлекалка". Выводится в списках. Например, для новостей это - блок, содержащий дату, заголовок, анонс и ссылку на полную версию.
Для нужд каждого конкретного проекта разработчики вольны придумывать сколь угодно много режимов отображения того или иного материала.
Тип данных (datatype)
Тип данных - объект, описывающий реквизитный состав и поведение материала. Каждый тип данных характеризуется мнемокодом, а его логика реализуется специально написанным классом. Для добавления нового типа данных достаточно создать модуль с этим классом.
Навигация
В Нодусе есть механизм, позволяющий визуально редактировать древовидную структуру навигации. При этом ее можно внедрить в общую струкутуру навигации сайта через директиву %nodus в настройке "navigation". Для удобства пользователя при добавлении нового материала можно одновременно с этим добавить и новый узел в структуру навигации со ссылкой на создаваемый материал.
Таксономия
Это система словарей. Для добавления словаря достаточно создать модуль (совсем маленький - несколько строчек), описывающий этот словарь. Каждый словарь характеризутется мнемокодом.
- Словари могут быть как линейными, так и древовидными.
- Структуру словаря можно добавить в навигацию сайта.
Термин
Термин - элемент словаря. Материалы могут быть связаны с терминами как единичной, так и множественной связью. Каждому термину можно назначить URL, по которому будет отображаться список материалов, связанных с данным термином.
Селектор
Объект, описывающий выборку материалов того или иного типа по какому-то критерию. По одному или нескольким значениям полей, по признаку привязки к термину таксономии, по признаку привязки к другому материалу и т.д.
Результат выборки может быть отображен как отдельная страница (с постраничной навигацией), так и как блок на другой странице или в обрамлении сайта. Разумеется, при отображении выборки можно указать режим отображения выбранных материалов.
Каждый селектор характеризуется мнемокодом, а его логика реализована в специальном классе. Для добавления селектора достаточно создать модуль с этим классом.
Для каждого типа данных автоматически создается селектор по умолчанию с тем же самым мнемокодом, что и у типа. Он делает выборку по единственному критерию - принадлежности материала к данному типу. Этот селектор можно переопределить для добавления и изменения его логики.
Аналогично, для каждого словаря таксономии создается селектор по умолчанию для выборки материалов по термину.
Особенности администрирования
В нодусе есть единая таблица итемов и единый режим администрирования: в линейной таблице находятся итемы всех типов, отсортированные по дате последнего изменения. Сверху отображаются недавно измененные итемы, а давно забытые уходят в конец. Есть возможность отфильтровать по типу, а также поиск по строке.
При добавлении итема необходимо сначала указать тип, после чего приступить к редактированию нового итема в соответствии с реквизитным составом, характерным для указанного типа данных.
Как все это устроено
Рассмотрим файловую структуру компонента: app/components/Nodus.
- app/ - предназначен для хранения всего что может переопределить программист. Имеет свою структуру (повторяет структуру папок самого компонента):
- app/Datatype/ - сюда будем помещать описания типов данных и шаблоны для их отображения. По умолчанию там находятся два предустановленных типа: Page и News. Ими можно пользоваться для нужд проекта, изменять под те же нужды, а так же использовать как наглядное пособие.
- app/Selector/ - здесь будут жить классы селекторов. Предустановленных селекторов нет. Да и вообще подозреваю, что не на всяком проекте в этой директории что-то будет (время покажет).
- app/Taxonomy/ - а это место для классов таксономии. Тоже нет предустановленных, т.к. типичные словари (нужные большинству проектов) что-то не придумываются.
- app/views/ - шаблоны приложения. Можно трогать. Именно сюда нужно класть пользовательские шаблоны, при нужде копируя из стандартных и переименовывая (об этом отдельная тема).
- images - картинки и иконки компонента.
- lib - библиотеки компонента. Загляд и залаз в этот каталог с целью изучения приветствуется, а вот изменение и доработка напильником файлов в нем - категорически не рекомендуется.
- scripts - js-скрипты.
- views - шаблоны. Внутри есть своя структура:
- views/admin - шаблоны админки. Не трогать.
- views/ - стандартные шаблоны. Не трогать.
А далее следует набор статей, поясняющих с точки зрения разработчика как пользоваться Нодусом.
Инструкции для разработчика
Тренироваться будем на кошках. В качестве примера будем создавать каталог представителей семейства кошачьих, постепенно расширяя функционал.
- Создаем свой тип данных
- Простейшие селекторы
- Селекторы посложнее
- Таксономия
- Связи между материалами
- Вложенные типы
- Шаблоны отображения
- К вопросу о навигации
- Создание и редактирование материалов из скрипта
- Навигация по дате
- Кастомизация списка записей
- Кастомизация списка терминов
Важное замечание!!!
Нодус - это прежде всего механизм управления контентом, а не его отображения. Бывают такие случаи, когда стандартными контроллерами отобразить уже готовый контент сложно. В этом случае допустимо (и даже приветствуется) создать свой компонент, свои контроллеры, которые, используя бизнес-логику Нодуса, будут отображать контент так, как это необходимо.
Помните, что нет такой цели - сделать сайт, используя только стандартные средства. Есть цель - сделать сайт, удовлетворяющий условиям:
- Сайт должен хорошо работать
- Сайт должен быть создан с наименьшими затратами
- Сайт должен легко поддерживаться, развиваться и модифицироваться, в том числе и другими программистами (не только создателем).