作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
如果你玩过三国杀,并且还比较熟悉的话,那么你一定了解里面的一个武将,袁术,他最常见的技能就是能够多摸几张牌,相信这个很多人都熟悉,他还有一个技能,叫做“伪帝”,就是说他具有当前主公的主公技,但是他本身不是主公。我这里借用一下,将显示在管理字段页面的非字段称之为“伪字段”,表示它们本身不是字段,但是又具有字段的一些属性。
有些信息,比如节点的标题,它的实现方式没有采用Field API的形式,但是为了管理的方便,Drupal也将其显示在了管理字段界面,Drupal是怎么实现这一点的呢?通过node.module我们可以找到对应的代码:
/**
* Implements hook_field_extra_fields().
*/
function node_field_extra_fields() {
$extra = array();
foreach (node_type_get_types() as $type) {
if ($type->has_title) {
$extra['node'][$type->type] = array(
'form' => array(
'title' => array(
'label' => $type->title_label,
'description' => t('Node module element'),
'weight' => -5,
),
),
);
}
}
return $extra;
}
节点模块就是通过这段代码,将节点的标题显示在了字段管理界面,注意这里将'weight'属性设置为了-5,所以节点的标题默认总是显示在其它字段的上面,如图所示。
在管理字段页面,节点标题总是显示最前面
如果熟悉Ubercart模块的话,我们知道,在这个电子商务模块中,产品属性并没有实现为字段的形式,或许将来会朝这方面发展,它的竞争对手Commerce模块已经完全采用了字段的形式了。在Ubercart的Drupal7版本里面,产品属性就采用了伪字段的形式,下面是该模块的对应代码,这里我们有删减:
function uc_product_field_extra_fields() {
$extra = array();
foreach (uc_product_types() as $type) {
$extra['node'][$type] = array(
'display' => array(
'display_price' => array(
'label' => t('Display price'),
'description' => t('High-visibility sell price.'),
'weight' => -1,
),
……
'add_to_cart' => array(
'label' => t('Add to cart form'),
'description' => t('Add to cart form'),
'weight' => 10,
),
),
);
}
return $extra;
}
当然,这些伪字段并不是具有所有字段的属性,比如在字段的管理显示页面,就没有出现这些伪字段。