
В предыдущих статьях серии мы поверхностно рассмотрели структуру SEBLOD. Теперь пришло время копнуть немного глубже и разобраться в том, как и где компонент хранит данные, которые мы создаем.
Хранилища данных – это, можно сказать, сердце SEBLOD. Понять материал, описанный в этой статье, крайне важно.
Эта статья подразумевает, что вы знакомы с реляционными базами данных, базой данных Joomla и PhpMyAdmin. Если о чем-то из перечисленного вы слышите впервые, то советую для начала познакомиться с этим понятием поближе, иначе статья может показаться слишком сложной.
Содержание
Прелесть и одновременно с тем сложность SEBLOD в том, что он позволяет хранить данные не в каких-то заранее созданных таблицах базы(как делают другие CCK-подобные компоненты), а записывать их куда угодно. Плюсы такого подхода очевидны: это и максимальная интеграция в Joomla и ее расширения, и огромная гибкость работы с данными. Минус же только один – высокая сложность освоения. Если вы не профессиональный программист, ну или по крайней мере не web-мастер c многолетним стажем, то сходу разобраться в хранилищах SEBLOD будет довольно сложно. Ну да ладно, давайте разбираться.
Хранилища данных SEBLOD. Первый взгляд
Как вы уже знаете из предыдущих статей серии, в SEBLOD мы управляем типами контента и поиска, которые, в свою очередь, состоят из полей. Поле – базовая единица SEBLOD. Что такое поле? Это ячейка, содержащая определенную информацию. Информация не храниться в поле, но постоянно считывается и записывается в него. Чтобы было понятнее, приведу пример из жизни.
Вы приходите в библиотеку. Цель вашего визита, получить информацию(книгу). Как вы это делаете? Вы подходите к библиотекарю и просите книгу N. Библиотекарь записывает себе название книги и уходит ее искать. Через некоторое время он приносит и выдает вам книгу. Вы читаете книгу, а затем приносите назад библиотекарю. Цель выполнена. Информация получена.
Теперь сопоставим пример с библиотекой и SEBLOD. База данных, в нашем случае, это библиотека. Данные – книги. А библиотекарь это как раз поле SEBLOD. Библиотекарь не хранит в себе данные(книги), но он общается с базой данных(библиотекой) получая из нее и затем возвращая на место именно те данные, которые нужны пользователю. В SEBLOD функция полей именно такая.
Теперь рассмотрим немного другую ситуацию. Вы решили сделать жест доброй воли и подарить библиотеке книгу. Вы приносите ее библиотекарю и говорите, что теперь она принадлежит библиотеке. Что библиотекарь должен сделать с книгой? Очевидно, поместить ее на хранение, но вопрос в том, куда именно ее поставить? Наверное туда, где потом ее будет легко найти. А это уже зависит от структуры библиотеки.
Аналогично, когда пользователь добавляет новые данные в поле SEBLOD, тот должен поместить эти данные на хранение в базу данных. Но куда именно? Это решать вам!
SEBLOD вы создаете структуру хранилища данных своими руками. При создании нового поля, ниже его основных настроек вы увидите форму выбора хранилища данных:
Здесь указывается:
- Формат хранения. В настоящее время в SEBLOD есть три формата хранения данных: Standart, Custom, Json. Подробнее о них мы поговорим ниже. Также можно вообще не использовать хранилище(None).
- Размещение таблицы хранения. Позволяет выбрать место, в котором будут храниться данные. Это может быть либо один из предустановленный типов контента(Article, Category, Message, User, User Group), либо любая из таблиц базы данных (Free).
- Таблица хранения. Таблица базы данных, в которой будут храниться данные поля. Данное поле появляется только тогда, когда в размещении выбрано Free.
- Поле хранения. Поле таблицы хранения, в котором будут размещаться данные поля SEBLOD.
- Модификатор. Позволяет создать новое поле(таблицу) базы данных или изменить существующие.
Форматы хранения
Разберем подробнее форматы хранения данных.
Формат Standart
Формат Standart сохраняет данные полей в классическом виде 1 поле БД = 1 поле SEBLOD. В этом формате поле базы данных хранит только информацию из поля SEBLOD и ничего больше. Большинство расширений Joomla хранят данный в базе таким же образом.
Формат Сustom
Custom гораздо более интересный формат, чем Standart. Это нечто вроде ноу-хау SEBLOD, выделяющего его из массы CCK-подобных компонентов.
Формат Custom позволяет хранить в одном поле базы данных данные нескольких полей SEBLOD. Количество полей/данных ограничивается только размерами поля базы данных(типом этого поля). Как это работает? Данные сохраняются в следующем формате:
::[имя поля SEBLOD]::[данные]
Последовательностей имен полей/данных может быть несколько. Для примера посмотрим, как сохраняются данные в поле контента Joomla:
: : cck : : 1 : : /cck : :<br />: :introtext: :<p style="text-align: justify;">Кролики это не только ценный мех, но еще 3-4 килограмма диетического легкоусвояемого мяса.</p>: :/introtext: :<br />: :fulltext: :<p>Много, много мяса</p>: :/fulltext: :
Переведем в более читаемый вид:
: : cck : : 1 : :/cck : :
<br />
: : introtext : :<p style="text-align: justify;">Кролики это не только ценный мех, но еще 3-4 килограмма диетического легкоусвояемого мяса.</p>: : /introtext : :
<br />
: :fulltext: :<p>Много, много мяса</p>: :/fulltext : :
Здесь в одном поле базы данных хранятся данные сразу трех полей SEBLOD: cck, introtext, fulltext.
Если мы выберем формат Custom и это поле для хранения, то в нем будет каждый раз создаваться уже четыре строчки: cck, introtext, fulltext и новое поле, которое мы добавили.
Заметьте, что поля Article_introtext и Category_description должны храниться именно в формате Custom для интеграции Seblod в Joomla.
Формат Json
Формат Json очень похож на формат Custom (точнее наоборот – это Custom похож на Json)
Json также сохраняет данные нескольких полей SEBLOD в одном поле базы данных, но при этом используется синтаксис Json. Пример:
"show_title":"1","link_titles":"","show_intro":""
К слову, в этом формате хранятся все атрибуты Joomla. Например опции материалов «Показывать заголовок?», «Показывать категорию?» «Показывать автора?» и.т.д.
Для тех, кто не очень понял, картинка сравнения форматов:
Размещение таблицы хранения
Теперь, чтобы все окончательно прояснить, разберем несколько примеров размещения таблиц хранения.
Сохранение данных в существующем поле таблицы ядра Joomla.
Joomla имеет несколько основных таблиц в которых хранится контент. Пример такой таблицы #_content. Для каждой из таких таблиц(Article, Category, Message, User, User Group) Seblod при установки создает поля(поля SEBLOD), сохраняющие в них(таблицах ядра Joomla) данные. Именно этим и достигается полнейшая интеграция Seblod в Joomla. Типы контента Article, Category, Message, User, User Group, предустановленные по умолчанию, взаимодействуют напрямую с таблицами ядра Joomla, что позволяет работать со стандартным контентом Joomla.
Для того, чтобы добавить в Seblod поле с хранилищем в таблице ядра Joomla, воспользуемся следующей конструкцией:
Сохранение данных в дополнительном поле таблицы ядра Joomla.
Seblod также позволяет добавлять дополнительные поля в таблицу ядра Joomla.
Это позволяет, например, добавить материалу Joomla новое поле(скажем, теги). Но поскольку это, в некотором смысле, хак ядра Joomla, то создавать такие поля не рекомендуется. Иначе, при обновлении Joomla(а с версии 1.7 она научилась обновлять и БД), хоть и маловероятно, но таблицы ядра могут быть изменены и есть вероятность потерять все данные дополнительных полей таблиц ядра.
При прочих равных условиях для добавления поля к таблице ядра лучше воспользоваться следующим способом.
Сохранение данных в поле дополнительной таблицы базы данных Joomla.
По причине, описанной выше, не очень правильно создавать дополнительные поля для таблиц ядра Joomla. Гораздо лучше вынести все новые данные в отдельную таблицу и вязать ее с таблицей ядра через ID. Если вы ничего не поняли из предыдущего предложения и вы не айтишник, который изучал в вузе базы данных, то всё нормально :-). Здесь важно понимать, что все новые данные будут храниться в отдельной таблице, о существовании которой сама Joomla не знает и точно не потрет ее при обновлении, но при этом данная таблица будет содержать записи с теми же самыми идентификаторами, что и таблица ядра, а значит их легко можно связать. Этим займется сам SEBLOD. Смотрим рисунок:
Сохранение данных в любой таблице базы данных.
Вы не обязательно должны связывать ваше поле с базовыми типами контента Joomla, будь то статья или категория, пользователь или группа. Вы можете создать собственный тип контента, который будет храниться в ваших собственных таблицах и быть абсолютно независимым от материалов Joomla. Для этого используем следующий формат:
Но есть здесь и одно НО. Вы не сможете управлять данными такого типа контента из админки Joomla. Причина проста: вы не сможете их там увидеть, ведь, как было сказано выше, они не будут относиться к материалам или категориям, пользователям или группам.
Зато вы сможете создать свой небольшой интерфейс на фронтенде сайта. Примерно так:
- Делаем тип поиска по нашему типу контента
- Находим все записи(или не все? Это уже ваше дело)
- Выводим их в виде списка
- Делаем пункт меню на данный тип поиска
- Добавляем ссылки на редактирование элементов данного типа контента
- Настраиваем права доступа к данному типу контента
После небольшой допилки получится почти полноценный фронтенд-интерфейс.
Но лучше всего данный тип размещения подходит пока для разработчиков расширений Joomla. Они смогут написать нормальный интерфейс и для админки.
Надеюсь, через некоторое время разработчики смогут реализовать также и простое создание интерфейса для типа контента в админке, но пока его нет.
Заключение
На этом рассказ про хранилища данных Seblod заканчивается. Для полноценной работы с компонентом важно понимать всё, что здесь написано. Если вы не поняли все сразу, не отчаивайтесь. Я и сам очень долго разбирался в структуре хранения данных, просто эта тема сложна сама по себе. Немного времени, терпения и всё встанет на свои места.
field1[field2]
Где: Field1 - собственно, поле в БД, куда будут сохраняться данные (в одной из стандартной таблиц, или в специально созданной, соответствующей нашему приложению), а Field2 - тот самый разделитель с двойными двоеточиями.
Впрочем, это не критично, т.к. если в квадратных кавычках ничего не указать, то в качестве разделителя возьмется имя поля.
Также такое поле БД обязательно должно быть формата либо VarChar, либо Text.
Скажите пожалуйста, а что за программа, в которой у вас показываются таблицы БД? На оф. сайте в материалах тоже подобное встречалось
P.S. на картинках Вы замазали префикс у таблиц, честно говоря не совсем понял зачем, но его видно в окне программки просмотра бд внизу(StatusBar): SELECT * FROM ...
И по существу, можно по подробней осветить вопрос поднятый в первом комментарии от athree насчет использования конструкций field1[field2]
2) Размещение таблицы хранения. Позволяет выбрать место, в котором будут храниться данные. Это может быть либо один из предустановленный типов контента(Article, Category, Message, User, User Group), либо любая из таблиц базы данных (Free).
стоило упомянуть, что тут могут быть не только предопределенные типы ( их действительно пять ), но и те, которые в окне App Folder Manager будут помечены как Featured, что даст возможность использовать эти каталоги как основу ( skeleton ) и использовать их тоже в качестве таблиц при выборе Standart.
Бывает крайне полезно для создания независимых структур для переноса в дальнейшем на новые сайты
У меня вопрос такой: правильно ли я понимаю, что seblod сам не создает таблиц в БД, и если я хочу создать новую таблицу, я должен сначала это сделать непосредственно в БД при помощи отдельных прог, например той же navicat, и уже потом в seblod выбрать эту таблицу для наполнения?
Или технология создания таблиц другая?
Wedal, спасибо за совет, но не получилось. Правильно ли я понимаю: В области Storage галку у Alter не ставим. При этом поле Format/Location выбираем Custom или Standart? Если Custom то мне предлагают либо выбрать одну из категорий ядра или Free? Если Free - то предлагают выбрать из уже готовых таблиц. Какие поля в этом разделе надо выбирать?
Если верить автору (а не доверять ему причин нет), то таблицы так же создаются автоматически.
Хотелось бы относительно мест и формата хранения немного разъяснить для себя. Они ведь должны отличаться по производительности. Одно дело обработать стандартное поле, в котором только одно значение (можно работать на уровне SQL), а другое разбирать JSON(Custom) уже только на уровне PHP. И хотелось бы каких-то советов о том чем руководствоваться при выборе формата хранения и типа размещения.
JSON подразумевает, что в одной ячейке таблицы БД хранится массив каких-то значений. Соответственно, чтобы получить доступ к одному из таких значений нужно:
1) Выполнить SQL-запрос на получение массива из ячейки таблицы БД.
2) Разобрать массив на отдельные значения.
В случае же использования стандартного хранилища одно значение помещается в одну ячейку и для доступа к нему нужно:
1) Выполнить SQL-запрос на получение этого значения.
На мой взгляд использование формата JSON оправданно тогда, когда массив, хранящийся в ячейке, используется целиком. К примеру, в Joomla, это настройки материала. Их несколько десятков штук и они используются всегда вместе. Заводить под каждую настройку отдельный столбец БД не слишком рационально.
Второй вариант использования JSON - когда заранее неизвестно количество данных массива. Это форматы SEBLOD FieldX и GroupX.
Третий вариант - множественный выбор - когда в одну ячейку помещается несколько значений, доступных для выбора. Например, выбрано несколько марок автомобилей из всего разнообразия марок.
Если же ваше поле подразумевает только одно значение и в дальнейшем оно будет активно использоваться для поиска и фильтрации, то лучше подойдет стандартный формат.
"Иначе, при обновлении Joomla(а с версии 1.7 она научилась обновлять и БД), хоть и маловероятно, но таблицы ядра могут быть изменены и есть вероятность потерять все данные дополнительных таблиц."
Наверное, правильно все-таки сказать: дополнительных полей таблиц ядра.
сбивает с толку... Правильнее, наверное, так:
"Чтобы без вмешательства в ядро по своему усмотрению обогатить набор полей предусмотренный в предустановленных таблицах, следует поступать следующим способом"