Куда идем?

В предыдущих статьях серии мы поверхностно рассмотрели структуру SEBLOD. Теперь пришло время копнуть немного глубже и разобраться в том, как и где компонент хранит данные, которые мы создаем.

Хранилища данных – это, можно сказать, сердце SEBLOD. Понять материал, описанный в этой статье, крайне важно.

Эта статья подразумевает, что вы знакомы с реляционными базами данных, базой данных Joomla и PhpMyAdmin. Если о чем-то из перечисленного вы слышите впервые, то советую для начала познакомиться с этим понятием поближе, иначе статья может показаться слишком сложной.

Прелесть и одновременно с тем сложность SEBLOD в том, что он позволяет хранить данные не в каких-то заранее созданных таблицах базы(как делают другие CCK-подобные компоненты), а записывать их куда угодно. Плюсы такого подхода очевидны: это и максимальная интеграция в Joomla и ее расширения, и огромная гибкость работы с данными. Минус же только один – высокая сложность освоения. Если вы не профессиональный программист, ну или по крайней мере не web-мастер c многолетним стажем, то сходу разобраться в хранилищах SEBLOD будет довольно сложно. Ну да ладно, давайте разбираться.

Хранилища данных SEBLOD. Первый взгляд

Как вы уже знаете из предыдущих статей серии, в SEBLOD мы управляем типами контента и поиска, которые, в свою очередь, состоят из полей. Поле – базовая единица SEBLOD. Что такое поле? Это ячейка, содержащая определенную информацию. Информация не храниться в поле, но постоянно считывается и записывается в него. Чтобы было понятнее, приведу пример из жизни.

Вы приходите в библиотеку. Цель вашего визита, получить информацию(книгу). Как вы это делаете? Вы подходите к библиотекарю и просите книгу N. Библиотекарь записывает себе название книги и уходит ее искать. Через некоторое время он приносит и выдает вам книгу. Вы читаете книгу, а затем приносите назад библиотекарю. Цель выполнена. Информация получена.

Теперь сопоставим пример с библиотекой и SEBLOD. База данных, в нашем случае, это библиотека. Данные – книги. А библиотекарь это как раз поле SEBLOD. Библиотекарь не хранит в себе данные(книги), но он общается с базой данных(библиотекой) получая из нее и затем возвращая на место именно те данные, которые нужны пользователю. В SEBLOD функция полей именно такая.

Теперь рассмотрим немного другую ситуацию. Вы решили сделать жест доброй воли и подарить библиотеке книгу. Вы приносите ее библиотекарю и говорите, что теперь она принадлежит библиотеке. Что библиотекарь должен сделать с книгой? Очевидно, поместить ее на хранение, но вопрос в том, куда именно ее поставить? Наверное туда, где потом ее будет легко найти. А это уже зависит от структуры библиотеки.

Аналогично, когда пользователь добавляет новые данные в поле SEBLOD, тот должен поместить эти данные на хранение в базу данных. Но куда именно? Это решать вам!

SEBLOD вы создаете структуру хранилища данных своими руками. При создании нового поля, ниже его основных настроек вы увидите форму выбора хранилища данных:

Хранилища данных SEBLOD

Здесь указывается:

  1. Формат хранения. В настоящее время в SEBLOD есть три формата хранения данных: Standart, Custom, Json. Подробнее о них мы поговорим ниже. Также можно вообще не использовать хранилище(None).
  2. Размещение таблицы хранения. Позволяет выбрать место, в котором будут храниться данные. Это может быть либо один из предустановленный типов контента(Article, Category, Message, User, User Group), либо любая из таблиц базы данных (Free).
  3. Таблица хранения. Таблица базы данных, в которой будут храниться данные поля. Данное поле появляется только тогда, когда в размещении выбрано Free.
  4. Поле хранения. Поле таблицы хранения, в котором будут размещаться данные поля SEBLOD.
  5. Модификатор. Позволяет создать новое поле(таблицу) базы данных или изменить существующие.

Форматы хранения

Разберем подробнее форматы хранения данных.

Формат 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. Например опции материалов «Показывать заголовок?», «Показывать категорию?» «Показывать автора?» и.т.д.

Для тех, кто не очень понял, картинка сравнения форматов:

