MVC 模型中的外部 CSS 和 JS 文件


External CSS and JS files in MVC model

所以,我正在尝试基于我自己的类似MVC的PHP模型构建一个网站。

假设每个视图至少包含 2 个部分:

让它们成为"模板.php"和"我的页面.php"(第二部分取决于特定的页面,第一部分是常见的(。

模板.php具有以下代码(简体版本(:

<html>
<title>Sometitle</title>
<link rel='stylesheet' href='/css/gen.css' type='text/css' />
<script type='text/javascript' src='/js/gen.js'></script>
<?php echo $other_external_files; ?>
</head>
<body>
<div class="some_header_and other stuff">...</div>
<div class="workfield">
<?php include_once mypage.php; ?>
</div>
</body>
</html>

"mypage.php"(以及其他一些页面(具有一些特定的.css和应包含.js文件的问题。

问题是:包含这些文件的最佳选择是什么(如何以及在何处(?

以下是我的想法:

  1. 我可以在模型或控制器中定义变量$other_external_files,但实际上并不想这样做,因为.css文件通常是视图的一部分,我可以在"mypage.php"中对其进行硬编码,只要它不需要保留在<head>中。

  2. 我知道 .css 和.js文件可以动态包含在 JavaScript 中,但如果没有强烈需求,我想避免使用这个解决方案。

  3. 我可以在相应的模型中定义所有这些变量。这里的问题是,从一开始我就一直在尝试根据内容构建我的模型(因此,我有通用模型(文件和类(,如"用户"、"Shop_items"等,不一定对应于每个视图文件(这意味着我基本上没有任何mypage_model.php,只有"items_model"、"users_model"等(。在模型中定义页面的标题将迫使我添加大量模型文件。

  4. 我可能会在核心 View 类中自动定义变量$other_external_files,如下所示:

-

function __construct($action){
$this->action = $action.'.php';
$this->css_file = 'css/'.$action.'.css';
}
function generate($view_lvl, $data = null){
$other_external_files = $this->css_file;
require_once $action;
}

但是,这种方法似乎很有限,因为可能存在一种情况,当我想包含几个名称完全不同的文件时。

我个人现在的选择是第三个,因为它不仅允许附加css和js,还可以轻松定义文档的标题和其他可能的变量......但是在增加我的文件之前,我想咨询有经验的程序员,如果这真的是正确的方法。

非常感谢,很抱歉有一个很长的问题。任何帮助都非常感谢!

我通常不会选择这种阵型。经验向我证明,如果我将每个视图/页面分离为一个文件,它会更有用。我总是使用您的策略来处理它们更像模板的页面,当涉及到页面的独特属性(如标题(时,我使其非常严格,以免混淆。例如,我从一个地方获取这些属性,例如pages的数据库表。

对于像JavaScript或CSS文件这样的资源,我在每个视图中都像普通页面一样包含它们。我认为最好不要将它们填充在像 $other_external_files; 这样的变量中,而是在每个单独的视图中以不同的方式放置它们。

例如,这是我about.php的观点:

<html>
<head>
<title>About</title>
<link rel='stylesheet' href='<?php echo ABS_PATH; ?>/css/extra.css' type='text/css' />
<link rel='stylesheet' href='<?php echo ABS_PATH; ?>/css/extra2.css' type='text/css' />
<script type='text/javascript' src='<?php echo ABS_PATH; ?>/js/extra.js'></script>
</head>
<body>
</body>
</html>

这是我contact.php的观点:

<html>
<head>
<title>Contact</title>
<link rel='stylesheet' href='<?php echo ABS_PATH; ?>/css/extra3.css' type='text/css' />
<script type='text/javascript' src='<?php echo ABS_PATH; ?>/js/extra.js'></script>
<script type='text/javascript' src='<?php echo ABS_PATH; ?>/js/extra2.js'></script>
</head>
<body>
</body>
</html>

对于我非常动态的页面:

<html>
<head>
<title><?php echo $TITLE; ?></title>
<link rel='stylesheet' href='<?php echo ABS_PATH; ?>/css/extra3.css' type='text/css' />
<script type='text/javascript' src='<?php echo ABS_PATH; ?>/js/extra.js'></script>
<script type='text/javascript' src='<?php echo ABS_PATH; ?>/js/extra2.js'></script>
</head>
<body>
</body>
</html>

如果您查看我的动态页面,您会发现我将实际数据传递给它。这意味着我从控制器获取相关数据,然后通过它。