使用控制器处理返回自定义css &Javascript文件与编码器


Using a controller to handle returning customized css & javascript files with codeigniter

我正在一个php/codeigniter项目上工作,我正在考虑创建一个专门处理返回自定义css的控制器&javascript文件。

在以前的项目中,我包含了外部CSS &JS文件在我的视图文件的头,但他们基本上必须是静态的,因为他们只是作为常规资产发送的服务器。对于我的下一个项目,我正在考虑使用控制器,基本上使我的CSS/Javascript文件'视图'由控制器加载。

你们觉得怎么样?这是一个好方法吗?有没有一种被普遍接受的更好的方法?

通过在js/css中使用控制器,你需要为每个文件请求加载大量不必要的东西。安全类、输入类、路由器、异常等。

对于应该是静态内容的,您不需要这些。您也不希望文件是动态的(每次请求都更改),因为这会影响浏览器缓存。文件要么以加载时的状态被缓存,要么你将失去浏览器缓存的好处。

您最好的选择是组合文件,最小化它们,并将内容写入静态文件,但这样它们就不是动态的了。然而,他们可能不应该。

您可以做的另一件事是使用php文件来组合静态文件并在<link>标记(screen.php)中引用它。简单的CSS示例:

<?php
header('Content-type: text/css');
$files = array(
    'css/reset.css',
    'css/screen.css',
    'css/typography.css',
);
foreach ($files as $file)
{
    readfile($file);
}

无论哪种方式,您都应该更新文件名,可能使用查询字符串,以避免提供旧的缓存文件。示例:/screen.css?version=2

我确实使用$this->load->view()有时动态js,但只有内联脚本标签(动态所见即所得配置为例)。这允许你将变量传递给"view"文件,并避免缓存问题。

我的观点是,仅仅为了提供应该是静态内容的而启动CI和所有相关依赖关系是不值得的。

我不知道是否有一个"官方"的方式这样做,我通常把一个页面分成不同的视图,其中一个是页头。如果你输入

class mycontroller extends CI_Controller {
function index()
{
   $data['css'] = 'style1.css';
   $data['js'] = 'custom.js';
   $this->load->view('head',$data);
   $this->load->view('body');
   $this->load->view('foot')  // where I close the </html> tag, for example
}
}

你可以传递任何值在视图中加载控制器传递的值

<!DOCTYPE>
<html>
<head>
<?php echo link_tag(base_url().'css/'.$css);?>
<script type="text/css" src="<?php echo base_url();?>js/<?php echo $js;?>"></script>
</head>

我以前做过的事情是,我有一个"总是使用"的css/js文件的标准列表,然后每个控制器可以包括自己的特定的。在控制器中,我为js/css设置了一个"includes"数组,然后头视图检查该数组并将其内爆。这样,所有需要的js/css文件都在head标签中指定。

来自控制器的例子:

$data['includes']['js'] = array('<script type="text/javascript" src="' . base_url() . 'assets/js/script.js"></script>');

示例from view:

if(isset($includes['js'])) echo implode("'n", $includes['js']) . "'n";