Хранилища данных SEBLOD

Размещение таблицы хранения

Теперь, чтобы все окончательно прояснить, разберем несколько примеров размещения таблиц хранения.

Сохранение данных в существующем поле таблицы ядра Joomla.

Joomla имеет несколько основных таблиц в которых хранится контент. Пример такой таблицы #_content. Для каждой из таких таблиц(Article, Category, Message, User, User Group) Seblod при установки создает поля(поля SEBLOD), сохраняющие в них(таблицах ядра Joomla) данные. Именно этим и достигается полнейшая интеграция Seblod в Joomla. Типы контента Article, Category, Message, User, User Group, предустановленные по умолчанию, взаимодействуют напрямую с таблицами ядра Joomla, что позволяет работать со стандартным контентом Joomla.

Для того, чтобы добавить в Seblod поле с хранилищем в таблице ядра Joomla, воспользуемся следующей конструкцией:

Хранилища данных SEBLOD

Сохранение данных в дополнительном поле таблицы ядра Joomla.

Seblod также позволяет добавлять дополнительные поля в таблицу ядра Joomla.

Хранилища данных SEBLOD

Это позволяет, например, добавить материалу Joomla новое поле(скажем, теги). Но поскольку это, в некотором смысле, хак ядра Joomla, то создавать такие поля не рекомендуется. Иначе, при обновлении Joomla(а с версии 1.7 она научилась обновлять и БД), хоть и маловероятно, но таблицы ядра могут быть изменены и есть вероятность потерять все данные дополнительных полей таблиц ядра.

При прочих равных условиях для добавления поля к таблице ядра лучше воспользоваться следующим способом.

Сохранение данных в поле дополнительной таблицы базы данных Joomla.

По причине, описанной выше, не очень правильно создавать дополнительные поля для таблиц ядра Joomla. Гораздо лучше вынести все новые данные в отдельную таблицу и вязать ее с таблицей ядра через ID. Если вы ничего не поняли из предыдущего предложения и вы не айтишник, который изучал в вузе базы данных, то всё нормально :-). Здесь важно понимать, что все новые данные будут храниться в отдельной таблице, о существовании которой сама Joomla не знает и точно не потрет ее при обновлении, но при этом данная таблица будет содержать записи с теми же самыми идентификаторами, что и таблица ядра, а значит их легко можно связать. Этим займется сам SEBLOD. Смотрим рисунок:

Хранилища данных SEBLOD

Сохранение данных в любой таблице базы данных.

Вы не обязательно должны связывать ваше поле с базовыми типами контента Joomla, будь то статья или категория, пользователь или группа. Вы можете создать собственный тип контента, который будет храниться в ваших собственных таблицах и быть абсолютно независимым от материалов Joomla. Для этого используем следующий формат:

Хранилища данных SEBLOD

Но есть здесь и одно НО. Вы не сможете управлять данными такого типа контента из админки Joomla. Причина проста: вы не сможете их там увидеть, ведь, как было сказано выше, они не будут относиться к материалам или категориям, пользователям или группам.

Зато вы сможете создать свой небольшой интерфейс на фронтенде сайта. Примерно так:

  • Делаем тип поиска по нашему типу контента
  • Находим все записи(или не все? Это уже ваше дело)
  • Выводим их в виде списка
  • Делаем пункт меню на данный тип поиска
  • Добавляем ссылки на редактирование элементов данного типа контента
  • Настраиваем права доступа к данному типу контента

После небольшой допилки получится почти полноценный фронтенд-интерфейс.

Но лучше всего данный тип размещения подходит пока для разработчиков расширений Joomla. Они смогут написать нормальный интерфейс и для админки.

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

Заключение

На этом рассказ про хранилища данных Seblod заканчивается. Для полноценной работы с компонентом важно понимать всё, что здесь написано. Если вы не поняли все сразу, не отчаивайтесь. Я и сам очень долго разбирался в структуре хранения данных, просто эта тема сложна сама по себе. Немного времени, терпения и всё встанет на свои места.

Об авторе
Wedal
(Виталий). Веб-разработчик полного цикла (Full Stack). Создатель и автор сайта Wedal.ru.
Основной профиль – создание сайтов и расширений на CMS Joomla.
Добавить комментарий

