国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
定義我們自己的Drupal實體類型
實體類和控制器
覆蓋實體類
結(jié)論
關(guān)于在Drupal中構(gòu)建自定義實體的常見問題解答
創(chuàng)建Drupal自定義實體的先決條件是什么?
如何在Drupal中創(chuàng)建具有捆綁包的自定義內(nèi)容實體?
Drupal中的內(nèi)容實體和配置實體有什么區(qū)別?
如何在Drupal 8中創(chuàng)建內(nèi)容實體類型?
我可以使用Entity API模塊在Drupal中創(chuàng)建自定義實體嗎?
創(chuàng)建Drupal自定義實體的好處是什么?
如何在Drupal中向自定義實體添加字段?
如何在Drupal中顯示自定義實體?
如何在Drupal中創(chuàng)建用于添加和編輯自定義實體的表單?
如何在Drupal中刪除自定義實體?
首頁 后端開發(fā) php教程 在Drupal -setup中構(gòu)建您自己的自定義實體

在Drupal -setup中構(gòu)建您自己的自定義實體

Feb 21, 2025 am 10:59 AM

Build Your Own Custom Entities in Drupal - Setup

關(guān)鍵要點

  • Drupal中的實體是組織數(shù)據(jù)的一種強大方式,可以自定義以表示特定類型的信息。本教程演示如何創(chuàng)建一個名為“項目”的自定義實體類型,其中包括標題、描述和截止日期等屬性。
  • 要創(chuàng)建新的實體類型,必須聲明其模式定義,這將生成實體數(shù)據(jù)的數(shù)據(jù)庫表。本教程提供了創(chuàng)建具有四個列(id、name、description和deadline)的“demo_projects”表的代碼示例。
  • 實體API模塊需要在您的站點上啟用并設(shè)置為自定義模塊的依賴項,它提供了許多Drupal核心缺乏的實體處理功能。這包括創(chuàng)建新實體、將它們保存到數(shù)據(jù)庫以及顯示它們。
  • 本教程還解釋了如何覆蓋默認EntityAPIController類的buildContent()方法來顯示您的實體,以及如何通過entity_view()輔助函數(shù)創(chuàng)建實體列表。教程的第二部分將介紹創(chuàng)建頁面以顯示單個項目實體,通過UI使其可字段化,以及將其公開給Views以進行查詢和列表顯示。

Drupal實體是組織數(shù)據(jù)的好方法。如果您熟悉節(jié)點、分類術(shù)語、評論或用戶,您還應(yīng)該知道,自Drupal 7以來,這些都是實體。關(guān)于它們另一個重要的方面是,它們可以通過Field API進行字段化。

在本教程中,我將向您展示如何定義您自己的自定義實體類型并開始使用它。為什么有人想這樣做而不是使用節(jié)點?因為雖然它們很棒,但節(jié)點有時會過于復雜。您可能不需要很多功能,例如修訂或評論。

在本教程中,我們將定義我們自己的名為“項目”的自定義實體類型,以表示我們關(guān)于項目的簡單信息(標題、描述和截止日期)。然后,我們將了解一些關(guān)于使用此類型實體的內(nèi)容。

為了繼續(xù)學習,我假設(shè)您知道如何編寫基本的自定義模塊(我的模塊名為demo)。您可以在此處找到關(guān)于此主題的優(yōu)秀教程。繼續(xù)編寫.info文件并創(chuàng)建空的.module和.install文件。我還設(shè)置了一個Git存儲庫,您可以在其中獲取本教程的所有源代碼(每個部分一個分支,將發(fā)布兩個部分)。

此外,您需要在您的站點上啟用Entity API contrib模塊并將其設(shè)置為自定義模塊的依賴項。Entity API模塊在處理實體時非常強大,因為它提供了Drupal核心缺乏的許多功能。

定義我們自己的Drupal實體類型

創(chuàng)建新的實體類型首先需要聲明其模式定義。也就是說,編寫將生成實體數(shù)據(jù)數(shù)據(jù)庫表的代碼。在我的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()的一個簡單實現(xiàn),通過它我們創(chuàng)建一個demo_projects表,該表有4列:id、name、description和deadline,第一列表示主鍵。沒什么大不了的。

接下來,我們需要實現(xiàn)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數(shù)組中返回一個新的鍵,它表示實體機器名。在這個數(shù)組中,我們指定了選項(我們將在本教程的過程中添加更多選項)。現(xiàn)在,我們將堅持使用標簽(實體類型的可讀名稱)、存儲實體數(shù)據(jù)的基表、充當實體標識符的屬性的實體鍵以及指定哪個模塊定義實體類型的模塊。最后一個不是強制性的,但建議使用。

這樣,我們就用Drupal注冊了我們自己的基本實體類型。要測試它是否有效,請首次啟用該模塊并檢查該表是否已在數(shù)據(jù)庫中創(chuàng)建。然后用幾行填充它,以便有一些內(nèi)容可以使用:

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注冊一個路徑(僅用于測試的任何路徑),并將以下內(nèi)容粘貼到其回調(diào)函數(shù)中:

$projects = entity_load('project', array(1, 2));
dpm($projects);
return 'Some string';

首先,我們使用entity_load()函數(shù)加載具有ID 1和2的項目實體,然后我們使用Devel dpm()函數(shù)(因此請確保在您的站點上啟用了Devel以進行測試)將它們打印到屏幕上。不要忘記頁面的回調(diào)函數(shù)需要返回一些內(nèi)容,否則它將無法構(gòu)建。

現(xiàn)在,如果您導航到該頁面,您將在Krumo中看到數(shù)據(jù)庫中2個實體的數(shù)據(jù)。

或者,您可以使用EntityFieldQuery類根據(jù)所需的任何屬性(不僅僅是id)查詢新的實體。有關(guān)此工作原理的更多信息,您可以查看本Sitepoint教程,它將幫助您入門。

實體類和控制器

不幸的是,Drupal核心沒有提供太多輔助函數(shù)來處理實體(entity_load()幾乎是唯一的)。但是,Entity API模塊填補了這一空白。

為了使用其功能,我們需要更改我們前面聲明的實體信息,并指定可用于處理實體的PHP類。現(xiàn)在,我們將向hook_entity_info()實現(xiàn)中鍵入的project數(shù)組中添加另外兩個鍵:

前面提到的代碼中已經(jīng)包含了 'entity class' => 'Entity', 'controller class' => 'ProjectEntityController',

EntityAPIController類(位于模塊的entity.controller.inc文件中)為處理實體提供了一些合理的默認值。它擴展了默認的Drupal核心DrupalDefaultEntityController類,并且負責(除許多其他事情外)執(zhí)行CRUD操作。

這兩個類都可以在您的自定義模塊中擴展以調(diào)整功能(如查詢、加載或顯示實體)。我們將在稍后看到如何做到這一點。

但首先,我想向您展示如何保存新的實體。目前,在我的數(shù)據(jù)庫中有2條記錄,其ID為1和2。我想調(diào)整我們在上面測試頁面回調(diào)函數(shù)中編寫的代碼,以便在不存在的情況下創(chuàng)建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;
}

如您所見,現(xiàn)在我們嘗試加載3個項目實體并檢查第三個實體是否存在。如果它不存在,我們將使用Entity API提供的entity_create()輔助函數(shù),將屬性設(shè)置為一些隨機值,然后使用實體上的save()方法將其持久保存到數(shù)據(jù)庫。此方法由Entity類提供,其工作是調(diào)用我們在上面定義的控制器類上的save()方法。該方法將執(zhí)行持久保存實體所需的邏輯。但這所有事情都在幕后發(fā)生,我們不必擔心它。

如果您重新加載該頁面,您應(yīng)該只看到返回的2個項目實體,但如果第二次加載,則應(yīng)該有3個。

覆蓋實體類

在本教程的這一部分中,我想向您展示的最后一件事是如何顯示您的實體。為此,我們將堅持使用我們一直在使用的頁面回調(diào)函數(shù),并使其呈現(xiàn)實體列表。

首先,我們需要覆蓋默認EntityAPIController類的buildContent()方法。原因是控制器無法對我們的數(shù)據(jù)做出假設(shè),因此我們需要提供一些關(guān)于如何顯示它的信息。首先,讓我們聲明擴展前一個類的控制器類:

