Drupal 7 Entity Construction Kit (ECK)

主标签

投票加载中...

Entity Construction Kit 模块是Entity构建工具, 在开发中可能经常都会遇到一些很不一样的数据结构,我们第一个想法应该是想到用内容类型来构建(Content Type). 但是内容类型过于繁琐. 比如我不想要Title(有模块可以将title去掉). 我不想要一些写的操作或者算法. 而且所有的Node都保存在了node表,这样数据一多肯定是不好的,网站会变得极漫. 此时有很多的开发者可能就想到要自己去创建表,去写Query, 但是你如果这样做了,你又如何将你的数据和必不可少的Views结合?或者其它的模块结合?  在Drupal 中自己建表结构就等于自己给自己挖一个坑.

在Drupal 7中加入了强大Entity功能,但是Entity手动构建的确很复杂(hook_entity_info()).  此模块就用于提供了UI创建Entity. 在Drupal 7 虽然内置Entity, 但是功能极少。模块Entity API扩展了系统的Entity功能, 并将系统的Node, user, taxonomy, comment等整合到Entity.

使用Entity来定义数据结构的好处:

  1. 和Views结合
  2. Entity metadata wrapper 支持
  3. 系统内置函数的支持(entity_load, entity_delete等..)
  4. 完美的权限控制支持
  5. 完美数据操作
  6. EntityFieldQuery 支持

 

安装与配置: 

必须安装的模块:

  1. Entity
     
模块案例: 

基本使用

此处有两个概念Entity类型和Bundle和, 以Node为例的话,整个node就是一个Entity类型, 而内容类型为Bundle, 再一个单独的node为一个Entity

进入到(admin/structure/entity-type)

默认为空,需要我们创建一个Entity类型(admin/structure/entity-type/add)

再回到Entity 类型页面(admin/structure/entity-type)

点击以后就进入到Bundle列表页,默认会有一个和类型同名的Bundle。 进入到Bundle详细页面,可以看到有字段管理,显示管理。就和node类型页面一样
1. 添加一个myfield的字段用于做测试

2. 添加数据

 

 

 

 

开发资料: 

表单调用

https://www.drupal.org/docs/7/api/entity-api/entity-metadata-wrappers

调用指定的Entity 添加表单。

eck__entity__add($entity_type_name, $bundle_name) 
$form = eck__entity__add('my_entity', 'my_entity');
$output = render($form);

查询数据

方法1: 使用entity_load. 获取entity id为1的数据. 但是此函数的限制是只能根据id字段来查询

$entities = entity_load('my_entity', array(1));

方法2: 使用EntityFieldQuery查询自定义字段

下面用到两个属性

  1. propertyCondition用于查询在创建Entity类型时的选择的字段,而且那些字段必须用此方法查询
  2. fieldCondition 自定义字段查询
$query = new EntityFieldQuery();
$query
    ->entityCondition('entity_type', 'my_entity', '=')  //先查询entity type 为my_entity
    ->entityCondition('bundle', 'my_entity')              //bundle 为 my_entity
    ->propertyCondition('id', 1, '=');   // 查询id为1的数据. 
    ->fieldCondition('title','value', 'test1', '=');  //查询title的value属性为1. 如果是references字段的话这里要用target_id
$result = query->execute();
// 此处的$result里面会有entity id. 此处还要使用使用entity load来获取数据
$ids = array();
foreach($result['my_entity'] as $eid => $entity) {
  $ids[] = $eid;
}
$entities = entity_load('my_entity', $ids);

添加一条数据

使用entity_metadata_wrapper来创建新数据

// 第一个参数是bundle名.
$entity = entity_create('my_entity', array('type'=>'my_entity'));
$wrapper = entity_metadata_wrapper('my_entity', $entity);
// 设置字段设置
$wrapper->field_myfield->set('hhaha');
// 保存
$wrapper->save(); 

删除一条数据

 entity_delete('my_entity', 2); 

修改一条数据

 $query = new EntityFieldQuery();
$query
  ->entityCondition('entity_type', 'my_entity', '=')  //先查询entity type 为my_entity
  ->entityCondition('bundle', 'my_entity')              //bundle 为my_entity
  ->fieldCondition('field_myfield', 'value', "test1", '=');  //字段的值比较

$result = $query->execute();

/**
 * 更新数据, 将结果进行数据更新
 */
$wrapper = entity_metadata_wrapper('my_entity', reset($result['my_entity']));
$wrapper->field_myfield->set("哈哈哈");    //set() 设置值
$wrapper->save();                   //保存结果 

错误调试

用过的朋友都知道,set的类型永远是最难控制的。因为不同的字段要求的数据结构不一样。比如Node标题字段,可能只需要一个字符串就可以 ->set("字符串"), 但是Body就不一样了。它需要一个数组.包含值和过滤方式

所以这边提供两个一些调试的方法,仅供参考

  1. 创建一条相同的数据,使用devel打印出来看看数据结构
  2. 使用 dpm(entity_get_property_info('EntityType'));

 

模块下载: 
文件加载中...