欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

如何创建一个新的实体类型

shiping1 的头像
实体有点像OOP中的对象,是大量数据的集合,Drupal可以按一致的方式操作它。可以把它们当作容器,你可以给它们添加字段,这是很有用的。例如节点是实体,用户、文件和评论都是。如果你正在你的模块中为新类型内容或对象,创建一个新的数据库表,一个很好的方式是:应该被做成一个实体。 此页解释如何使用最简单的实体。 你的第一个步骤是使用Drupal的数据库模式API,创建一个数据库表来存储这个新实体的基础数据。节点和用户的表都是这种基础表的例子。 一旦你创建一个表,你需要使用hook_entity_info 让Drupal知道它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* Implements hook_entity_info().
*/
function yourmodule_entity_info() {
  return array(
    'name_of_entity' => array(
      'label' => t('Name of entity'),
      'base table' => 'your_table',
      'entity keys' => array(
        'id' => 'your_tables_primary_key',
      ),
    ),
  );
}

在上面的函数告诉Drupal,这个实体在数据库中的基本表名称和它的主键。要该实体能加载数据,至少要让Drupal知道这些。 (更多可能的,请看API参考)。 清除缓存,然后打印出entity_get_info()的结果,你应该看到,你刚才定义的实体在数组列表中,同时还有其他地方的定义实体,如节点和用户。 已经补充了大量的默认值。此时 fieldable键应该 False,因为在默认情况下是不允许实体有字段的,使实体更轻巧(在这里 ,你可以学习到如何使一个实体“fieldable”(字段化))。也看看下面的drupal_schema_fields_sql,你应该可以看到定义的基础表和它的字段列表。 要运行entity_load(”name_of_entity”)并打印出结果,请确保您的表有几条记录。在打印出来的数组中,您应该能看到所有这些记录。 如果你看一下entity_load()完整的API文档,你会看到它需要一个数组的$id作为参数。当我们使用上面的函数,而没有指定一个记录的子集时,它只是返回的一切子集,包括我们通常不加载入的记录子集。 您也将看到 $reset参数。实体有一个默认的缓存实现,所以加截一个页面时,多次相同的请求不会冲击数据库。设置 $reset 为TRUE ,可强制缓存清除,使我们得到新的数据。 A design pattern has emerged for using entity_load in connection with a load function as used in a menu callback.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* Load a single record.
*
* @param $id
*    The id representing the record we want to load.
*/
function examplemodule_load($id, $reset = FALSE) {
  return examplemodule_load_multiple(array($id), $reset);
}
 
/**
* Load multiple records.
*/
function examplemodule_load_multiple($ids = array(), $conditions = array(), $reset = FALSE) {
  return entity_load('name_of_entity', $ids, $conditions, $reset);
}

与使用数据库API从表中获取数据相比,调用entity_load()有相当多的好处。正如上面提到的,它提供了页面缓存。我们也提到上面说,如果启用了,它可以附加任何字段到实体类型。它也调用hook_entity_load(),其他模块可以将任何实体类型的记录作为附加数据。 hook_node_load()就是这个钩子 的一个例子,。 这是一个简单的实体。

来自   http://www.cuitu.net/book/ru-he-chuang-jian-yi-ge-xin-de-shi-ti-lei-xing

普通分类: