15 伪字段

作者:老葛,北京亚艾元软件有限责任公司,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,所以节点的标题默认总是显示在其它字段的上面,如图所示。

图片1.png 

             在管理字段页面,节点标题总是显示最前面

 

    如果熟悉Ubercart模块的话,我们知道,在这个电子商务模块中,产品属性并没有实现为字段的形式,或许将来会朝这方面发展,它的竞争对手Commerce模块已经完全采用了字段的形式了。在UbercartDrupal7版本里面,产品属性就采用了伪字段的形式,下面是该模块的对应代码,这里我们有删减:

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;

}

    当然,这些伪字段并不是具有所有字段的属性,比如在字段的管理显示页面,就没有出现这些伪字段。

 

 


Drupal版本: