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