免责声明:我确信之前已经回复过,但我在SO或Google上找不到任何内容。
所以,我有一个基本上由Page,Region,Widget格式组成的CMS。单个页面可以具有无限制的区域,而区域可以具有无限的窗口小部件。
现在我的架构看起来像这样:
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)
这适用于简单的小部件。我想要做的是让每个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
我讨厌的是我每次加载页面时都要做一堆查询。我必须:
这可能是一堆垃圾查询!一定有更好的方法。此时我对任何事情持开放态度。
感谢。
答案 0 :(得分:1)
您可以考虑通过浏览器加载来改变您的方法。因此,不要在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
通过这种方式,您可以实现简单快速的安全性,而不会使应用程序变得更加复杂。