为此,我们首先需要在添加这个字段时,能够正确地创建我们想要的表结构,对于这个字段,我们需要保存两个值,一个是转换后的字符串,我们不妨采用默认的value;一个表示是否是手动输入的,我们这里使用manual。
接下来,让我们添加一个transliteration_title.install文件,然后向该文件中添加以下内容:
<?php
/**
* @file
* Install file for the transliteration title module.
*/
/**
* Implements hook_field_schema().
*/
function transliteration_title_field_schema($field) {
return array(
'columns' => array(
'value' => array(
'type' => 'varchar',
'length' => 255,
'not null' => FALSE,
'sortable' => TRUE,
),
'manual' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
),
),
);
}
注意,这个钩子和hook_schema有点类似,它是专门用于定义字段的表结构的。这里我们按照前面的要求,定义了两列:'value'、'manual'。
让我们删除以前添加的“Test”字段,再重新创建一遍。我们来看一下新字段对应数据库表的表结构,如图所示:
字段对应表field_data_field_test的结构
注意,transliteration_title_field_schema里面的'value'、'manual',对应于这个表结构中的field_test_value、field_test_manual。表结构中的其余列,在所有字段的field_data表中都是通用的。这里前缀“field_test”就是我们这个字段的机读名字。我们来看看对应关系:
“field_test” + “_” + “value” = “field_test_value”
“field_test” + “_” + “manual” = “field_test_manual”
字段名 + 列名
字段对应表名的命名规则:
“field_data” + “_” + “field_test” = “field_data_field_test”
“field_data” + “_” + “body” = “field_data_body”
“field_data” + 字段名
如果我们想要读取我们这个字段中的值,假定当前语言为未定义语言,也就是“und”:
$node->field_test['und'][0]['value'];
$node->field_test['und'][0]['manual'];
这里需要注意的是,并不是所有的字段,都采用“value”存储自己的值,比如分类术语字段,采用的就是“tid”,获取分类术语字段的值,所用的代码就是:
$node->field_myfield['und'][0]['tid'];
而不是
$node->field_myfield['und'][0]['value'];