【问题标题】:CodeIgniter Assets Directory String HelperCodeIgniter 资产目录字符串助手
【发布时间】:2018-03-02 04:19:19
【问题描述】:

我正在使用 CodeIgniter 3.1.7,并自动加载并启用了 url helper。

如何编写利用base_url(); 解析https://something.tld/assets_helper.php 并将第一个组作为子文件夹,如果没有组则它将使用基础资产文件夹?

来自

<?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

我知道只写&lt;?php echo base_url('assets/css/style.css'); ?&gt; 来实现这一点更容易,但是如果我打算下次将资产文件夹更改为/subfolder/1/2/3/assets/,这很难维护。我可以只更改帮助文件中的 1 个变量而不会弄乱原始源代码。

【问题讨论】:

    标签: php arrays string codeigniter helper


    【解决方案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/ 替换为您的资产文件夹(末尾的“/”很重要)。

    【讨论】:

      【解决方案2】:

      你可能会发现我写的这个模型很有用,需要修改。

      $this-&gt;asset-&gt;load('item')

      如果item$this-&gt;assets 数组中,它将从那里加载。 否则你必须传递一个 url 或名称:$this-&gt;asset-&gt;load('item.js');

      你也可以传递一个数组$this-&gt;asset-&gt;load(array('item1.js', 'item2.css'));

      它将使用 CI 中的 link_tag 函数和自定义 script_tag 函数并返回一个包含适当 js/css &lt;script&gt;&lt;link&gt; 标记的字符串。

      将需要对常量ASSET_DIRROOT 进行一些修改和定义。但是功能就在那里。

      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;
              }
          }
      
      }
      

      资产助手:

      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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-20
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 2017-09-15
        相关资源
        最近更新 更多