2013-07-07 47 views
0

我正在編寫一個小PHP庫(一堆PHP類)。 類的一個創建HTML表格,其中布爾值由圖標表示,即其輸出的一部分可能是這樣的:PHP:引用庫範圍中的資源

...<td class="img"><img width="16" height="16" alt="true" src="???/valid_16.png"></td>... 

的問題是:我不知道如何指定src屬性。

當然,我知道從PHP類到圖像文件(庫內)的相對路徑。 但src屬性需要一個URI,我不想對服務器上庫的最終位置做出假設。

那麼,是否有可能引用圖像文件,使其相對於實際庫位置不變? 還是我應該重新考慮我的設計?

回答

0

您可以隨時爲圖書館用戶提供資產目錄的url路徑作爲參數,以便您可以使用它作爲src屬性的前綴。

如果您確信您的圖書館的工作生成HTML輸出,爲用戶在這種特殊情況下,我會做出這些圖像的background-image,因爲在CSS中,相對url() s的相對於該文件的路徑解決,這樣如果用戶的你的圖書館只是提取資源的CSS文件,它將「開箱即用」(假設他們將css文件添加到他們的網站)。如果稍後您決定將這些圖標轉換爲圖標字體(如font awesome)以支持高DPI顯示或縮放,這將會非常方便。

+0

謝謝你提出這些寶貴的建議! – thofou76

0

基於complex857的建議,我想出了這個解決方案:

我創造了在圖書館的主目錄中的類,設置了自動加載的庫命名空間。 它也決定了庫的位置(假設庫和使用它的代碼都在同一個文檔根下)。 這個類是圖書館用戶必須明確包含的唯一一個。 它看起來像這樣:

<?php 

namespace vendor\lib; 

class Includer 
{ 
    public static $libUrl; 
    public static $libPath; 

    public static function getUrl($dir) 
    { 
     $url = substr($dir, strlen($_SERVER['DOCUMENT_ROOT'])); // remove root prefix from dir 
     return str_replace('\\', '/', $url) . '/'; // windows... 
    } 

    public static function registerNamespaceAutoload($namespace, $path) 
    { 
     // some code to register autoload for given namespace using given path 
    } 
} 

// determine library location 
Includer::$libUrl = Includer::getUrl(dirname(dirname(__DIR__))); // lib's top level dir (two levels up relative to vendor\lib\Includer) 
Includer::$libPath = str_replace('/', DIRECTORY_SEPARATOR, $_SERVER['DOCUMENT_ROOT'] . Includer::$libUrl); 

// register autoload for library 
Includer::registerNamespaceAutoload('vendor\\lib\\', Includer::$libPath); 

?> 

使用獲得的URL位於供應商/ lib目錄/圖像的圖像/:

<?php 

namespace vendor\lib\images; 
use vendor\lib\Includer; 

class Image 
{ 
    public static function getUrl($fileName) 
    { 
     return Includer::$libUrl . 'vendor/lib/images/' . $fileName; 
    } 
} 

?> 

缺點:使用別名(在開發環境中時,這不起作用)。