【问题标题】:How to change header and footer dynamically?如何动态更改页眉和页脚?
【发布时间】:2012-08-15 21:14:16
【问题描述】:

早上好,

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

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

  1. index.php
  2. 组件
    • 组件1
      • component1.php
      • component1.js
      • component1.css

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

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

谢谢。

【问题讨论】:

  • shure,你可以读取目录中的文件并包含它们,但是如果你看看其他框架做了什么,在 component1.php 他们会注册女巫脚本和女巫 js 文件 index.php 应该包括
  • 但是他们如何注册呢?例如,当您到达“注册”它的假定部分时,您无法更改已经生成的 HTML。
  • 我不确定问题出在哪里,您的所有逻辑都应该在开始生成/输出 html 之前。在那里你决定你需要包括什么,然后你把它包括在适当的地方。
  • 也许您正在寻找输出缓冲? php.net/manual/en/function.ob-start.php
  • @jeroen 但是我如何发送我所在页面的信息以及应该加载哪些文件,如果在标题之后的视图(或类似的东西)中定义了加载了吗?

标签: php javascript css frameworks


【解决方案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】:

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

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

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

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

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

    所以让我澄清一下:

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

    【讨论】:

    • 哇,这看起来很棒,但我真的需要认真学习一点元显化,我从来不知道它们是什么。想了解一下他们,谢谢!
    【解决方案3】:

    一种可能的方法是将您的整个模板/视图/无论您想调用什么都表示为一个对象:

    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,而不是 @987654326 @。当然,这实际上取决于框架中的“组件”应该是什么,所以我将由您决定。

    【讨论】:

    • 你怎么能说应该调用哪个视图呢?比如index.php中的switch case,然后调用类?
    • 这就是所谓的路由,在大多数框架中,它是基于URL的。例如,URL /products/view/123 会调用ProductController 的viewAction() 方法,/cars/index 会调用CarController 的indexAction() 方法。
    • 你应该看看MVC架构,这就是这种类型的op框架的名称。这确实是构建可扩展、易于维护的项目的好方法。如果我在哪里编写自己的框架,那将是我的选择!为 OOP 方法 +1!
    • 我是否应该调用一个基于 switch 案例的新视图,在其中选择要显示的页面?
    • @IvoPereira:不,您应该根据 URL 动态执行此操作,就像我在上一条评论中解释的那样。如果/products/index 是您的URL,那么您将拥有$foo = "products" 和$bar = "index",并且您执行$controllerClass = ucfirst($foo) . 'Controller'; $controller = new $controllerClass(...); $action = $bar . 'Action' 之类的操作,然后将您的请求发送为$controller-&gt;{$action}()。您还可以检查method_exists($controller, $action) 是否存在,如果不存在则给用户一个 404 Not Found。
    猜你喜欢
    • 2013-06-22
    • 2023-03-17
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2014-07-31
    • 2019-02-13
    相关资源
    最近更新 更多