0

複数のスキンをサポートするWebサイトを書き直しています。現在、画像とCSSの変更を許可することを計画していますが、基になるHTMLは変更されません。また、スキンが画像またはCSSファイルを変更しない場合は、ベーススキンからそのファイルを継承します。

そのことを念頭に置いて、スキンに依存するファイルを提供するためにこれまでに検討した3つの方法を次に示します。

  1. ルックアップ関数を使用して、すべてのスキン固有のリクエストリクエストをビューにラップします。
    <img src = "<?php get_skin_file('/ images / header.png'、'skin1');?>" />

    関数get_skin_file($ file、$ skin){
        $ skin_file='/'。$skin。'/'。$ file;
        if(is_readable($ skin_file))return $ skin_file;
        '/default/'を返します。$ file;
    }
  1. phpに画像を提供させる

    <img src="/header.png.php?skin=skin1" />

  2. 常にスキンファイルのロードを試み、存在しない場合は、ModRewriteを使用して結果をphpハンドラスクリプトに送信します。

    <img src="/skin1/header.png" />

2番目は私がやりたいことですが、PHPが基本的にすべての画像ファイルを提供することのパフォーマンスへの影響に関心があります。

私のユーザーベースは十分に小さいので(約3万人のユーザー)、それが実際に問題になるとは思わないが、この状況で他の人々が何をしているのかを学びたい。

ありがとう。

編集:コードが正しくフォーマットされていない理由がわかりません。コードボタンを押して、4スペースであることを確認しましたが、それでも醜いです。申し訳ありません。

4

4 に答える 4

1

これらの3つはすべて完全に有効なオプションです。画像パスではなく画像名を使用しますが、個人的には最初の方が好きです。テーマコントロールビットが十分に強力である場合、これにより、テーマが独自の追加のユーザー制御可能な画像を定義できるようになります。

4番目のオプションを検討してください。imgタグを使用して実際に画像を挿入しないでください。代わりに、背景画像でdivを使用してください。これはほとんどの場合に機能し、画像の定義は完全にスタイルシートに任されます。残念ながら、これははるかに複雑なオプションでもあります。

于 2010-08-02T18:35:15.140 に答える
1

モジュール式で、将来の変更に簡単に適応できるように、これを構築しようと思います。私はあなたのコードにできるだけ難しい場所を置くことを避けるか、少なくともそれを1つの場所に最小化します。

調べる価値のあることの1つは、特定のスキンの写真に関する情報を含む、ある種のiniファイルまたはxmlファイルを用意することです。そうすれば、ハードロケーションはphpやhtmlになく、簡単に変更できるリソースファイルにあるだけです。

私はxmlを使うのが好きなので、ここにあなたができることの例があります。

これがhtmlです。

<?php $skin = "notDefault"; ?>
<img src="<?php get_skin_image("header",$skin) ?>" />
<img src="<?php get_skin_image("footer",$skin) ?>" />

次に、ここに関数があります。スキンイメージが見つからない場合は、デフォルトのxmlファイルからプルします。

function get_skin_image($type,$skin){
    $skin_xml_data = xml2array("skinFolderLocation/ " . $type . ".xml"); 
    $default_xml_data = xml2array("defaultFolderLocation/default.xml");
    // here is a link to the xml2array function for you to download 
    // http://www.php.net/manual/en/function.xml-parse.php#87920
    if(isset($skin_xml_data[$skin][$type])){
        return $skin_xml_dat[$skin][$type];
    } else {
        return $default_xml_data["default"][$type];
    }
}

そして最後に、xmlページがnotDefault.xmlとして保存されました

<notDefault>
    <header>locationToHeader/header.png</header>
    <footer>locationToFooter/footer.png</footer>
</notDefault>
于 2010-08-02T19:00:48.800 に答える
0

オプション2のバリエーションを使用することになりました。URLパターンをapacheで検索しています。スキン置換可能なURLが存在する場合、リクエストはスキンイメージ選択スクリプトにルーティングされます。