Комментарии  
1
Насчет Custom Storage еще стоит отметить, что правильнее прописывать в виде:

field1[field2]

Где: Field1 - собственно, поле в БД, куда будут сохраняться данные (в одной из стандартной таблиц, или в специально созданной, соответствующей нашему приложению), а Field2 - тот самый разделитель с двойными двоеточиями.
Впрочем, это не критично, т.к. если в квадратных кавычках ничего не указать, то в качестве разделителя возьмется имя поля.
Также такое поле БД обязательно должно быть формата либо VarChar, либо Text.
1
Ай, Спасибо!
0
Огромное спасибо за ваши статьи!
Скажите пожалуйста, а что за программа, в которой у вас показываются таблицы БД? На оф. сайте в материалах тоже подобное встречалось
1
Serena, Navicat.
0
Спасибо! :lol:
0
спасибо за ваши труды!
P.S. на картинках Вы замазали префикс у таблиц, честно говоря не совсем понял зачем, но его видно в окне программки просмотра бд внизу(StatusBar): SELECT * FROM ...
0
Ghost_64rus, картинки взяты с официального сайта :-).
2
Тоже хочу сказать большое СПАСИБО!!! :lol: Имея опыт в написании обучающих статей, понимаю сколько это требует труда и времени. Ваши труды достойны наивысшей похвалы, еще раз спасибо.

И по существу, можно по подробней осветить вопрос поднятый в первом комментарии от athree насчет использования конструкций field1[field2]


Цитирую Ghost_64rus:

честно говоря не совсем понял зачем, но его видно в окне программки просмотра бд внизу(StatusBar): SELECT * FROM ...

а это просто позитивчик :lol: :lol: :lol:
0
Когда рассказывалось вот об этом :
2) Размещение таблицы хранения. Позволяет выбрать место, в котором будут храниться данные. Это может быть либо один из предустановленный типов контента(Article, Category, Message, User, User Group), либо любая из таблиц базы данных (Free).
стоило упомянуть, что тут могут быть не только предопределенные типы ( их действительно пять ), но и те, которые в окне App Folder Manager будут помечены как Featured, что даст возможность использовать эти каталоги как основу ( skeleton ) и использовать их тоже в качестве таблиц при выборе Standart.
Бывает крайне полезно для создания независимых структур для переноса в дальнейшем на новые сайты
0
Я еще практически не работал с таблицами БД, и представление имею только самое общее, на основе понятий что и как работает.
У меня вопрос такой: правильно ли я понимаю, что seblod сам не создает таблиц в БД, и если я хочу создать новую таблицу, я должен сначала это сделать непосредственно в БД при помощи отдельных прог, например той же navicat, и уже потом в seblod выбрать эту таблицу для наполнения?
Или технология создания таблиц другая?
0
Sambuka,

Цитата:

У меня вопрос такой: правильно ли я понимаю, что seblod сам не создает таблиц в БД

Еще как создает. Просто работайте в Seblod, создавайте типы контента, поля, выбирайте таблицы, всё, что нужно Seblod создаст сам.
0

Цитирую Wedal:

Sambuka,

Цитата:

У меня вопрос такой: правильно ли я понимаю, что seblod сам не создает таблиц в БД


Еще как создает. Просто работайте в Seblod, создавайте типы контента, поля, выбирайте таблицы, всё, что нужно Seblod создаст сам.

"Выбирать таблицы" из чего? Из уже существующих? Если я хочу создать абсолютно новую, как быть?
0
Sambuka, если хотите создать новую таблицу, то при создании нового поля не ставьте Alter. Таблица и ее название будут созданы автоматически.
0

Цитирую Wedal:

Sambuka, если хотите создать новую таблицу, то при создании нового поля не ставьте Alter. Таблица и ее название будут созданы автоматически.


Wedal, спасибо за совет, но не получилось. Правильно ли я понимаю: В области Storage галку у Alter не ставим. При этом поле Format/Location выбираем Custom или Standart? Если Custom то мне предлагают либо выбрать одну из категорий ядра или Free? Если Free - то предлагают выбрать из уже готовых таблиц. Какие поля в этом разделе надо выбирать?
0
Разобрался сам. На самом деле, таблицы сами по себе не создаются. А вот поля - да.
0

