0

私は小さな PHP ライブラリ (PHP クラスの束) を書いています。クラスの 1 つは、ブール値がアイコンで表される HTML テーブルを作成します。つまり、その出力の一部は次のようになります。

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

問題は、src 属性の指定方法がわからないことです。

もちろん、PHP クラスから画像ファイル (ライブラリ内) への相対パスはわかっています。しかし、src 属性には URI が必要であり、サーバー上のライブラリの最終的な場所について推測したくありません。

では、実際のライブラリの場所に対して不変であるように画像ファイルを参照することは可能ですか? それとも、デザインを再考する必要がありますか?

4

2 に答える 2

0

src 属性のプレフィックスとして使用できるように、ライブラリ ユーザーがアセット ディレクトリの URL パスをパラメータとして指定することを常に必須にすることができます。

この特定のケースでライブラリのジョブがユーザーの html 出力を生成することが確実な場合は、これらの画像をbackground-imageにします。css では、相対url()s はファイルのパスに対して相対的に解決されるため、ライブラリのユーザーが単に抽出する場合css ファイルを含むアセットは、「箱から出して」動作します (css ファイルをサイトに追加した場合)。これは、後でこれらのアイコンをアイコン フォント ( font awesomeなど) に変換して、高 DPI ディスプレイまたはスケーリングをサポートすることにした場合に便利です。

于 2013-07-07T20:41:48.707 に答える
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);

?>

vendor/lib/images/ にある画像の URL を取得するための使用法:

<?php

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

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

?>

欠点: (開発環境で) エイリアスを使用する場合、これは機能しません。

于 2013-07-08T09:45:11.950 に答える