関連するapache設定は次のとおりです。

<Directory /var/www/website>
  RewriteEngine on
  RewriteBase /

  RewriteCond %{REQUEST_URI} \.select.(png|jpg|gif|txt|css)$ [NC]
  RewriteRule ^(.*)$ index.php?mode=select&q=$1 [L,QSA]
</Directory>

画像をレンダリングするファイルのPHPコードは次のとおりです。

<?php
preg_match("%^(?P<path>.+)\.select\.(?P<ext>(jpg|gif|png|txt|css))$%", $_REQUEST['q'], $matches);

$base = '/' . $matches['path'] . '.' . $matches['ext'];

$file = '/skins/' . App::get('skin') . '/' . $base;

if(is_readable($file)) {
  header('Content-type: image/' . $matches['ext']);
  header('Content-Transfer-Encoding: binary');
  header('Content-Length: ' . filesize($file)+1);
  readfile($file);
  exit();
}
//custom file isn't available, so load the default
$file = '/skins/default/' . $base;
header('Content-type: image/' . $matches['ext']);
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file)+1);
readfile($file);
exit();
?>

したがって、スキンを認識する必要がある私のビュー内のアセットについては、次のようにロードします。

<img src="/images/header.select.png" />

そしてapacheはそれをキャッチし、ハンドラースクリプトに送信します。

それについてあなたの助けをありがとう。stmpyを提供した他の2つの提案はどちらも機能し、Charlesも機能しますが、これは私にとって理想的な解決策でした。この方法のボーナスとして、css内の画像や、カスタムcssファイルなしでは動的に置き換えられない画像を置き換えることもできます。私のアプリケーションは主にプライマリ背景を置き換えるだけで構成されているので、私のテーマに必要なのは、ほとんどの場合、新しいスキンフォルダを作成して1つの背景画像をアップロードすることだけです。

于 2010-08-03T15:38:10.770 に答える
0

スキンのアセットに名前空間を付けられませんか?たとえば、私が構築するほとんどのアプリケーションには、incディレクトリ(プログラミングロジックを含む)とtplディレクトリがあり、それらは個別のスキン用に個別のディレクトリに分割されます。サイトにスキンが1つしかない場合、それらは1つのディレクトリになります。

例えば:

inc/
    ...
tpl/
    default/
        assets/
            css/
            images/
            js/
    alternative/
        assets/
            css/
            images/
            js/

私のコントローラースクリプトでは、配列を介して渡される変数をindex.phpリッスンできます。例えば:tpl$_GET

if (!isset($_SESSION['tpl'])) {
    $tpl = "default";
}
if (isset($_GET['tpl']) && is_dir('tpl/'.$_GET['tpl'])) {
    $_SESSION['tpl'] = $_GET['tpl'];
}
$tpl = $_SESSION['tpl'];

これで、現在のtpl値が$_SESSION配列(セッション間で値を保持したい場合は、代わりにCookieを使用するように簡単に変更できます)と$tpl変数で利用できます。次に、次のような画像とCSSパスを取得できます。

<img src="tpl/<?php echo $tpl; ?>/assets/images/heading.jpg" alt="Heading image" />

<link rel="stylesheet" href="tpl/<?php echo $tpl; ?>/assets/css/screen.css" type="text/css" />

アセット(CSS、画像、JavaScript)リクエストは、カスタム関数でラップできます。これは、たとえば、すべてのJavaScriptファイルがスキンに含まれていて、defaultそれらをスキンに複製したくない場合にも対処できますalternative

function get_template_file($filename, $tpl)
{
    // if we're requesting a JavaScript file, serve from 'default' regardless
    if (substr($filename, -3) == ".js") {
        return "tpl/default/".$filename;
    }
    else {
        $file = "tpl/{$tpl}/{$filename}";
        if (is_file($file) && is_readable($file)) {
            return $file;
        }
        else {
            $tpl = "default";
            return $file; // try return 'default' filepath
        }
    }
}
于 2010-08-03T15:48:14.483 に答える