/fuel/application/libraries/Matchbox.php
PHP | 329 lines | 136 code | 48 blank | 145 comment | 18 complexity | bb2ec7cec9d9d7f6a70190da3e0eac61 MD5 | raw file
- <?php
- /**
- * Matchbox class
- *
- * This file is part of Matchbox
- *
- * Matchbox is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Matchbox is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * @package Matchbox
- * @copyright 2007-2008 Zacharias Knudsen
- * @license http://www.gnu.org/licenses/gpl.html
- * @version $Id: Matchbox.php 205 2008-02-24 01:43:55Z zacharias@dynaknudsen.dk $
- */
- if (!defined('BASEPATH')) {
- exit('No direct script access allowed');
- }
- /**
- * Matchbox Version
- */
- define('MATCHBOX_VERSION', '0.9.3');
- /**
- * Provides modular functionality
- *
- * @package Matchbox
- * @copyright 2007-2008 Zacharias Knudsen
- * @license http://www.gnu.org/licenses/gpl.html
- */
- /**
- * FUEL Specific changes
- *
- * All code not encapsulated in <-- FUEL and FUEL--> was made by David McReynolds of Daylight
- *
- * @copyright 2008-2010 David McReynolds
- * @license http://www.gnu.org/licenses/gpl.html
- */
- class CI_Matchbox
- {
- /**
- * The files that should be excluded from the caller search
- *
- * @var array
- * @access private
- */
- var $_callers = array('Loader', 'Matchbox', 'MY_Config', 'MY_Language', 'Parser');
- /**
- * The directories that contain modules
- *
- * @var array
- * @access public
- */
- var $_directories = array('modules');
- /**
- * The directory in which the current module is located
- *
- * @var string
- * @access private
- */
- var $_directory = '';
- /**
- * The module in which the current controller is located
- *
- * @var string
- * @access private
- */
- var $_module = '';
- //<-- FUEL
- /**
- * A key value that you can specify as the module name to have it look in the application folder first
- *
- * @var string
- * @access private
- */
- var $app_folder_key = 'app';
- //FUEL -->
- /**
- * Fetches configuration file
- *
- * @return void
- * @access public
- */
- function CI_Matchbox()
- {
- @include(APPPATH . 'config/matchbox' . EXT);
- if (isset($config)) {
- $this->_callers = array_merge($this->_callers, (!is_array($config['callers']) ? array() : $config['callers']));
- $this->_directories = (!is_array($config['directories'])) ? $this->_directories : $config['directories'];
- } else {
- log_message('error', 'Matchbox Config File Not Found');
- }
- log_message('debug', 'Matchbox Class Initialized');
- }
- /**
- * Locates resources
- *
- * @param string
- * @param string
- * @param string
- * @param string
- * $param integer
- * @return mixed
- * @access public
- */
- function find($resource, $module = '', $search = 1)
- {
- log_message('debug', '---Matchbox---');
- log_message('debug', 'Finding: ' . $resource);
- $directories = array();
- //<-- FUEL ... added $this->app_folder_key check here -->
- if ($module !== '' && $module != $this->app_folder_key) {
- foreach ($this->directory_array() as $directory) {
- $directories[] = APPPATH . $directory . '/' . $module . '/';
- }
- } else {
- $caller = $this->detect_caller();
-
-
- //<-- FUEL
- // special module name to force the pull first form the application directory
- if ($module == $this->app_folder_key)
- {
- $directories[] = APPPATH;
- $filepath = $resource;
- }
- //FUEL -->
-
- foreach ($this->directory_array() as $directory) {
- $directories[] = APPPATH . $directory . '/' . $caller . '/';
- }
- if ($search == 3) {
- $directories[] = '';
- } else {
- $directories[] = APPPATH;
- if ($search == 2) {
- $directories[] = BASEPATH;
- }
- }
-
- }
- foreach ($directories as $directory) {
- $filepath = $directory . $resource;
- log_message('debug', 'Looking in: ' . $filepath);
- if (file_exists($filepath)) {
- log_message('debug', 'Found');
- log_message('debug', '--------------');
- return $filepath;
- }
- }
- log_message('debug', 'Not found');
- log_message('debug', '--------------');
- return false;
- }
- /**
- * Detects calling module
- *
- * @return string
- * @access public
- */
- function detect_caller()
- {
- $callers = array();
- $directories = array();
- $traces = debug_backtrace();
- foreach ($this->caller_array() as $caller) {
- $callers[] = $this->_swap_separators($caller, true);
- }
- $search = '/(?:' . implode('|', $callers) . ')' . EXT . '$/i';
- foreach ($traces as $trace) {
- $filepath = $this->_swap_separators($trace['file']);
- if (!preg_match($search, $filepath)) {
- break;
- }
- }
- foreach ($this->directory_array() as $directory) {
- $directories[] = $this->_swap_separators(realpath(APPPATH . $directory), true);
- }
- $search = '/^(?:' . implode('|', $directories) . ')\/(.+?)\//i';
- if (preg_match($search, $filepath, $matches)) {
- log_message('debug', 'Calling module: ' . $matches[1]);
- return $matches[1];
- }
- log_message('debug', 'No valid caller');
- return '';
- }
- /**
- * Returns the nth argument
- *
- * @access public
- */
- function argument($argument)
- {
- $traces = debug_backtrace();
- if (isset($traces[1]['args'][$argument])) {
- return $traces[1]['args'][$argument];
- }
- return '';
- }
- /**
- * Returns an array of callers
- *
- * @access public
- */
- function caller_array()
- {
- return $this->_callers;
- }
- /**
- * Returns an array of module directories
- *
- * @access public
- */
- function directory_array()
- {
- return $this->_directories;
- }
- /**
- * Sets the directory
- *
- * @return string
- * @access public
- */
- function set_directory($directory)
- {
- $this->_directory = $directory . '/';
- }
- /**
- * Fetches the current directory (if any)
- *
- * @return string
- * @access public
- */
- function fetch_directory()
- {
- return $this->_directory;
- }
- /**
- * Sets the module
- *
- * @return string
- * @access public
- */
- function set_module($module)
- {
- $this->_module = $module . '/';
- }
- /**
- * Fetches the current module (if any)
- *
- * @return string
- * @access public
- */
- function fetch_module()
- {
- return $this->_module;
- }
- /**
- * Swaps directory separators to Unix style for consistency
- *
- * @return string
- * @access private
- */
- function _swap_separators($path, $search = false)
- {
- $path = strtr($path, '\\', '/');
- if ($search) {
- $path = str_replace(array('/', '|'), array('\/', '\|'), $path);
- }
- return $path;
- }
- }
- ?>