延續上一篇文章<Drupal Commerce 概念架構>,本來打算要繼續講 Commerce 與 Views 整合的主題。不過由於這個主題牽涉到 Views 中的 Relationship 項目,而要講清楚 Relationship 的用法又會涉及 Entity 的觀念,想來想去,覺得還是先把這些觀念弄清楚再繼續講下去會比較好。

 

先簡單講一下 "entity" 這個字 的中文翻譯。"entity" 常見的翻譯是「實體」,但嚴格來說(好啦,根據我的哲學癖來說),這不是一個好的翻法。哲學上來說,「實體」通常是用來翻譯 "substance" 這個字,而 "substance" 到底是指啥可是個歷史上出名複雜難解的議題(可以去 SEP 史丹佛哲學百科查一下)。撇開煩雜的理論問題不談,在搜羅語詞慣用法的維基字典上,"entity" 意義也不同於 "substance"。(這裡是指英文版。中文版的翻譯基本上完全忽視兩者意義和用法上差異,把兩者都翻成「實體」。然而基本上就算是看英文版,你也需要一些哲學訓練才能搞清楚差別在哪裡。

為什麼 "substance" 常被翻成「實體」?因為它有表達物質、事物的本質等意思,通常是指那些佔有時空位置的基本存有物以及/或者在環境變化中能夠保持獨立自存的東西(相對於事件或可被擁有/喪失的性質)。而 "entity" 則較為抽象,它表達任何獨立自存的東西,而這些東西不一定會有物質性的存在。像是抽象存有物(數字)或虛擬存有物(孫悟空),或是無形體、非物理的東西(像是語言、鬼魂或精神...等等;如果你發覺你沒法接受這些東西有「存在」可言,恭喜你,你剛發現自己是個物理論者了)。甚至在比較寬鬆的用法中,它可以指存有或存在的狀態本身

在這些的意義下,"entity" 比 "substance" 來得廣泛與抽象。在其他較具體的脈絡下, "entity"則被用來指涉抽象或具體的組織單位。在商業脈絡中,"entity" 指能夠進行商業活動的獨特單位,像是一家公司、一個部門、一個團隊組織,甚至是一個人。在計算科學中,則是指任何可以被存入資料庫的資訊或資料。如果可以理解 "entity" 和 "substance" 的這層對比,就可以為什麼 "entity" 不該被翻成「實體」(因為那只是它的一部份而已嘛),而被翻譯成「存有物」、「元目」甚至俗稱的「東西」都還好一點。由於我們在這裡討論的是計算科學中的應用,把 "entity" 翻成「單元」,比較可以保持它既能表達具體事物又能表達抽象存有的意涵。

接下來回去講 Drupal。

Node 的時代

在 Drupal 4.x ~ 6.x 的發展過程中,內容管理的主要角色是 node(中文多翻成「節點」)。在這個階段,CCK 模組是必備的第3方模組,用來規劃與自訂各種 node type,也就是「內容類型」。而內容類型之間的差異就在於其組成元件—field(欄位)—的不同搭配方式。而 node 之外的其他項目,比方說分類詞(taxonomy term)或者位置(Location),則被設計成可以被組裝到 node 上的配件。

以分類詞來說,使用過 Drupal 4.x ~ 6.x 的人都應該很熟悉 taxonomy 模組,通常的設定方式就是在主分類(vocabuary)設定頁中,將某個主分類指派給一個或多個內容類型。設定好之後,在新增這些類型的 node 的表單中就會出現屬於該主分類的分類詞選單或輸入框,讓使用者替該 node 指派或建立分類屬性。

然而,在這個階段大家會共同有的一個困擾就是,這些被額外裝配進來的屬性項目不像 CCK 欄位那樣好控制或者客製化。在 CCK 的「欄位管理」裡頭,你可以自由拖放欄位次序,調整不同欄位在 node 的檢視模式(view mode)中的顯示方式。Taxonomy 等模組雖然可以大大擴充 node 的屬性與功能,但是沒法子像 CCK 欄位那樣有彈性,可以方便地進行調整。後來開發出的 taxonomy image 或者 content taxonomy 等模組就是在這樣的架構下試圖去克服這個缺點,後來也的確愈來愈流行,變成幾乎像 CCK 那樣的必備模組。

Enity 的概念

可以說 Enitty 的概念就是為了解決這個問題而提出來的。畢竟,如果 CCK 這麼好用,那為什麼不把所有的東西都納入這個架構呢?Drupal 7.x 放棄了 node 為設計中心的架構,而改採一種去中心式的、但可以彼此關聯的分散架構。在這個新架構底下,沒有 node 和屬性的區別,只有 entity 之間的差異。這個重大的改變來自三個方面:

  1. CCK被納入核心模組,改成 Field 模組。日後所有可以加入 node 的屬性都以欄位的方式呈現,而同一個欄位可以在不同的 entity 中被重複使用。
  2. Entity 之間能夠完全以 reference 欄位的方式來彼此關聯、引用。這保持了不同 entity 的關聯性,也讓關聯欄位有了調整彈性。
  3. Entity 表單欄位與欄位顯示(display)的分離。這點完全解放了 node 前後台的對應架構,讓 node 的表單和檢視模式可以獨立開來,不僅可以讓表單元素可以在檢視模式中有不同的排版順序,更可以隱藏有資料庫用途但不必要顯示的元素。而其他模組(如 views attach)也可以利用這點,將其他資料化為顯示欄位,呈現在 node 裡頭,而不必新增一個表單欄位才能做到。
 

這樣講可能還是太過抽象,舉一些例子可能會比較好懂。情況是,幾乎所有過去被當作是附加屬性的東西,像是 user、taxonomy、comment 等等,在 7.x 裏面都變成了獨立的、可裝配欄位的 entity。所以我們可以在某個 vocabuary 裡頭加裝圖片欄位 field_image,替不同的分類詞加上不同的代表圖片。我們也可以在 comment 中重複使用同一個圖片欄位 field_image,讓發表回應的使用者可以自行上傳與該回應有關的圖片(比方說螢幕截圖)。或者我們可以在 user 裡頭加裝一個文字欄位,蒐集使用者的姓名、聯絡電話或者郵寄地址。

Drupal 7.x 預設有兩個 reference 欄位,user reference 與 term reference 。可以用來在 entity 中引入 user 和 taxonomy tern 這兩種 entity。不過加裝了 Entity Reference 這個模組之後,基本上你可以在任一種 entity 中引入任何其他種的 entity。比方說,一般的情況下,在「文章」entity 中可以引用 user 和 term 這兩種 entity,用來連結相關的「作者」和「分類標籤」。在進階的用法裡,你可以在 user 中引用 term,將使用者分門別類。或者在 comment 中引用「部落格文章」entity,讓使用者在撰寫評論時可以加入「相關部落格」資訊。假設你有 n 種 entity,就可以有 n × (n-1) 種引用連結的方式,全看你要滿足什麼樣的需求。

Entity 與 Views

這種去中心但又可互相引用的設計,帶來了內容架構上的超大彈性。這不僅影響到單一的 node 會如何編輯和呈現,也讓 Views 的建置工作有了根本的變化。在過去的 Views 管理介面中,user、term 裡頭的相關資訊預設都被放在「欄位」裡頭,和所有 node 裡頭的欄位沒有兩樣。但是在 Views 3.x 裡頭,「欄位」裡頭將沒有固定的項目,而是會隨著前述 reference (引用)關係變化。

舉例來說,當我們在 Views 過濾出屬於 A entity 的節點項目時,可加入的「欄位」項目將只限於與 A 有關的欄位。假設 A 透過 reference 欄位引用了 B entity,那麼就可以利用這個引用關係,把屬於 B 的相關資訊加到「欄位」中,共同呈現在 views display 裏面。具體說來就是,你可以製作一張表格,列出你所有的「農產品」節點標題以及它們所引用的的「分類」標題。在過去,這種作法大概就是可處理的極限了。但在 drupal 7 中,如果你的「分類」項目中有圖片或文字欄位(比方說「英文標題」),你都可以透過在 Views 中加入這種引用關係,而把這些圖片或文字等屬於 B 的欄位資訊,加入到同一張表格裡頭。(換言之就是,你可以用「分類圖片」取代「分類標題」來標示出產品的類別)

在 Views 中利用引用關係而加入所需欄位的具體作法,就是使用它的 Relationship 功能。Views 7.x 的一個重大變革就是,過去少用甚至完全不會用到的功能, relationship,變成了和 Context Filter(過去的 Argument)同等重要與基本的項目。如果你想要製作豐富與多元的 view display 來呈現複雜的資料關係,了解 entity 的概念以及怎麼樣在 Views 中透過 Relatinship 來結合不同的 entity 欄位,將會是必要的學習過程。

原文地址:http://www.drupaltky.org/article/43

淺談 Entity 的概念的更多相关文章

  1. 修練營ASP.NET]淺談多層式架構 (Multi Tiers)

    從需求談起 我們舉個小例子來理解一般的方式與多層的方式有何不同 假設:我需要顯示最近三個月內,所有營業員的銷售金額成績排名 一般的做法: 在一個畫面中,拉個GridView,一個SqlDataSouc ...

  2. 淺談Coach思考模式

    我現在是個窮屌,沒錯.我清楚的知道這一點,但是我也知道,我能改變. 之前幹了7年的評估行業,中間換了3家公司,第一家公司待的時間最長,待了5年.2018年開始,我就在思考轉行.之前在第一家企業接觸過一 ...

  3. 淺談Unity 5.4新功能:Light Probe Proxy Volume

    作者:CHRISTOPHER POPE 原文連結 Unity 5.4進入到Beta的階段.当中一個特別的功能是光照探頭代理Light Probe Proxy Volume(LPPV).本篇會向大家介紹 ...

  4. English_Rhymes_Phonics_resource

    English_Rhymes_Phonics_resource 1. 英语启蒙早有用吗?_英语启蒙 2. 26个英文字母背后的故事_英语启蒙 3. Phonics Song 4. 学Phonics前先 ...

  5. 揭秘Windows10 UWP中的httpclient接口[2]

    阅读目录: 概述 如何选择 System.Net.Http Windows.Web.Http HTTP的常用功能 修改http头部 设置超时 使用身份验证凭据 使用客户端证书 cookie处理 概述 ...

  6. akka cluster sharding source code 学习 (1/5) 替身模式

    为了使一个项目支持集群,自己学习使用了 akka cluster 并在项目中实施了,从此,生活就变得有些痛苦.再配上 apache 做反向代理和负载均衡,debug 起来不要太酸爽.直到现在,我还对 ...

  7. 1.6.4 Uploading Structured Data Store Data with the Data Import Handler

    1.使用DIH上传结构化数据 许多搜索应用索引结构化数据,如关系型数据库.DIH提供了一个这样的存储并索引结构化数据的机制.除了关系型数据库,solr可以索引来自HTTP的内容,基于数据源如RSS和A ...

  8. 数学符号π (Pi)、Σ(Capital Sigma)、μ (Mu) 、σ(sigma)、∏(capital pi), ∫(Integral Symbol)的来历

    1.π (Pi; periphery/周长) March 14 marks Pi Day, the holiday commemorating the mathematical constant π ...

  9. XXE注入攻击与防御

    在研究XXE注入攻击之前先了解一下什么是XXE 定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括 ...

