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

Php 如何动态更改页眉和页脚?,php,javascript,css,frameworks,Php,Javascript,Css,Frameworks,早上好 我正在创建我自己的框架,用于我的PHP项目,我正在考虑一些方法,可以在页面的页眉部分添加.CSS文件,在页脚部分添加.JS文件和脚本(保持HTML干净有效),但是——所有这些都是动态的 我的意思是,例如,假设我有以下结构: index.php 组成部分 组件1 component1.php 组件1.js 组件1.css 例如,我想在index.php中动态地包含我需要的每个文件,以保持代码的整洁 例如,假设我直接在component1.php中插入JS,是否可以将其动态添加到co

早上好

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

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

  • index.php
  • 组成部分
    • 组件1
      • component1.php
      • 组件1.js
      • 组件1.css
  • 例如,我想在index.php中动态地包含我需要的每个文件,以保持代码的整洁

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


    谢谢。

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

    这将带来两个复杂问题。一个是性能(您需要检查所有组件的所有目录)。另一个是组件的隔离,也就是说,如果您需要在另一个CSS之前或之后包含一个给定的CSS,那么会发生什么情况,可能存在,也可能不存在

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

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

    所有这些都应该在将任何内容发送到客户端浏览器之前完成(如果组件ZZZ希望更改ob_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

    因此,让我澄清:

    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]”中不同,系统可以声明冲突或通过只包含其中一个来决定冲突是否得到解决,从而进一步减少处理时间。

    一种可能的方法是将整个模板/视图/任何您想称之为对象的内容表示为:

    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();
    
    显然,这只是一个示例,您的语法会有所不同,但希望您能理解


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

    一个非常简单的示例,说明如何在开始输出任何内容之前,将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'>";
    }
    
    //在开始的某个地方,在html输出之前
    $js=array();
    $css=array();
    $css[]=“all_pages.css”;
    $js[]='all_pages.js';
    如果(基于页面上的某些条件)
    {
    $css[]=“一些特定于页面的.css”;
    $js[]=“某些特定页面的.js”;
    }
    ...
    //在您构建头部部分的视图中
    foreach($css作为$item)
    {
    回声“;
    }
    ...
    //在构建页脚的视图中
    foreach($js作为$item)
    {
    回声“;
    }
    
    shure,您可以读取目录中的文件并将其包含在内,但是如果您查看其他框架的功能,在component1.php中,他们会注册witch script,witch js files index.php应该如何注册?例如,当您到达“注册”它的假定部分时,您无法更改已经生成的HTML。我不确定问题是什么,在您开始生成/输出HTML之前,您的所有逻辑都应该在一开始。在这里,您决定需要包含什么,然后在适当的位置包含它。也许您正在寻找输出缓冲@jeroen但是如果在头文件加载后在视图(或类似的东西)中定义了,我如何发送我所在页面的信息以及应该加载哪些文件呢?哇,这看起来很棒,但我真的需要研究一下metamanifest,因为我从来都不知道它们是什么。我会读一点关于他们的,谢谢!您如何确定应该调用哪个视图?例如,index.php中的一个switch case,然后调用该类?这称为路由,在大多数框架中,它基于URL。例如,URL
    /products/view/123
    将调用
    ProductController
    viewAction()
    方法,
    /cars/index
    将调用
    CarController
    indexAction()
    方法。您应该查看MVC体系结构,这就是这种类型的op框架的名称。这是构建可扩展、易于维护的项目的一种非常好的方法。如果我在哪里编写自己的框架,这将是我的选择+1为面向对象方法!例如,我是否应该调用一个基于切换案例的新视图,在该视图中,我选择要显示的页面?@IvoPereira:不,您应该根据URL动态地执行此操作,就像我在上一篇评论中解释的那样。如果
    /products/index
    是您的URL,那么您将拥有
    $foo=“products”
    $bar=