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

Elgg 實體圖標存儲與 URL 生成機制深度解析

     編輯:PHP 綜合知識

圖標上傳與多尺寸生成流程

當實體(如 Activity)保存時,系統自動處理上傳的圖標文件:

if (isset($_FILES['icon']) && strpos($_FILES['icon']['type'], 'image/') === 0) {
    $prefix = "activity/{$activity->guid}";
    $file = new ElggFile();
    $file->owner_guid = $activity->owner_guid;
    $file->setFilename($prefix . ".jpg");
    $file->open('write');
    $file->write(get_uploaded_file('icon'));
    $file->close();

    // 生成四種尺寸縮略圖
    $sizes = ['tiny'=>25, 'small'=>40, 'medium'=>100, 'large'=>200];
    foreach ($sizes as $suffix => $size) {
        $thumb = get_resized_image_from_existing_file($file->getFilenameOnFilestore(), $size, $size, true);
        if ($thumb) {
            $tfile = new ElggFile();
            $tfile->owner_guid = $activity->owner_guid;
            $tfile->setMimeType('image/jpeg');
            $tfile->setFilename("{$prefix}{$suffix}.jpg");
            $tfile->open('write');
            $tfile->write($thumb);
            $tfile->close();
        }
    }
}

文件存儲路徑規則

文件按用戶 GUID 字符分目錄存儲:{dataroot}/{a}/{b}/{c}/.../{guid}{size}.jpg,例如用戶 GUID 12345 存儲於 1/2/3/4/5/ 目錄下。

圖標 URL 動態生成:Hook 機制

  1. 調用 $entity->getIcon($size) → 內部調用 get_entity_icon_url()
  2. 觸發插件鉤子 entity:icon:url:
    $url = trigger_plugin_hook('entity:icon:url', $entity->getType(), [...], $url);
  3. 插件在 start.php 註冊鉤子:
    register_plugin_hook('entity:icon:url', 'object', 'activity_activityicon_hook');
  4. 鉤子函數實現:
function activity_activityicon_hook($hook, $type, $return, $params) {
    global $CONFIG;
    if (!$return && $hook == 'entity:icon:url' && $params['entity'] instanceof Activity) {
        $entity = $params['entity'];
        $size = $params['size'];
        $icontime = $entity->icontime ?: 'default';

        $file = new ElggFile();
        $file->owner_guid = $entity->owner_guid;
        $file->setFilename("activity/{$entity->guid}{$size}.jpg");
        if ($file->exists()) {
            return "{$CONFIG->url}pg/activityicon/{$entity->guid}/{$size}/{$icontime}.jpg";
        }
    }
}

關鍵點總結

  • 多尺寸預生成:上傳時一次性生成 4 種尺寸,避免訪問時動態裁剪
  • Hook 解耦:核心不綁定具體路由,插件通過鉤子自定義 URL 格式
  • 版本控制:icontime 參數實現瀏覽器緩存失效(更新圖標時修改該時間戳)
  • 權限隔離:文件歸屬 owner_guid,配合 Elgg 權限系統控制訪問

此機制體現了 Elgg 核心與插件解耦、實體文件管理統一化的設計哲學。

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