随机推荐

  1. 在AbpZero中hangfire后台作业的使用——开启hangfire

    AbpZero框架已经集成了hangfire,但它默认是关闭的,我们可以在运行站点下的Startup.cs文件中把这行代码注释取消就行了,代码如下:     //Hangfire (Enable to ...

  2. .Net应用程序 参照的组合没有安装在您的系统中。 HRESULT: 0x800736B3

    同事打开一个.Net的应用程序链接,一直无法启动.错误信息为: 啓用xx.application 時發生例外狀況. 已偵測到下列失敗訊息:參照的組合沒有安裝在您的系統中. (發生例外狀況於 HRESU ...

  3. 20181015记录一个简单的TXT日志类

    20190422添加换行以及时间记录 using System; using System.Collections.Generic; using System.IO; using System.Lin ...

  4. C#之使用CefSharp创建客户端

    安装NuGet包 在Visio studio中右击解决方案,选择管理NuGet包,搜索安装CefSharp.WinForms. 配置工作 (1)首先右击项目选择属性,在"生成"选项 ...

  5. winform程序更新

    更新程序和主程序是分开的,得在做一个exe可执行更新程序. 主程序在登陆时判断是否需要更新. 我这边判断方式是直接在配置文件里面设置版本号,然后和服务器上面的版本对比,低于服务器版本就更新程序. // ...

  6. RabbitMQ之消息持久化(转)

    原文地址 https://blog.csdn.net/u013256816/article/details/60875666/ 消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证 ...

  7. 学习笔记_J2EE_SSM_01_spring+springMVC+Mybatis整合_XML配置示例

    spring+springMVC+Mybatis整合_XML配置示例 1.概述 spring+springMVC+Mybatis整合  XML配置方式 1.1 测试环境说明 名称 版本 备注 操作系统 ...

  8. Python任意网段Web端口信息探测工具

    此篇关于多线程工具的文章,非常适合新手学习,工具效率也挺高的,代码也比较完善,如题. 本文作者:i春秋签约作家——Aedoo 0×00 前言 笔者前一段时间发布了原创文章,“[Python黑客] Py ...

  9. Apache Log4j配置说明

    1.Log4j简介 Log4j是Apache的一个开源项目,它允许开发者以任意间隔输出日志信息.Log4j主要由三大类组件构成: 1)Logger-负责输出日志信息,并能够对日志信息进行分类筛选,即决 ...

  10. Markdown 常用操作

    1->水平线 注意,使用时发现,水平线的语句上一行必须为空行,不然水平线不生效 *** 或者 --- ------->效果: 2->标题 # 大 ## 大 ### 大 #### 大 ...