Схема MySQL для виджетов в CMS - PullRequest
1 голос
/ 04 февраля 2012

Отказ от ответственности: я уверен, что на этот вопрос уже был дан ответ, но я не могу найти что-либо в SO или Google.

Итак, у меня есть CMS, которая по существу состоит из формата Page, Region, Widget. Одна страница может иметь неограниченное количество регионов, а регион может иметь неограниченное количество виджетов.

Прямо сейчас моя схема выглядит так:

Table: pages
Columns: id, title, uri, ...

Table: regions
Columns: id, page_id, name, title

Table: widget_types
Columns: id, title, active

Table: widget_assignments
Columns: id, region_id, widget_type_id, data 
(data represents content/settings for a specific instance of a Widget)

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

Table: wt_content
Columns: id, content

Пример более сложного виджета (например, форумов) может выглядеть примерно так:

Table: wt_forums
Columns: id, ...

Table: wt_forum_threads
Columns: id, ...

Table: wt_forum_categories
Columns: id, ...

Table: wt_forum_settings
Columns: id, ...

Единственный способ, которым я знаю, как это сделать, - это добавить столбец table и reference_id в таблицу widget_assignments, например:

Table: widget_assignments
Columns: id, region_id, widget_type_id, table, reference_id 

Я ненавижу это из-за того, что мне придется делать кучу запросов при каждой загрузке страницы. Я должен буду:

  1. ВЫБЕРИТЕ все назначения виджетов и регионы для текущей страницы (это один запрос с объединениями)
  2. Затем переберите каждое назначение виджета и найдите фактический виджет.

Это потенциально дерьмовая нагрузка на запросы! Там должен быть лучший путь. Я открыт для всего на данный момент.

Спасибо.

1 Ответ

1 голос
/ 04 февраля 2012

Вы можете изменить свой подход, просто загрузив его из браузера. Так что не генерируйте полную страницу в ваших PHP-скриптах, а генерируйте только базовую страницу с заполнителями. Затем пусть что-то вроде JQuery загружает части страницы.

Пример для изображений:

http://www.appelsiini.net/projects/lazyload

Это генерирует больше запросов к серверу, но генерирует очень чистый код. Ваш процесс будет выглядеть так:

Browser -> index.php -> PHP generates a layout HTML -> browser -> browser requests specific parts needed.

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

<div class="widget" widgetUrl="http://mydomain.com/widgets/2322?optionshere">
$(this).load($(this).attr('widgetUrl'));

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

Вы можете сделать это почти полностью RESTfull, что также может уменьшить объем необходимого кода.

Если виджеты являются частными, вы можете рассмотреть возможность добавления области видимости, например:

http://mydomain.com/users/123/widgets/2322?optionshere

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...