2

Good morning,

I'm creating my own framework to use in my PHP projects, and I was thinking of some way that I could add .CSS files in the header part of the page, and .JS files and scripts in the footer (keeping HTML clean and valid), but - all this dynamically.

I mean, for example, imagine I have the following structure:

  1. index.php
  2. components
    • component1
      • component1.php
      • component1.js
      • component1.css

I would like to include each file I need dynamically in index.php for example, keeping the code clean.

And for example, imagine that I insert JS directly in component1.php, is it possible to dynamically add it to component1.js (without human job, to save time in future)

Thanks.

4

3 に答える 3

1

出力を開始する前に、js および css アセットを先頭に含める方法の非常に簡単な例:

// somewhere in the beginning, before html output
$js = array();
$css = array();

$css[] = 'all_pages.css';
$js[] = 'all_pages.js';
if (some_condition_based_on_page)
{
  $css[] = 'some_page_specific.css';
  $js[] = 'some_page_specific.js';
}

...

// in your view where you build the head section
foreach ($css as $item)
{
  echo "<link rel='stylesheet' href='{$item}' type='text/css'>";
}

...

// in your view where you build the footer
foreach ($js as $item)
{
  echo "<link src='{$item}' type='text/javascript'>";
}
于 2012-08-22T13:50:52.960 に答える
1

それを行う1つの可能な方法は、テンプレート/ビュー/呼び出したいもの全体をオブジェクトとして表すことです:

class View {
    // ...
}

このindex.phpファイルは、使用するコンポーネントを決定して作成し、必要な CSS/JS ファイルがあるかどうかをポーリングできます。

$view = new View();

foreach ($components as $component) {
    $cmp = new $component();
    $view->addCss($cmp->getCss());
    $view->addJs($cmp->getJs());
}

すべてが含まれたらindex.php、全体をレンダリングできます。

$view->render();

明らかにこれは単なる例であり、構文はさまざまですが、うまくいけばアイデアが得られます.

編集:コンポーネントをビューに直接追加するだけでロジックをもう少し簡潔にすることもできます。ビューの内部ロジックは、index.php. もちろん、「コンポーネント」がフレームワーク内にあると想定されているものに大きく依存するため、決定はあなたに任せます。

于 2012-08-20T14:30:03.820 に答える
0

最も簡単で移植性の高い方法は、特定のパターンに一致するすべてのファイルを含めることです(例:/components/component1/header.css)。

これは2つの問題を引き起こします。1つはパフォーマンスです(すべてのコンポーネントのすべてのディレクトリを確認する必要があります)。もう1つは、コンポーネントの分離です。つまり、特定のCSSを別のCSSの前後に含める必要がある場合、そこにある場合とない場合がある場合はどうなりますか?

各コンポーネントに「マニフェスト」を含めることで、両方の問題を解決しようとする場合があります。これにより、最初に、ファイルの場所とファイルを含める場所を指定できます。次に、処理は「components」ディレクトリを調べてすべてのマニフェストをデコードし、これを一連のディレクティブベクトル($ CSSToBeIncludedInThisOrder []など)に「コンパイル」することになります。コンパイルされたオブジェクトをキャッシュされたファイルにシリアル化することもできます。もちろん、コンポーネントへの変更には、コンパイルされたメタマニフェストの削除を含める必要があります。

後で、条件付き優先順位などのマニフェスト命令に含めることができます。

これはすべて、クライアントのブラウザに何かを送信する前に行う必要があります(コンポーネントZZZがob_状態、またはおそらくエンコーディングを変更したい場合、またはダウンロードオーバーライドコンポーネントであり、Content-Typeタイプのアプリケーション/オクテットストリームを送信したい場合はどうなりますか? ?)しかし、「コンパイル」は知覚待ち時間を低く保つことを可能にするはずです。

はっきりさせておきましょう:

1. index.php checks whether a metamanifest.cache file exists.
2. If it does, it runs something like
    $__META = unserialize(file_get_contents($METACACHE));
   and goes on to #4.
3. If it does not, opendirs/readdirs the components directory,
   looks what files are there, decides (but does not do yet) what to do with them,
   placing those decisions in $__META, e.g. $__META['HeaderJS'][].
4. Now HTML generation begins: the __META array is walked and everything that
   needs doing gets done (headers, inclusion of JS in heads, etc.).

フェーズ3では、重複するチェックやバージョン管理を実行する場合もあります。たとえば、両方に「jQuery.js」を含める必要がある2つのコンポーネントがあるとします。「/components/comp1/js/jQuery.js」と「/components/comp2/js/jQuery.js」を__Meta['HeaderJS']にやみくもに追加する代わりに、システムは競合を宣言するか、次の方法で解決されると判断できます。それらの1つだけを含めることにより、処理時間をさらに短縮します。

于 2012-08-20T14:28:15.663 に答える