几年前刚接触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字段算了,下面是步骤记录:
- 在admin/structure/content_migrate菜单中将已经转换的Computed Field字段roll back还原,如果这些字段还没有迁移当然就不用roll back了,另外,如果已经迁移了不roll back而是直接在内容类型中删除这些字段也是可以的(但我自己没有这样做);
- 在相应的内容类型中创建同样名称的字段,字段类型可以根据实际内容来确定,例如一般就用文本text类型;
- 编写一个小的PHP程序,把以前Computed Field中计算的代码搬迁到PHP程序中来,来计算新创建的字段中需要放置的内容,并保存到node中,示范代码请看本文的后面;
- 运行上面的PHP程序,将新创建的字段内容进行计算、填充、保存,检查是否符合预期,如果有问题再修改程序、重新运行;
- 检查以前的显示模板(我将Drupal 6用的contemplate模板直接迁移到Drupal 7中的node--xxx.tpl.php中)、Views、内部搜索等地方是否需要进行相应的修改;
- 如果迁移、升级都已经完成,可以在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中的计算代码放到这个程序中去了,以前是访问每个页面的时候,这些字段进行计算,现在是提前手工运行一次并保存后,以后每次访问页面都不需要计算、只要读出保存的值就可以了,效率应该也有所提升。
评论