2

早上好,

我正在创建自己的框架以在我的 PHP 项目中使用,并且我正在考虑某种方法可以在页面的页眉部分添加 .CSS 文件,在页脚中添加 .JS 文件和脚本(保持 HTML 干净和有效),但是 - 这一切都是动态的。

我的意思是,例如,假设我有以下结构:

  1. 索引.php
  2. 成分
    • 组件1
      • 组件1.php
      • 组件1.js
      • 组件1.css

例如,我想在 index.php 中动态包含我需要的每个文件,以保持代码干净。

再比如假设我直接在component1.php中插入js,是否可以动态添加到component1.js中(无需人工,以后节省时间)

谢谢。

4

3 回答 3

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();

显然这只是一个示例,您的语法会有所不同,但希望您能理解。

编辑:您还可以通过直接将组件添加到视图来使逻辑更简洁,并让视图的内部逻辑处理轮询/添加 CSS/JS,而不是index.php. 当然,这实际上取决于框架中的“组件”应该是什么,所以我将由您决定。

于 2012-08-20T14:30:03.820 回答
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 回答
0

最简单且更便携的方法是包含与特定模式匹配的所有文件,例如 /components/component1/header.css

这会带来两个并发症。一是性能(您需要检查所有组件的所有目录)。另一个是组件的隔离,即,如果您需要将给定的 CSS 包含在另一个可能存在或不存在的 CSS 之前或之后,会发生什么?

您可以尝试通过在每个组件中包含一个“清单”来解决这两个问题,它可以首先指定任何文件的位置以及它们应该包含的位置。然后你的处理被简化为检查“组件”目录并解码所有清单,并在一系列指令向量中“编译”它(例如 $CSSToBeIncludedInThisOrder[] )。您还可以将编译后的对象序列化为缓存文件。当然,对组件的任何更改都应包括删除已编译的元清单。

稍后,您可能会在清单指令中包含条件优先级等。

所有这一切都应该在任何东西发送到客户端浏览器之前完成(如果组件 ZZZ 希望改变 ob_ 状态,或者可能是编码,或者是一个下载覆盖组件并且想要发送一个 Content-Type 的 application/octet-stream ?),但“编译”应该允许保持较低的感知延迟。

所以让我澄清一下:

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”;系统可以声明冲突或决定通过仅包括其中之一,从而进一步减少处理时间。

于 2012-08-20T14:28:15.663 回答