/**
 * 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()實現(xiàn)中為控制器類鍵設(shè)置的值。別忘了。

在這個類中,我們可以從原始類中復制方法名,并使其返回其父類將返回的內(nèi)容:

在這個類中,我們可以從原始類中復制方法名,并使其返回其父類將返回的內(nèi)容。我們基本上向數(shù)組添加了兩個新項目。第一個將用<div>包裝描述,第二個將在段落標簽之間輸出格式化的日期。這是基本的Drupal主題,如果您不理解這里發(fā)生了什么,請復習一下。但是您會注意到項目名稱缺失。Drupal將自動呈現(xiàn)它,因為我們在hook_entity_info()實現(xiàn)的實體鍵中將其指定為標簽。最后一步是轉(zhuǎn)到我們的頁面回調(diào)函數(shù)并使其顯示我們的實體。一種快速的方法(僅用于演示目的):

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);

和以前一樣,我們首先加載具有相應(yīng)ID的實體。然后,我們通過entity_view()輔助函數(shù)運行它們,該函數(shù)最終將調(diào)用我們剛剛覆蓋的buildContent()方法。此函數(shù)返回每個實體的渲染數(shù)組列表。我們渲染每一個并將結(jié)果存儲在$output數(shù)組中,然后將其連接并返回。

您可以刷新頁面,您應(yīng)該會看到您加載的所有實體的列表。確保清除緩存,以便更改可見。

結(jié)論

在本教程中,我們通過在代碼中定義我們自己的實體類型來開始學習Drupal中的實體。我們已經(jīng)了解了如何為它們表示的數(shù)據(jù)編寫模式定義以及如何使用Drupal注冊它們。然后,我們看到了使用Entity API contrib模塊以面向?qū)ο蟮姆绞教幚韺嶓w的強大功能。

在本教程的第二部分中,我們將研究三個主要方面。首先,我們將創(chuàng)建一些頁面來顯示單個項目實體并啟動用于管理項目的管理界面。其次,我們將通過UI使其可字段化。第三,我們將將其公開給Views,以便我們可以進行一些適當?shù)牟樵兒土斜盹@示。敬請關(guān)注!

關(guān)于在Drupal中構(gòu)建自定義實體的常見問題解答

創(chuàng)建Drupal自定義實體的先決條件是什么?

在開始創(chuàng)建Drupal自定義實體之前,您需要對Drupal的Entity API有基本的了解。您還應(yīng)該熟悉PHP和面向?qū)ο缶幊痰母拍?。此外,您?yīng)該已經(jīng)設(shè)置了Drupal開發(fā)環(huán)境。這包括在本地機器或服務(wù)器上安裝和配置Drupal。

如何在Drupal中創(chuàng)建具有捆綁包的自定義內(nèi)容實體?

在Drupal中創(chuàng)建具有捆綁包的自定義內(nèi)容實體涉及多個步驟。首先,您需要在自定義模塊中定義您的實體及其屬性。然后,您需要創(chuàng)建一個表單來添加和編輯您的實體。之后,您需要為實體的操作定義路由。最后,您需要創(chuàng)建一個視圖構(gòu)建器來顯示您的實體。

Drupal中的內(nèi)容實體和配置實體有什么區(qū)別?

在Drupal中,內(nèi)容實體是可以由用戶創(chuàng)建、編輯和刪除的內(nèi)容片段。示例包括節(jié)點、用戶和評論。另一方面,配置實體是存儲在數(shù)據(jù)庫中并可以導出到代碼的配置片段。示例包括視圖、圖像樣式和用戶角色。

如何在Drupal 8中創(chuàng)建內(nèi)容實體類型?

在Drupal 8中創(chuàng)建內(nèi)容實體類型涉及在自定義模塊中定義您的實體及其屬性。您還需要創(chuàng)建一個表單來添加和編輯您的實體,定義實體操作的路由,并創(chuàng)建一個視圖構(gòu)建器來顯示您的實體。

我可以使用Entity API模塊在Drupal中創(chuàng)建自定義實體嗎?

是的,您可以使用Entity API模塊在Drupal中創(chuàng)建自定義實體。此模塊提供了一種統(tǒng)一的方式來處理實體及其屬性。它還提供用于對實體執(zhí)行操作的API,例如創(chuàng)建、讀取、更新和刪除。

創(chuàng)建Drupal自定義實體的好處是什么?

創(chuàng)建Drupal自定義實體允許您定義您自己的數(shù)據(jù)結(jié)構(gòu)和業(yè)務(wù)邏輯。這可以使您的站點更高效且更易于管理。自定義實體還可以讓您充分利用Drupal的Entity API,該API提供了用于處理實體的強大工具。

如何在Drupal中向自定義實體添加字段?

要在Drupal中向自定義實體添加字段,您需要使用Field API。這涉及在實體的基字段定義方法中定義您的字段。您還可以使用Field UI模塊通過Drupal管理界面向?qū)嶓w添加字段。

如何在Drupal中顯示自定義實體?

要在Drupal中顯示自定義實體,您需要為您的實體創(chuàng)建一個視圖構(gòu)建器。這涉及定義一個擴展EntityViewBuilder類的類并實現(xiàn)view方法。您還可以使用Views模塊創(chuàng)建實體的自定義視圖。

如何在Drupal中創(chuàng)建用于添加和編輯自定義實體的表單?

要在Drupal中創(chuàng)建用于添加和編輯自定義實體的表單,您需要為您的實體定義一個表單類。這涉及擴展EntityForm類并實現(xiàn)form、validate和submit方法。

如何在Drupal中刪除自定義實體?

要在Drupal中刪除自定義實體,您需要使用Entity API的delete方法。這涉及加載您的實體,調(diào)用delete方法,然后保存您的實體。您還可以使用Entity API的deleteMultiple方法一次刪除多個實體。

以上是在Drupal -setup中構(gòu)建您自己的自定義實體的詳細內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應(yīng)法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

對基于PHP的API進行版本控制的最佳實踐是什么? 對基于PHP的API進行版本控制的最佳實踐是什么? Jun 14, 2025 am 12:27 AM

基于toversionaphp,useUrl deuseUrl specteringforclarityAndEsofRouting,單獨的codetoavoidConflicts,dremecateOldVersionswithClearCommunication,andConsiderCustomHeadeSerlySerallyWhennEnncelsy.startbyplacingtheversionIntheUrl(E.G.,epi/api/v

如何在PHP中實施身份驗證和授權(quán)? 如何在PHP中實施身份驗證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

PHP中有哪些弱參考(弱圖),何時有用? PHP中有哪些弱參考(弱圖),何時有用? Jun 14, 2025 am 12:25 AM

PHPdoesnothaveabuilt-inWeakMapbutoffersWeakReferenceforsimilarfunctionality.1.WeakReferenceallowsholdingreferenceswithoutpreventinggarbagecollection.2.Itisusefulforcaching,eventlisteners,andmetadatawithoutaffectingobjectlifecycles.3.YoucansimulateaWe

PHP中的程序和面向?qū)ο蟮木幊谭独g有什么區(qū)別? PHP中的程序和面向?qū)ο蟮木幊谭独g有什么區(qū)別? Jun 14, 2025 am 12:25 AM

procemal and object-tiriendedprogromming(oop)inphpdiffersimplessintustructure,可重復使用性和datahandling.1.procedural-Progrogursmingusesfunctimesfunctionsormanized sequalized sequalized sequiential,poiperforsmallscripts.2.OpporganizesCodeOrganizescodeOdeIntsocloceSandObjects,ModelingReal-Worlden-Worlden

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在于驗證文件類型、重命名文件并限制權(quán)限。1.使用finfo_file()檢查真實MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限制文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

PHP中==(松散比較)和===(嚴格的比較)之間有什么區(qū)別? PHP中==(松散比較)和===(嚴格的比較)之間有什么區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在于類型檢查的嚴格程度。==在比較前會進行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會返回true,例如5==="5"返回false。使用場景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時使用。

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(通過PECL或Composer安裝)創(chuàng)建客戶端實例并操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用于高性能場景,Predis則便于快速部署;兩者均適用于生產(chǎn)環(huán)境且文檔完善。

如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學運算的方法如下:1.加法用 號,支持整數(shù)和浮點數(shù),也可用于變量,字符串數(shù)字會自動轉(zhuǎn)換但不推薦依賴;2.減法用-號,變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號,適用于數(shù)字及類似字符串;4.除法用/號,需避免除以零,并注意結(jié)果可能是浮點數(shù);5.取模用%號,可用于判斷奇偶數(shù),處理負數(shù)時余數(shù)符號與被除數(shù)一致。正確使用這些運算符的關(guān)鍵在于確保數(shù)據(jù)類型清晰并處理好邊界情況。

See all articles