首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

從 Drupal 6 ImageCache 遷移至 Drupal 7 Image Styles 完整指南

     編輯:PHP 相關知識

背景與動機

Drupal 6 中廣泛使用的 ImageCache 模組在 Drupal 7 已整合進核心,並更名為「影像樣式」。若你正在將網站從 Drupal 6 升級至 Drupal 7,必須將舊的 ImageCache preset 轉換為新的 image style。本文提供一個可直接執行的 PHP 腳本,自動完成這項遷移工作。

遷移腳本使用說明

  1. 在 Drupal 7 站點的根目錄下建立一個 PHP 檔案(例如 migrate_imagecache.php)。
  2. 將下方完整程式碼複製進去並儲存。
  3. 在瀏覽器中訪問該檔案(如 https://your-site.com/migrate_imagecache.php)即可執行遷移。
  4. 執行完成後,畫面會顯示遷移統計:建立的樣式數量、新增的效果數、已存在的效果數。
  5. 重要: 遷移完成後請立即刪除該 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 環境(drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL))。
  • 讀取 Drupal 6 的 imagecache_preset 與 imagecache_action 資料表。
  • 對每個 preset,在 Drupal 7 中建立或載入同名的 image style。
  • 將每個 action 的機器名從 imagecache_* 替換為 image_*,並依權重、參數建立對應的 image effect。
  • 若效果已存在(名稱、模組、權重、參數皆相同)則更新,否則新增。

常見問題

執行後沒有任何輸出?
確認 Drupal 已正確啟動,且資料庫連線正常。檢查 watchdog 錯誤日誌。
部分效果遺失?
Drupal 7 核心不包含所有 Drupal 6 ImageCache 外掛提供的效果(如 imagecache_canvasactions)。請先安裝對應的 Drupal 7 模組(如 image_effects)再執行遷移。
多語言網站?
腳本僅處理預設語言的 preset。若有多語言覆寫,需另行處理。

後續建議

遷移完成後,請至「設定 > 媒體 > 影像樣式」檢查每個樣式是否正常運作,並清除快取。如有自訂模組呼叫 imagecache_create_path(),請改用 image_style_url()。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved