CodeIgniter 资产目录字符串助手
CodeIgniter Assets Directory String Helper
我正在使用 CodeIgniter 3.1.7 并自动加载并启用 url 助手。
如何编写 assets_helper.php
使用 base_url();
解析 https://something.tld/
并将第一组作为子文件夹,如果没有组,那么它将使用基础资产文件夹?
来自
<?php echo assets_url('css', 'style.css'); ?>
<?php echo assets_url('js', 'script.js'); ?>
<?php echo assets_url('php', 'test.php'); ?>
<?php echo assets_url('icon.ico'); ?>
到
https://something.tld/assets/css/style.css
https://something.tld/assets/js/script.js
https://something.tld/assets/php/test.php
https://something.tld/assets/icon.ico
我知道只写 <?php echo base_url('assets/css/style.css'); ?>
更容易实现这一点,但很难维护,假设我打算下次将资产文件夹更改为 /subfolder/1/2/3/assets/
。我可以只更改帮助文件中的 1 个变量而不会弄乱原始源代码。
如果您创建 asset_helper.php
,那么您需要自动加载它。在 codeigniter 中,您可以向现有的助手添加新功能。由于 url_helper
已经自动加载并可以使用,我将向 url_helper 添加新功能。
在 application/helpers
目录中创建一个新文件 MY_url_helper.php
。
复制并粘贴以下代码。
<?php
function assets_url($dir,$file=null){
$assets_dir = base_url()."path/to/your/assets_folder/";
$asset_path = $assets_dir.$dir;
if(!empty($file)){
$asset_path .="/$file";
}
return $asset_path;
}
将 path/to/your/assets_folder/
替换为您的资产文件夹(末尾的“/”很重要)。
你可能会发现我写的这个模型很有用,它需要修改。
$this->asset->load('item')
如果 item
在 $this->assets
数组中,它将从那里加载。
否则你必须传递一个url,或者名称:$this->asset->load('item.js');
你也可以传递一个数组$this->asset->load(array('item1.js', 'item2.css'));
它将使用 CI 中的 link_tag
函数,以及自定义 script_tag
函数和 return 包含适当 js/css [=19] 的字符串=] 和 <link>
标签。
需要对常量ASSET_DIR
、ROOT
进行一些修改和定义。但是功能是有的。
class Asset_loader_model extends CI_Model {
private $types = array('css', 'js');
private $assets = array();
public function __construct() {
parent::__construct();
$this->assets = $this->n_config->get('plugin_assets');
}
/**
* Loads an asset or assets by key
*
* @param string $asset
* @param boolean $return Default to false
*/
public function load($asset, $return = false) {
$out = '';
if (is_array($asset)) {
foreach ($asset as $src) {
$out .= $this->load($src, true);
}
} else {
if (isset($this->assets[$asset])) {
// asset is in the plugins array
$out .= $this->__load($this->assets[$asset]);
} elseif (is_file(ROOT . ASSETS_DIR . $asset)) {
// asset must be a /js/include.js
$out .= $this->__load($asset);
} else {
trigger_error("Could not find asset {$asset}.", E_USER_WARNING);
}
}
if ($return) {
return $out;
} else {
echo $out;
}
}
/**
* Loads a single asset array by key
*
* @param key $asset
* @return string
*/
private function __load($asset) {
$out = '';
if (is_array($asset)) {
foreach ($asset as $type => $srcs) {
if (!in_array($type, $this->types)) {
continue;
}
if (is_array($srcs)) {
foreach ($srcs as $src) {
$out .= $this->load_individual($src, $type);
}
} else {
$out .= $this->load_individual($srcs, $type);
}
}
} else {
$type = $this->get_type($asset);
if (in_array($type, $this->types)) {
$out .= $this->load_individual($asset, $type);
}
}
return $out;
}
/**
* Gets type based on extension
*
* @param string $src
* @return string $type
*/
public function get_type($src) {
return pathinfo($src, PATHINFO_EXTENSION);
}
/**
* Outputs src in proper html tag
*
* @param string $src
* @param string $type
*/
private function load_individual($src, $type) {
if (!is_http($src)) {
$src = base_url(ASSETS_DIR . $src);
}
switch ($type) {
case 'js':
return script_tag($src);
break;
case 'css':
return link_tag($src);
break;
}
}
}
Asset_helper:
if (!function_exists('script_tag')) {
/**
* Script
*
* Generates link to a JS file
*
* @param mixed $src Script source or an array
* @param bool $index_page Should index_page be added to the js path
* @return string
*/
function script_tag($src = '', $index_page = false) {
$CI = & get_instance();
$script = '<script ';
if (is_array($src)) {
foreach ($src as $k => $v) {
if ($k === 'src' && !preg_match('#^([a-z]+:)?//#i', $v)) {
if ($index_page === true) {
$script .= 'src="' . $CI->config->site_url($v) . '"';
} else {
$script .= 'src="' . $CI->config->slash_item('base_url') . $v . '"';
}
} else {
$script .= $k . '="' . $v . '" ';
}
}
} else {
if (preg_match('#^([a-z]+:)?//#i', $src)) {
$script .= 'src="' . $src . '"';
} elseif ($index_page === true) {
$script .= 'src="' . $CI->config->site_url($src) . '"';
} else {
$script .= 'src="' . $CI->config->slash_item('base_url') . $src . '"';
}
}
return $script . ' type="text/javascript"' . "></script>";
//return $script . '></script>'; // w3c no need for type
}
}
/**
* Checks if a string contains a url
*
* @param string $str
* @return boolean
*/
function is_http($str) {
return preg_match("/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/", $str);
}
我正在使用 CodeIgniter 3.1.7 并自动加载并启用 url 助手。
如何编写 assets_helper.php
使用 base_url();
解析 https://something.tld/
并将第一组作为子文件夹,如果没有组,那么它将使用基础资产文件夹?
来自
<?php echo assets_url('css', 'style.css'); ?>
<?php echo assets_url('js', 'script.js'); ?>
<?php echo assets_url('php', 'test.php'); ?>
<?php echo assets_url('icon.ico'); ?>
到
https://something.tld/assets/css/style.css
https://something.tld/assets/js/script.js
https://something.tld/assets/php/test.php
https://something.tld/assets/icon.ico
我知道只写 <?php echo base_url('assets/css/style.css'); ?>
更容易实现这一点,但很难维护,假设我打算下次将资产文件夹更改为 /subfolder/1/2/3/assets/
。我可以只更改帮助文件中的 1 个变量而不会弄乱原始源代码。
如果您创建 asset_helper.php
,那么您需要自动加载它。在 codeigniter 中,您可以向现有的助手添加新功能。由于 url_helper
已经自动加载并可以使用,我将向 url_helper 添加新功能。
在 application/helpers
目录中创建一个新文件 MY_url_helper.php
。
复制并粘贴以下代码。
<?php
function assets_url($dir,$file=null){
$assets_dir = base_url()."path/to/your/assets_folder/";
$asset_path = $assets_dir.$dir;
if(!empty($file)){
$asset_path .="/$file";
}
return $asset_path;
}
将 path/to/your/assets_folder/
替换为您的资产文件夹(末尾的“/”很重要)。
你可能会发现我写的这个模型很有用,它需要修改。
$this->asset->load('item')
如果 item
在 $this->assets
数组中,它将从那里加载。
否则你必须传递一个url,或者名称:$this->asset->load('item.js');
你也可以传递一个数组$this->asset->load(array('item1.js', 'item2.css'));
它将使用 CI 中的 link_tag
函数,以及自定义 script_tag
函数和 return 包含适当 js/css [=19] 的字符串=] 和 <link>
标签。
需要对常量ASSET_DIR
、ROOT
进行一些修改和定义。但是功能是有的。
class Asset_loader_model extends CI_Model {
private $types = array('css', 'js');
private $assets = array();
public function __construct() {
parent::__construct();
$this->assets = $this->n_config->get('plugin_assets');
}
/**
* Loads an asset or assets by key
*
* @param string $asset
* @param boolean $return Default to false
*/
public function load($asset, $return = false) {
$out = '';
if (is_array($asset)) {
foreach ($asset as $src) {
$out .= $this->load($src, true);
}
} else {
if (isset($this->assets[$asset])) {
// asset is in the plugins array
$out .= $this->__load($this->assets[$asset]);
} elseif (is_file(ROOT . ASSETS_DIR . $asset)) {
// asset must be a /js/include.js
$out .= $this->__load($asset);
} else {
trigger_error("Could not find asset {$asset}.", E_USER_WARNING);
}
}
if ($return) {
return $out;
} else {
echo $out;
}
}
/**
* Loads a single asset array by key
*
* @param key $asset
* @return string
*/
private function __load($asset) {
$out = '';
if (is_array($asset)) {
foreach ($asset as $type => $srcs) {
if (!in_array($type, $this->types)) {
continue;
}
if (is_array($srcs)) {
foreach ($srcs as $src) {
$out .= $this->load_individual($src, $type);
}
} else {
$out .= $this->load_individual($srcs, $type);
}
}
} else {
$type = $this->get_type($asset);
if (in_array($type, $this->types)) {
$out .= $this->load_individual($asset, $type);
}
}
return $out;
}
/**
* Gets type based on extension
*
* @param string $src
* @return string $type
*/
public function get_type($src) {
return pathinfo($src, PATHINFO_EXTENSION);
}
/**
* Outputs src in proper html tag
*
* @param string $src
* @param string $type
*/
private function load_individual($src, $type) {
if (!is_http($src)) {
$src = base_url(ASSETS_DIR . $src);
}
switch ($type) {
case 'js':
return script_tag($src);
break;
case 'css':
return link_tag($src);
break;
}
}
}
Asset_helper:
if (!function_exists('script_tag')) {
/**
* Script
*
* Generates link to a JS file
*
* @param mixed $src Script source or an array
* @param bool $index_page Should index_page be added to the js path
* @return string
*/
function script_tag($src = '', $index_page = false) {
$CI = & get_instance();
$script = '<script ';
if (is_array($src)) {
foreach ($src as $k => $v) {
if ($k === 'src' && !preg_match('#^([a-z]+:)?//#i', $v)) {
if ($index_page === true) {
$script .= 'src="' . $CI->config->site_url($v) . '"';
} else {
$script .= 'src="' . $CI->config->slash_item('base_url') . $v . '"';
}
} else {
$script .= $k . '="' . $v . '" ';
}
}
} else {
if (preg_match('#^([a-z]+:)?//#i', $src)) {
$script .= 'src="' . $src . '"';
} elseif ($index_page === true) {
$script .= 'src="' . $CI->config->site_url($src) . '"';
} else {
$script .= 'src="' . $CI->config->slash_item('base_url') . $src . '"';
}
}
return $script . ' type="text/javascript"' . "></script>";
//return $script . '></script>'; // w3c no need for type
}
}
/**
* Checks if a string contains a url
*
* @param string $str
* @return boolean
*/
function is_http($str) {
return preg_match("/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/", $str);
}