Архитектура (OLD)

Материал из Smart Core Wiki

Версия от 02:17, 23 декабря 2011; Digi (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

ВНИМАНИЕ! эта статья требует доработки! информация на ней может быть не актуальной.

Для введения в основы архитектуры, перейдите на страницу -> Основы архитектуры.


Рассмотрим архитектуру системы на следующем примере, предположим пользователь запросил следующий ресурс:

http://site.ru/about/contacts/

Это означает, что запрошены 3 папки:

  1. корневая папка сайта.
  2. about
  3. contacts

Далее, в настройках сайта, указываем что макетом для корневой папки является main.tpl и он же наследуется во все вложенные папки, если он (макет) далее не будет переопределён явно.

Макет предствляет из себя файл примерно такого содержания:

Рис.1 "Макет"
<div id="head">
<?php $this->container('head')?>
</div>
 
<div id="menu">
<?php $this->container('menu')?>
</div>
 
<div id="content">
<?php $this->container('content')?>
</div>
 
<div id="footer">
<?php $this->container('footer')?>
</div>

Схематично такой макет можно представить как показано на Рис.1 "Макет".

Надо заметить, что в макетах указывается только содержимое тега <body>, а DOCTYPE, <html> и <head> секции, а также их закрытие, обеспечивает сам шаблонизатор. Также шаблонизатору поступает иформация какие стили и скрипты подключить и другие данные для секции <head>.

Контейнеры в системе являются некоторой логической сущностью, в которые можно "помещать" ноды. а Ноды в свою очередь являются точками подключения модулей. Например если в контейнер menu, подключить модуль Текстер и задать значения текста для этой ноды например "Hi, Menu!", то в итоговой html странице, сгенерированной движком, будет следующий код:

...
<div id="menu">
Hi, Menu!
</div>
...

Предположим в этот же контейнер menu, мы поместим еще один модуль, например модуль Menu, в ноде, подключающей данный модуль, будет указана некотороая группа меню, которую требуется отобразить в данном месте, предположим это будет 2 пукнта:

  1. О компании (/about/)
  2. Новости (/news/)

Соотвественно сам код, который будет сгенерирован модулем, будет иметь следующй вид:

<ul>
    <li><a href="/about/">О компании</a></li>
    <li><a href="/news/">Новости </a></li>
</ul>

А в общем шаблоне он встроится так:

...
<div id="menu">
Hi, Menu!
<ul>
    <li><a href="/about/">О компании</a></li>
    <li><a href="/news/">Новости </a></li>
</ul>
</div>
...

К примеру в данном случае позиции нод, подключающие модули имеют следующие значения:

Но можно поменять позиции местами:

И тогда итоговая страница будет выглядеть следующим образом:

...
<div id="menu">
<ul>
    <li><a href="/about/">О компании</a></li>
    <li><a href="/news/">Новости </a></li>
</ul>
Hi, Menu!
</div>
...

Вся информация по нодам хранится в таблице engine_nodes.

Далее рассмотрим механизм наследования. Он реализован на основе контейнеров т.е. в системе указывается какой контейнер начиная с какой папки наследуется, а если быть точнее, то наследуются ноды подключенные в этот контейнер.

В нашем примере целесообразно наследовать 3 контейнера, это:

  1. head
  2. menu
  3. footer

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

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

Вернувшись к нашему примеру,

http://site.ru/about/contacts/

Теперь можно разобрать что конкретно будет собираться системой. Предположим в контейнерах head и footer, у нас подключены по одной ноде Текстера со своими текстовочками, например в шапке некий слоган, а в футере копирайты. В контейнере меню, как было описано выше, будет подключены 2 ноды. В резальутате запросив папку contacts, система (если быть точнее, метод Kernel->buildNodesList();) сгенерирует следующий список нод:


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

Разумеется в системе предусмотрены (хотя и не всё еще реализовано) такие механизмы как: подключение стилей и скриптов, настройка метаданных, блокировка наследованных макетов и нод, с наследованием и без, подмена макета, технология представлений и т.д. но это уже больше относится к деталям, чем к концепции.

* Важное замечание! Ноды в Smart Core ничего общего не имеют с нодами в Drupal.
Личные инструменты
Пространства имён
Варианты
Действия
Основные разделы
Ссылки
Навигация
Инструменты