mirror of
https://github.com/e107inc/e107.git
synced 2025-08-05 06:07:32 +02:00
Support for namespaced classes; added e_shims
e_shims is an e107 v2-compatible class for the first namespaced core class, e107\Shims\All. e107\Shims\All is built from the e107\Shims\InternalShims trait. e107\Shims\InternalShims currently implements a resilient replacement for the PHP internal readfile(), which is needed by issue #3528. As for how the new namespaced classes are handled, the e107 class (e107_handlers/e107_class.php) has an updated e107::autoload() which detects namespaced classes and goes to e107::autoload_namespaced(). Namespaced classes handled by e107 are in the \e107 top-level namespace, and all sub-levels match directory paths under e_HANDLER.
This commit is contained in:
63
e107_handlers/Shims/InternalShims.php
Normal file
63
e107_handlers/Shims/InternalShims.php
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* e107 website system
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2018 e107 Inc (e107.org)
|
||||||
|
* Released under the terms and conditions of the
|
||||||
|
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
|
||||||
|
*
|
||||||
|
* Shims for PHP internal functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace e107\Shims;
|
||||||
|
|
||||||
|
trait InternalShims
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Outputs a file
|
||||||
|
*
|
||||||
|
* Resilient replacement for PHP internal readfile()
|
||||||
|
*
|
||||||
|
* @see https://github.com/e107inc/e107/issues/3528 Why this method was implemented
|
||||||
|
* @param string $filename The filename being read.
|
||||||
|
* @param bool $use_include_path You can use the optional second parameter and set it to TRUE,
|
||||||
|
* if you want to search for the file in the include_path, too.
|
||||||
|
* @param resource $context A context stream resource.
|
||||||
|
* @return int|bool Returns the number of bytes read from the file.
|
||||||
|
* If an error occurs, FALSE is returned.
|
||||||
|
*/
|
||||||
|
public static function readfile($filename, $use_include_path = FALSE, $context = NULL)
|
||||||
|
{
|
||||||
|
$output = @readfile($filename, $use_include_path, $context);
|
||||||
|
if ($output === NULL)
|
||||||
|
{
|
||||||
|
return self::readfile_alt($filename, $use_include_path, $context);
|
||||||
|
}
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Outputs a file
|
||||||
|
*
|
||||||
|
* Alternative implementation using file streams
|
||||||
|
*
|
||||||
|
* @param $filename
|
||||||
|
* @param bool $use_include_path
|
||||||
|
* @param resource $context
|
||||||
|
* @return bool|int
|
||||||
|
*/
|
||||||
|
public static function readfile_alt($filename, $use_include_path = FALSE, $context = NULL)
|
||||||
|
{
|
||||||
|
// fopen() silently returns false if there is no context
|
||||||
|
if (!is_resource($context)) $context = stream_context_create();
|
||||||
|
|
||||||
|
$handle = @fopen($filename, 'rb', $use_include_path, $context);
|
||||||
|
if ($handle === FALSE) return FALSE;
|
||||||
|
while (!feof($handle))
|
||||||
|
{
|
||||||
|
echo(fread($handle, 8192));
|
||||||
|
}
|
||||||
|
fclose($handle);
|
||||||
|
return filesize($filename);
|
||||||
|
}
|
||||||
|
}
|
31
e107_handlers/Shims/e_shims.php
Normal file
31
e107_handlers/Shims/e_shims.php
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* e107 website system
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2018 e107 Inc (e107.org)
|
||||||
|
* Released under the terms and conditions of the
|
||||||
|
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
|
||||||
|
*
|
||||||
|
* Shims for PHP internal functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace e107\Shims
|
||||||
|
{
|
||||||
|
class All
|
||||||
|
{
|
||||||
|
use InternalShims;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Internal
|
||||||
|
{
|
||||||
|
use InternalShims;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// e107 v2-style classes
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
class e_shims extends \e107\Shims\All
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@@ -203,6 +203,7 @@ class e107
|
|||||||
'e_parse_shortcode' => '{e_HANDLER}shortcode_handler.php',
|
'e_parse_shortcode' => '{e_HANDLER}shortcode_handler.php',
|
||||||
'e_plugin' => '{e_HANDLER}plugin_class.php',
|
'e_plugin' => '{e_HANDLER}plugin_class.php',
|
||||||
'e_ranks' => '{e_HANDLER}e_ranks_class.php',
|
'e_ranks' => '{e_HANDLER}e_ranks_class.php',
|
||||||
|
'e_shims' => '{e_HANDLER}Shims/e_shims.php',
|
||||||
'e_shortcode' => '{e_HANDLER}shortcode_handler.php',
|
'e_shortcode' => '{e_HANDLER}shortcode_handler.php',
|
||||||
'e_system_user' => '{e_HANDLER}user_model.php',
|
'e_system_user' => '{e_HANDLER}user_model.php',
|
||||||
'e_theme' => '{e_HANDLER}theme_handler.php',
|
'e_theme' => '{e_HANDLER}theme_handler.php',
|
||||||
@@ -4886,6 +4887,14 @@ class e107
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Detect namespaced class
|
||||||
|
if (strpos($className, '\\') !== false)
|
||||||
|
{
|
||||||
|
self::autoload_namespaced($className);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$tmp = explode('_', $className);
|
$tmp = explode('_', $className);
|
||||||
|
|
||||||
//echo 'autoloding...'.$className.'<br />';
|
//echo 'autoloding...'.$className.'<br />';
|
||||||
@@ -4947,6 +4956,27 @@ class e107
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Autoloading logic for namespaced classes
|
||||||
|
*
|
||||||
|
* @param $className
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private static function autoload_namespaced($className)
|
||||||
|
{
|
||||||
|
$levels = explode('\\', $className);
|
||||||
|
|
||||||
|
// Guard against classes that are not ours
|
||||||
|
if ($levels[0] != 'e107') return;
|
||||||
|
|
||||||
|
$levels[0] = e_HANDLER;
|
||||||
|
$classPath = implode('/', $levels).'.php';
|
||||||
|
if (is_file($classPath) && is_readable($classPath))
|
||||||
|
{
|
||||||
|
include($classPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
switch ($name)
|
switch ($name)
|
||||||
|
Reference in New Issue
Block a user