当前位置

将Drupal中的Computed Field转为普通文本字段

James Qi 在 2015年11月12日 - 16:20 提交
内容摘要:几年前刚接触Drupal的时候,为了让显示的内容更丰富、也便于做Views、便于内部搜索,在Drupal 6中曾经使用过Computed Field(需要设置计算结果保存到数据库才能进行Views、搜......

  几年前刚接触Drupal的时候,为了让显示的内容更丰富、也便于做Views、便于内部搜索,在Drupal 6中曾经使用过Computed Field(需要设置计算结果保存到数据库才能进行Views、搜索索引等工作),也就是一种可以嵌入PHP代码来实现计算、变换的字段,这个确实有很大的灵活性。

  不过随着对Drupal的了解,让显示的内容更丰富其实只需要修改模板,便于做Views、便于内部搜索也可以做成固定的字段,只要事先对需要导入的文本进行一些处理就可以,在Drupal 7里面就基本没有用过这种字段了。

  Drupal 8在2015年11月19日会推出第一个正式版本,Drupal 6在随后的3个月还提供安全更新,此后就不再提供更新和支持了,所以Drupal 6的升级很迫切,最近我们也一直在做这方面的工作。

  在升级带有Computed Field字段的Drupal 6网站过程中,在Drupal 7里面也可以添加Computed Field,只是字段里面的计算设置、显示设置的写法都与以前的不一样了,需要修改。但想到这也比较麻烦,而且未来如果还要升级到Drupal 8估计又得折腾,并且用这种字段不是很必要,于是就干脆把这种字段改为普通text字段算了,下面是步骤记录:

  1. 在admin/structure/content_migrate菜单中将已经转换的Computed Field字段roll back还原,如果这些字段还没有迁移当然就不用roll back了,另外,如果已经迁移了不roll back而是直接在内容类型中删除这些字段也是可以的(但我自己没有这样做);
  2. 在相应的内容类型中创建同样名称的字段,字段类型可以根据实际内容来确定,例如一般就用文本text类型;
  3. 编写一个小的PHP程序,把以前Computed Field中计算的代码搬迁到PHP程序中来,来计算新创建的字段中需要放置的内容,并保存到node中,示范代码请看本文的后面;
  4. 运行上面的PHP程序,将新创建的字段内容进行计算、填充、保存,检查是否符合预期,如果有问题再修改程序、重新运行;
  5. 检查以前的显示模板(我将Drupal 6用的contemplate模板直接迁移到Drupal 7中的node--xxx.tpl.php中)、Views、内部搜索等地方是否需要进行相应的修改;
  6. 如果迁移、升级都已经完成,可以在Drupal 7站点中关闭Computed Field、Content Migrate模板。

  上面步骤中说的小PHP程序示范代码如下:

<?php
//程序开头注释部分开始
/*

批量替换字段

统计数据:
count //本次修改的总计数

*/
//程序开头注释部分结束

$_SERVER['HTTP_HOST'] = "m.youbianku.com";
$_SERVER['SCRIPT_NAME'] = "/computed_field.php";
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';

$drupal_path = '/alidata/www/drupal.youbianku.com/';
chdir($drupal_path);

define('DRUPAL_ROOT', $drupal_path);

#require_once './includes/bootstrap.inc';
require_once DRUPAL_ROOT.'includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

$node_type = "county";
$limit = 10000;
$offset = 0;
$sql = "SELECT node.nid FROM {node} WHERE node.type = '$node_type' LIMIT $limit OFFSET $offset";
$result = db_query($sql);

$count=0;
while ($anode = $result->fetch()) {
$nid=$anode->nid;
$node=node_load($nid);
//print_r($node);

$area=$node->field_area['und'][0]['value'];

switch (substr($area,0,9))
{
case "北京市":
  $province="北京市";
  break;
case "天津市":
  $province="天津市";
  break;
case "河北省":
  $province="河北省";
  break;
case "内蒙古":
  $province="内蒙古自治区";
  break;
......
case "西藏自":
  $province="西藏自治区";
  break;
default:
  $province="无省份";
}

$city_county=substr($area,strlen($province));
switch (substr($city_county,0,9))
{
case "七台河":
  $city = "七台河市";
  break;
case "万宁市":
  $city = "万宁市";
  break;
case "万州区":
  $city = "万州区";
  break;
......
case "巴彦淖":
  $city = "巴彦淖尔市";
  break;
default:
  $city = "无地市";
}

$province_city=$province.$city;
$county=substr($area,strlen($province_city));

$count++;

$new=$node;

print "count=$count nid=$nid: $province, $city, $county\n";
$new->field_province['und'][0]['value']=$province;
$new->field_city['und'][0]['value']=$city;
$new->field_county['und'][0]['value']=$county;

node_save($new);

}

echo "<br>count=$count Done!<br>\n"

?>

  其实就是把Computed Field中的计算代码放到这个程序中去了,以前是访问每个页面的时候,这些字段进行计算,现在是提前手工运行一次并保存后,以后每次访问页面都不需要计算、只要读出保存的值就可以了,效率应该也有所提升。

自由标签:

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
验证码
本问题用于测试您是否为人类访问者,避免自动垃圾发贴。
图形验证
键入显示在图片中的字符