加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – CMS的内容结构

发布时间:2020-12-13 22:30:22 所属栏目:PHP教程 来源:网络整理
导读:我正在开发模块化CMS,我正在考虑内容架构.我需要一个灵活的系统,可以轻松创建不同的内容类型.每种内容类型都有一个处理它的模块(或其他模块中的方法).该模块处理创建,操作和帮助显示内容(视图负责查看内容和模块为他们提供信息). 每种内容类型都有自己的表,
我正在开发模块化CMS,我正在考虑内容架构.我需要一个灵活的系统,可以轻松创建不同的内容类型.每种内容类型都有一个处理它的模块(或其他模块中的方法).该模块处理创建,操作和帮助显示内容(视图负责查看内容和模块为他们提供信息).

每种内容类型都有自己的表,并且不知道其他内容类型.

Contents和Content_types是负责存储有关内容的信息的表.

Contents
---------------------------------------------------------------------------------------
id    slug            content_type_id   in_table_id   language_id  uid       parent_id
1     about-us        1                 1             1            83j8je29  0
2     o-nama          1                 2             2            83j8je29  0
3     first-page      1                 3             1            12j83j28  0
4     prva-strana     1                 4             2            12j83j28  0
5     news            2                 1             1            mSk2919k  0
6     vijesti         2                 2             2            mSk2919k  0
7     breaking-title  3                 1             1            B8392mkA  5
8     vazna-vijest    3                 2             2            B8392mkA  6

Content_types
------------------
id   content_type 
1    page    
2    category   
3    article

Contents表包含内容的slug,内容类型,该类型内容表中内容的ID,语言ID,uid – 这是内容所特有的,因此我们可以轻松配对多语言内容,以及父母ID.

这是语言表……

Languages
---------------------------
id   friendly_name    sid
1    english          eng
2    hrvatski         cro

这是内容类型表的示例.

Pages
---------------------------------------------------------------
id  title       content                             author_id
1   About Us    This is a page about us blah blah   5
2   O nama      Ovo je stranica o nama              5
3   First Page  Content                             2
4   Prva strana Sadr?aj                             3

那么,这一切如何运作?

假设我们去:
http://www.website.org/en/about-us

>确定语言(en)并找出它的ID(即1)
>确定slu((约 – 我们)
>选择语言ID为1且slug“about-us”的内容
>确定内容类型和in_table_id
>调用负责打开(处理)该类型内容的模块
>模块现已加载.它现在找到ID为1的页面并显示它.

另一个例子:
http://www.website.org/en/news/breaking-title

>确定语言(en)并找出它的ID(即1)
>确定slu((新闻)
>我们有两个slu((打破标题)
>现在我们找到内容为“break-title”slug,其中父母是“新闻”
>调用负责打开(处理)该类型内容的模块
>模块现已加载.它现在找到ID为1的文章并显示它.

如果我们转到http://www.website.org/en/news/,它将确定它是一个类别并调用负责处理类别的模块并执行我们需要的操作(在这种情况下显示所有子项内容)

我想我想出了一个非常灵活的系统,但由于我不是真正有经验的程序员(我17岁),我不太确定,所以我问你对这个概念有什么看法?

解决方法

我最近成为了将这些类型的数据存储为 metadata的粉丝.显而易见的好处是,您可以为所有内容类型创建一个表,并且(具有5NF标准化数据库结构)最多可以存储两个用于存储的表元数据引用和元数据实际值.这允许高级别的数据抽象和持久性的一般模型.所有这些炒作的话都转化为更快的发展.

举个例子,Elgg是一个流行的基于php的社交网络框架,在这种存储方面做得很好. Flow3,一个概念但非常简洁的通用php开发框架,也使用元数据来保持持久性.

元数据方法的最大好处是您可以一劳永逸地忘记代码中的SQL语句.鉴于您拥有正确的持久性抽象,您可以创建持久性对象,如:

$car = new StdClass();
$car->type = 'car';
$car->fuel_required = 'petrol';
$car->engine_cc = 2400;
$car->max_passengers = 5;
$car-save();

并且您的持久性框架将通过迭代对象属性并将它们保存在元数据表中来关注save()函数本身.如果您需要所有这些的实例,我会再次建议安装并尝试Elgg.您将看到几乎任何类型的新内容都将插入到相同的3-4个表中.

关于使用元数据方法存在一些争议,主要是基于性能的.不可否认的是,使用这种方法,您的元表将很快填满.但是,假设您的索引已就位,即使元表中有数千万条记录,您的查询也会给出合理的响应时间.而且,最重要的是,如果您不希望随着业务的增长扩展基础架构,可以转向“Amazon s3”或其他分布式数据存储解决方案来满足您的可扩展性需求.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读