如何动态更改页眉和页脚?

时间:2012-08-20 14:18:44

标签: php javascript css frameworks

早上好,

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

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

  1. 的index.php
  2. 部件
    • COMPONENT1
      • component1.php
      • component1.js
      • component1.css
  3. 我想在index.php中动态包含我需要的每个文件,例如,保持代码清洁。

    例如,假设我直接在component1.php中插入JS,是否可以将其动态添加到component1.js(无需人工,以便将来节省时间)

    感谢。

3 个答案:

答案 0 :(得分: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,而不是{{ 1}}。当然,这实际上取决于你的框架中应该包含什么“组件”,所以我将由你决定。

答案 1 :(得分: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'>";
}

答案 2 :(得分:0)

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

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

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

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

所有这些都应该在将任何内容发送到客户端的浏览器之前完成(如果组件ZZZ希望改变ob_状态,或者可能是编码,或者是下载覆盖组件并且想要发送内容类型的应用程序,那该怎么办? 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”;而不是盲目地将“/components/comp1/js/jQuery.js”和“/components/comp2/js/jQuery.js”附加到__Meta ['HeaderJS'],系统可以声明冲突或决定它是由仅包括其中一个,从而进一步缩短处理时间。