Drupal 6 中廣泛使用的 ImageCache 模組在 Drupal 7 已整合進核心,並更名為「影像樣式」。若你正在將網站從 Drupal 6 升級至 Drupal 7,必須將舊的 ImageCache preset 轉換為新的 image style。本文提供一個可直接執行的 PHP 腳本,自動完成這項遷移工作。
migrate_imagecache.php)。https://your-site.com/migrate_imagecache.php)即可執行遷移。<?php
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
/**
* 取得指定 preset 的所有 action
*/
function imagecache_preset_actions($preset, $reset = FALSE) {
$actions_cache = array();
$result = db_query('SELECT * FROM {imagecache_action} WHERE presetid = :presetid ORDER BY weight', array(':presetid' => $preset['presetid']));
foreach ($result as $row) {
$row = (array)$row;
$row['data'] = unserialize($row['data']);
$actions_cache[$preset['presetid']][] = $row;
}
return isset($actions_cache[$preset['presetid']]) ? $actions_cache[$preset['presetid']] : array();
}
/**
* 取得所有 imagecache preset
*/
function imagecache_presets() {
$presets = array();
$normal_presets = array();
$result = db_query('SELECT * FROM {imagecache_preset} ORDER BY presetname');
foreach ($result as $preset) {
$preset = (array)$preset;
$presets[$preset['presetid']] = $preset;
$presets[$preset['presetid']]['actions'] = imagecache_preset_actions($preset);
$presets[$preset['presetid']]['storage'] = 0;
$normal_presets[$preset['presetname']] = $preset['presetid'];
}
return $presets;
}
// 執行遷移
$styles_cnt = 0;
$effects_new_cnt = 0;
$effects_ext_cnt = 0;
$presets = imagecache_presets();
foreach ($presets as $preset) {
$styles_cnt++;
$style = image_style_load($preset['presetname']);
$style['name'] = $preset['presetname'];
$style = image_style_save($style);
if (!isset($style['effects'])) {
$style['effects'] = array();
}
foreach ($preset['actions'] as $action) {
// Drupal 7 將 imagecache_ 前綴改為 image_
$action['action'] = str_replace('imagecache', 'image', $action['action']);
$action['module'] = str_replace('imagecache', 'image', $action['module']);
$effect_ieid = FALSE;
foreach ($style['effects'] as $effect) {
if ($effect['name'] == $action['action'] &&
$effect['module'] == $action['module'] &&
$effect['weight'] == $action['weight'] &&
$effect['data'] == $action['data']) {
$effect_ieid = $effect['ieid'];
}
}
$effect = array();
if ($effect_ieid) {
$effects_ext_cnt++;
$effect = image_effect_load($effect_ieid, $style['name']);
} else {
$effects_new_cnt++;
$effect = image_effect_definition_load($action['action']);
}
$effect['isid'] = $style['isid'];
$effect['name'] = $action['action'];
$effect['module'] = $action['module'];
$effect['weight'] = $action['weight'];
$effect['data'] = $action['data'];
$effect = image_effect_save($effect);
$style['effects'][$effect['ieid']] = $effect;
}
$style = image_style_save($style);
}
print "Styles: $styles_cnt, Effects new: $effects_new_cnt, Effects exists: $effects_ext_cnt \n";
?>
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL))。imagecache_preset 與 imagecache_action 資料表。imagecache_* 替換為 image_*,並依權重、參數建立對應的 image effect。watchdog 錯誤日誌。
imagecache_canvasactions)。請先安裝對應的 Drupal 7 模組(如 image_effects)再執行遷移。
遷移完成後,請至「設定 > 媒體 > 影像樣式」檢查每個樣式是否正常運作,並清除快取。如有自訂模組呼叫 imagecache_create_path(),請改用 image_style_url()。