我有一个新项目即将出现,其中我必须从头开始创建一个自定义内容编辑器(我将使用Laravel和Vue JS)。每个条目将具有由blocks
定义的结构,其中具有RTF内容fields
。这将是所需布局的一个示例:
我的问题是:如何在数据库中创建这些block_types
(标题,副标题,三列行...)和fields
?我认为使用占位符将HTML structure
字段保存到block_types
数据库表中可以解决问题。
HTML长文本保存到数据库中,进入“块类型”的“结构”字段
<div class="row">
<div class="col-4">///// CONTENT</div>
<div class="col-4">///// CONTENT</div>
<div class="col-4">///// CONTENT</div>
</div>
然后我将内容动态地按顺序添加到/// CONTENT
占位符中。 看起来很麻烦,所以我想我可能从一开始就很棘手,有什么建议吗?
PS:这是我到目前为止的数据库结构:
答案 0 :(得分:2)
将HTML保存到数据库几乎从来不是一个好主意。发生这种情况的一次是CMS,它提供了一个富文本界面,用户可以在其中使用简单的标签(粗体,列表等)来设置文本样式。
将标记存储在数据库中的根本问题是,由于它是硬编码在数据库中的,因此您会迷惑它的结构。
例如,如果您有一天决定确定存储的div
标签之一应该具有某个类,该怎么办?或数据属性。您必须更新每一行,或者更糟糕的是,它仍然会通过JS影响DOM中的更改,这意味着视图中的结果HTML确实与您存储的HTML不匹配。
存储标记还意味着以所有的空间存储超出您可能需要的数据。
更好的方法是定义一个块系统,其中有一个专用的块表,该表通过外键引用父UI表。所以可能是这样的:
表1:UI(根据您的示例,界面,标签的集合)
----------------------------
| id | ...other fields ... |
----------------------------
表2:阻止
---------------------------------
| id | ui_id | parent_id | type |
---------------------------------
表2将是递归的,因为它将存储代表父容器的块和子容器中的子块:
ui_id
与UI ID相关parent_id
与父块相关对于type
,您可以在此处采用这种方法并运行它。也许这是一个字符串,表示应该是哪种类型的块(例如“全宽”,“ grid-x3”等)。
然后,您当然可以通过类似PHP或JS的方式在视图中呈现此数据,以再次递归以确保获得所有嵌套级别。
因此,让我们运行一些示例数据。现在,我们将仅使用一种“类型”的块,即简单的“ div”。
UI表:
----------------------------
| id | ...other fields ... |
----------------------------
| 1 | ... |
----------------------------
块表:
---------------------------------
| id | ui_id | parent_id | type |
---------------------------------
| 1 | 1 | null | div |
---------------------------------
| 2 | 1 | 1 | div |
---------------------------------
| 3 | 1 | 2 | div |
---------------------------------
这表示嵌套块的三个级别,即在渲染时:
---------------------
| ----------------- |
| | ------------- | |
| | | | | |
| | ------------- | |
| ----------------- |
希望能为您提供一个起点。