關鍵要點
Drupal實體是組織數據的好方法。如果您熟悉節點、分類術語、評論或用戶,您還應該知道,自Drupal 7以來,這些都是實體。關於它們另一個重要的方面是,它們可以通過Field API進行字段化。
在本教程中,我將向您展示如何定義您自己的自定義實體類型並開始使用它。為什麼有人想這樣做而不是使用節點?因為雖然它們很棒,但節點有時會過於復雜。您可能不需要很多功能,例如修訂或評論。
在本教程中,我們將定義我們自己的名為“項目”的自定義實體類型,以表示我們關於項目的簡單信息(標題、描述和截止日期)。然後,我們將了解一些關於使用此類型實體的內容。
為了繼續學習,我假設您知道如何編寫基本的自定義模塊(我的模塊名為demo)。您可以在此處找到關於此主題的優秀教程。繼續編寫.info文件並創建空的.module和.install文件。我還設置了一個Git存儲庫,您可以在其中獲取本教程的所有源代碼(每個部分一個分支,將發布兩個部分)。
此外,您需要在您的站點上啟用Entity API contrib模塊並將其設置為自定義模塊的依賴項。 Entity API模塊在處理實體時非常強大,因為它提供了Drupal核心缺乏的許多功能。
創建新的實體類型首先需要聲明其模式定義。也就是說,編寫將生成實體數據數據庫表的代碼。在我的demo.install文件中,我有以下代碼:
/** * Implements hook_schema(). */ function demo_schema() { $schema = array(); $schema['demo_projects'] = array( 'description' => 'The base table for the Project entity', 'fields' => array( 'id' => array( 'description' => 'Primary key of the Project entity', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'name' => array( 'description' => 'Project name.', 'type' => 'varchar', 'length' => 255, 'not null' => FALSE, ), 'description' => array( 'description' => 'Project description.', 'type' => 'text', 'size' => 'big', 'not null' => FALSE, 'default' => NULL ), 'deadline' => array( 'description' => 'Project deadline.', 'type' => 'int', 'length' => 11, 'not null' => FALSE, ), ), 'primary key' => array('id'), ); return $schema; }
這是hook_schema()的一個簡單實現,通過它我們創建一個demo_projects表,該表有4列:id、name、description和deadline,第一列表示主鍵。沒什麼大不了的。
接下來,我們需要實現hook_entity_info()。我們可以在這個鉤子中指定很多選項,但這裡是最基本和必需的選項(這在demo.module文件中):
/** * Implements hook_entity_info(). */ function demo_entity_info() { $info = array(); $info['project'] = array( 'label' => t('Project'), 'base table' => 'demo_projects', 'entity keys' => array( 'id' => 'id', 'label' => 'name', ), 'module' => 'demo', 'entity class' => 'Entity', 'controller class' => 'ProjectEntityController', ); return $info; }
通過這個鉤子,我們在$info數組中返回一個新的鍵,它表示實體機器名。在這個數組中,我們指定了選項(我們將在本教程的過程中添加更多選項)。現在,我們將堅持使用標籤(實體類型的可讀名稱)、存儲實體數據的基表、充當實體標識符的屬性的實體鍵以及指定哪個模塊定義實體類型的模塊。最後一個不是強制性的,但建議使用。
這樣,我們就用Drupal註冊了我們自己的基本實體類型。要測試它是否有效,請首次啟用該模塊並檢查該表是否已在數據庫中創建。然後用幾行填充它,以便有一些內容可以使用:
INSERT INTO `demo_projects` (`id`, `name`, `description`, `deadline`) VALUES (1, 'Summer House', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', 1397501105), (2, 'Winter House', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', 1397501132);
最後,使用hook_menu()使用Drupal註冊一個路徑(僅用於測試的任何路徑),並將以下內容粘貼到其回調函數中:
$projects = entity_load('project', array(1, 2)); dpm($projects); return 'Some string';
首先,我們使用entity_load()函數加載具有ID 1和2的項目實體,然後我們使用Devel dpm()函數(因此請確保在您的站點上啟用了Devel以進行測試)將它們打印到屏幕上。不要忘記頁面的回調函數需要返回一些內容,否則它將無法構建。
現在,如果您導航到該頁面,您將在Krumo中看到數據庫中2個實體的數據。
或者,您可以使用EntityFieldQuery類根據所需的任何屬性(不僅僅是id)查詢新的實體。有關此工作原理的更多信息,您可以查看本Sitepoint教程,它將幫助您入門。
不幸的是,Drupal核心沒有提供太多輔助函數來處理實體(entity_load()幾乎是唯一的)。但是,Entity API模塊填補了這一空白。
為了使用其功能,我們需要更改我們前面聲明的實體信息,並指定可用於處理實體的PHP類。現在,我們將向hook_entity_info()實現中鍵入的project數組中添加另外兩個鍵:
前面提到的代碼中已經包含了 'entity class' => 'Entity', 'controller class' => 'ProjectEntityController',
EntityAPIController類(位於模塊的entity.controller.inc文件中)為處理實體提供了一些合理的默認值。它擴展了默認的Drupal核心DrupalDefaultEntityController類,並且負責(除許多其他事情外)執行CRUD操作。
這兩個類都可以在您的自定義模塊中擴展以調整功能(如查詢、加載或顯示實體)。我們將在稍後看到如何做到這一點。
但首先,我想向您展示如何保存新的實體。目前,在我的數據庫中有2條記錄,其ID為1和2。我想調整我們在上面測試頁面回調函數中編寫的代碼,以便在不存在的情況下創建ID為3的新實體。它可能如下所示:
/** * Implements hook_schema(). */ function demo_schema() { $schema = array(); $schema['demo_projects'] = array( 'description' => 'The base table for the Project entity', 'fields' => array( 'id' => array( 'description' => 'Primary key of the Project entity', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'name' => array( 'description' => 'Project name.', 'type' => 'varchar', 'length' => 255, 'not null' => FALSE, ), 'description' => array( 'description' => 'Project description.', 'type' => 'text', 'size' => 'big', 'not null' => FALSE, 'default' => NULL ), 'deadline' => array( 'description' => 'Project deadline.', 'type' => 'int', 'length' => 11, 'not null' => FALSE, ), ), 'primary key' => array('id'), ); return $schema; }
如您所見,現在我們嘗試加載3個項目實體並檢查第三個實體是否存在。如果它不存在,我們將使用Entity API提供的entity_create()輔助函數,將屬性設置為一些隨機值,然後使用實體上的save()方法將其持久保存到數據庫。此方法由Entity類提供,其工作是調用我們在上面定義的控制器類上的save()方法。該方法將執行持久保存實體所需的邏輯。但這所有事情都在幕後發生,我們不必擔心它。
如果您重新加載該頁面,您應該只看到返回的2個項目實體,但如果第二次加載,則應該有3個。
在本教程的這一部分中,我想向您展示的最後一件事是如何顯示您的實體。為此,我們將堅持使用我們一直在使用的頁面回調函數,並使其呈現實體列表。
首先,我們需要覆蓋默認EntityAPIController類的buildContent()方法。原因是控制器無法對我們的數據做出假設,因此我們需要提供一些關於如何顯示它的信息。首先,讓我們聲明擴展前一個類的控制器類:
/** * Implements hook_entity_info(). */ function demo_entity_info() { $info = array(); $info['project'] = array( 'label' => t('Project'), 'base table' => 'demo_projects', 'entity keys' => array( 'id' => 'id', 'label' => 'name', ), 'module' => 'demo', 'entity class' => 'Entity', 'controller class' => 'ProjectEntityController', ); return $info; }
我選擇了類名ProjectEntityController,您需要確保使用此名稱替換您在hook_entity_info()實現中為控制器類鍵設置的值。別忘了。
在這個類中,我們可以從原始類中復制方法名,並使其返回其父類將返回的內容:
在這個類中,我們可以從原始類中復制方法名,並使其返回其父類將返回的內容。我們基本上向數組添加了兩個新項目。第一個將用<div>
包裝描述,第二個將在段落標籤之間輸出格式化的日期。這是基本的Drupal主題,如果您不理解這裡發生了什麼,請複習一下。但是您會注意到項目名稱缺失。 Drupal將自動呈現它,因為我們在hook_entity_info()實現的實體鍵中將其指定為標籤。最後一步是轉到我們的頁面回調函數並使其顯示我們的實體。一種快速的方法(僅用於演示目的):
INSERT INTO `demo_projects` (`id`, `name`, `description`, `deadline`) VALUES (1, 'Summer House', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', 1397501105), (2, 'Winter House', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', 1397501132);
和以前一樣,我們首先加載具有相應ID的實體。然後,我們通過entity_view()輔助函數運行它們,該函數最終將調用我們剛剛覆蓋的buildContent()方法。此函數返回每個實體的渲染數組列表。我們渲染每一個並將結果存儲在$output數組中,然後將其連接並返回。
您可以刷新頁面,您應該會看到您加載的所有實體的列表。確保清除緩存,以便更改可見。
在本教程中,我們通過在代碼中定義我們自己的實體類型來開始學習Drupal中的實體。我們已經了解瞭如何為它們表示的數據編寫模式定義以及如何使用Drupal註冊它們。然後,我們看到了使用Entity API contrib模塊以面向對象的方式處理實體的強大功能。
在本教程的第二部分中,我們將研究三個主要方面。首先,我們將創建一些頁面來顯示單個項目實體並啟動用於管理項目的管理界面。其次,我們將通過UI使其可字段化。第三,我們將將其公開給Views,以便我們可以進行一些適當的查詢和列表顯示。敬請關注!
在開始創建Drupal自定義實體之前,您需要對Drupal的Entity API有基本的了解。您還應該熟悉PHP和麵向對象編程的概念。此外,您應該已經設置了Drupal開發環境。這包括在本地機器或服務器上安裝和配置Drupal。
在Drupal中創建具有捆綁包的自定義內容實體涉及多個步驟。首先,您需要在自定義模塊中定義您的實體及其屬性。然後,您需要創建一個表單來添加和編輯您的實體。之後,您需要為實體的操作定義路由。最後,您需要創建一個視圖構建器來顯示您的實體。
在Drupal中,內容實體是可以由用戶創建、編輯和刪除的內容片段。示例包括節點、用戶和評論。另一方面,配置實體是存儲在數據庫中並可以導出到代碼的配置片段。示例包括視圖、圖像樣式和用戶角色。
在Drupal 8中創建內容實體類型涉及在自定義模塊中定義您的實體及其屬性。您還需要創建一個表單來添加和編輯您的實體,定義實體操作的路由,並創建一個視圖構建器來顯示您的實體。
是的,您可以使用Entity API模塊在Drupal中創建自定義實體。此模塊提供了一種統一的方式來處理實體及其屬性。它還提供用於對實體執行操作的API,例如創建、讀取、更新和刪除。
創建Drupal自定義實體允許您定義您自己的數據結構和業務邏輯。這可以使您的站點更高效且更易於管理。自定義實體還可以讓您充分利用Drupal的Entity API,該API提供了用於處理實體的強大工具。
要在Drupal中向自定義實體添加字段,您需要使用Field API。這涉及在實體的基字段定義方法中定義您的字段。您還可以使用Field UI模塊通過Drupal管理界面向實體添加字段。
要在Drupal中顯示自定義實體,您需要為您的實體創建一個視圖構建器。這涉及定義一個擴展EntityViewBuilder類的類並實現view方法。您還可以使用Views模塊創建實體的自定義視圖。
要在Drupal中創建用於添加和編輯自定義實體的表單,您需要為您的實體定義一個表單類。這涉及擴展EntityForm類並實現form、validate和submit方法。
要在Drupal中刪除自定義實體,您需要使用Entity API的delete方法。這涉及加載您的實體,調用delete方法,然後保存您的實體。您還可以使用Entity API的deleteMultiple方法一次刪除多個實體。
以上是在Drupal -setup中構建您自己的自定義實體的詳細內容。更多資訊請關注PHP中文網其他相關文章!