幾年前剛接觸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中的計算代碼放到這個程序中去了,以前是訪問每個頁面的時候,這些字段進行計算,現在是提前手工運行一次并保存後,以後每次訪問頁面都不需要計算、隻要讀出保存的值就可以了,效率應該也有所提升。
评论