Цитирую Sambuka:

Разобрался сам. На самом деле, таблицы сами по себе не создаются. А вот поля - да.


Если верить автору (а не доверять ему причин нет), то таблицы так же создаются автоматически.
0
Где в Seblod 1.9 форма выбора хранилища данных? К какой версии ваши статьи? Просто я использую Joomla 1.5.26, вот поэтому такой компонент. За статьи спасибо огромное!
0
Валерий5, статьи для версии Seblod 2.
0
Еще вопрос по сохранению данных в отдельных таблицах. Вы объяснили что в этом случае форму стоит делать не в админке, а на фронтенде и добавить ссылку на редактирование. А как в этом варианте создать эту самую ссылку на редактирование элемента?
0
Уникальная серия статей на русском. Спасибо большое за ваш труд. Очень познавательно. Начал было делать свой первый сайт на К2, но случайно наткнулся на seblod и теперь просто не представляю, как можно использовать суррогаты аля К2.
0
Виталий, спасибо за замечательные статьи!
Хотелось бы относительно мест и формата хранения немного разъяснить для себя. Они ведь должны отличаться по производительности. Одно дело обработать стандартное поле, в котором только одно значение (можно работать на уровне SQL), а другое разбирать JSON(Custom) уже только на уровне PHP. И хотелось бы каких-то советов о том чем руководствоваться при выборе формата хранения и типа размещения.
1
VARion, хороший вопрос.

JSON подразумевает, что в одной ячейке таблицы БД хранится массив каких-то значений. Соответственно, чтобы получить доступ к одному из таких значений нужно:
1) Выполнить SQL-запрос на получение массива из ячейки таблицы БД.
2) Разобрать массив на отдельные значения.

В случае же использования стандартного хранилища одно значение помещается в одну ячейку и для доступа к нему нужно:
1) Выполнить SQL-запрос на получение этого значения.

На мой взгляд использование формата JSON оправданно тогда, когда массив, хранящийся в ячейке, используется целиком. К примеру, в Joomla, это настройки материала. Их несколько десятков штук и они используются всегда вместе. Заводить под каждую настройку отдельный столбец БД не слишком рационально.

Второй вариант использования JSON - когда заранее неизвестно количество данных массива. Это форматы SEBLOD FieldX и GroupX.

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

Если же ваше поле подразумевает только одно значение и в дальнейшем оно будет активно использоваться для поиска и фильтрации, то лучше подойдет стандартный формат.
0
Виталий, спасибо! Ясности стало больше. В таблице Joomla-материалов заметил ещё одну закономерность. Поля, которые сильно влияют на выборку данных, размещаются в отдельное поле. Например это статус материала, т.к. выборка на опубликованные происходит постоянно. А такие поля как изображение в выборке не интересны, т.к. это уже в выводе используется, поэтому в параметрах. Получается довольно рациональное использование БД: без лишних полей и гибко.
0
Здравствуйте, подскажи, пожалуйста, можно ли с помощью Seblog разделить таблицу content. А то она слишком большая и сайт притормаживает. Спасибо.
0
Дмитрийkz, нет. Будет только хуже. Кстати, не думаю, что тормоза связаны с таблицей content. Известны случаи, когда она содержала десятки тысяч материалов и все работало быстро.
0
Во фразе
"Иначе, при обновлении Joomla(а с версии 1.7 она научилась обновлять и БД), хоть и маловероятно, но таблицы ядра могут быть изменены и есть вероятность потерять все данные дополнительных таблиц."
Наверное, правильно все-таки сказать: дополнительных полей таблиц ядра.
0
ТанфильевTDI, да, конечно, вы правы. Поправил. Спасибо!
0
Фраза "При прочих равных условиях для добавления поля к таблице ядра лучше воспользоваться следующим способом."
сбивает с толку... Правильнее, наверное, так:
"Чтобы без вмешательства в ядро по своему усмотрению обогатить набор полей предусмотренный в предустановленных таблицах, следует поступать следующим способом"
0
Отличный ресурс по SEBLOD. Материалы описаны максимально доступно и понятно. Спасибо за труд и открытость ;-)