假设我有一个索引模块(模型视图和控制器)。
例如,在索引页面上,我想使用Highchart。
最简单的做法是在我的模板上包含 highchart.js。
但是,如果我不想在其他页面上包含 highchart.js怎么办?
如果我在模板中包含我的所有插件,那将是一种浪费,而且页面可能需要更长的时间来加载。Codeigniter 3 中有什么方法可以只在需要时加载插件吗?
这完全是您在哪个页面上的句柄,您必须加载哪个插件。你可以动态地包含js,css。您可以在所有视图页面中静态提及应该包含哪些js或css,或者您可以传递给控制器。
这里有一些参考。希望它能有所帮助:
1) Codeigniter - 如何在视图中
包含动态 JavaScript 文件2)如何在codeigniter
第一个分类插件包含在3个(或更多,因为需要的插件数量)类别:-
1)经常使用(包含在60-100%的页面上)
2)很少使用(包含在20-60%的页面上)
3)一次或不超过2-5页
为前 2 个类别创建单独的模板,并在您需要的位置包含。
对于最后一种类型,单独包括
在模板库中添加一个函数来加载 JS 文件:
public function set_js($name, $src)
{
$src = htmlspecialchars(strip_tags($src));
$this->_js[$name] = '<script src="'.$src.'"></script>';
return $this;
}
用作:
$this->template->set_js('js-file', base_url() .'assets/vendor/js-file/js-file.min.js');
在您的控制器中。
然后,您可以在布局中添加
<?php print $template['js']; ?>
最后我使用 HMVC,然后我创建自己的核心控制器作为 MY_Controller 然后在这个类下我编写函数来获取带有开关大小写的插件。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class MY_Controller extends MX_Controller
{
public function __construct()
{
parent::__construct();
$this->load->module("Template");
}
public function include($plugin)
{
switch ($plugin) {
case 'highcharts':
return "global/plugins/js/highcharts.js";
break;
}
}
}
然后在我的模块控制器中,我扩展了核心控制器,然后将其放在一个数组中,因此如果我有超过 1 个插件,我可以将它们包含在数组中。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Ookla extends MY_Controller {
public function index()
{
$data["js"] = [
$this->include('highcharts') // <- here
];
$data["main_content"] = "ookla/ookla";
$this->template->master_template($data);
}
}
然后在我的master_template视图中,只要它在数组中有插件,我就会循环它。
...
<?php
if(isset($js)){
foreach ($js as $item) {
echo "<script type='text/javascript' src='".base_url()."assets/".$item."'></script>";
}
}
?>
</body>
</html>
谢谢你们的见解。