2013-07-07 51 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; 
    } 
} 

?> 

缺点:使用别名(在开发环境中时,这不起作用)。