mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
ENHANCEMENT #3638: There is no longer any need to have the class name match the PHP filename
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@83798 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
a72f7b2173
commit
8f0d3c72c1
@ -235,7 +235,6 @@ function getTempFolder() {
|
|||||||
*/
|
*/
|
||||||
function __autoload($className) {
|
function __autoload($className) {
|
||||||
global $_CLASS_MANIFEST;
|
global $_CLASS_MANIFEST;
|
||||||
if(($pos = strpos($className,'_')) !== false) $className = substr($className,0,$pos);
|
|
||||||
if(isset($_CLASS_MANIFEST[$className])) include_once($_CLASS_MANIFEST[$className]);
|
if(isset($_CLASS_MANIFEST[$className])) include_once($_CLASS_MANIFEST[$className]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -335,7 +334,6 @@ function increase_time_limit_to($timeLimit = null) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
@ -73,10 +73,25 @@ class ManifestBuilder {
|
|||||||
* Only loads the ClassInfo and __autoload() globals; this assumes that _config.php files are already included.
|
* Only loads the ClassInfo and __autoload() globals; this assumes that _config.php files are already included.
|
||||||
*/
|
*/
|
||||||
static function load_test_manifest() {
|
static function load_test_manifest() {
|
||||||
// Build the complete manifest
|
$testManifestFile = MANIFEST_FILE . '-test';
|
||||||
$manifestInfo = self::get_manifest_info(BASE_PATH);
|
|
||||||
// Load it into the current session.
|
// The dev/build reference is some coupling but it solves an annoying bug
|
||||||
self::process_manifest($manifestInfo);
|
if(!file_exists($testManifestFile)
|
||||||
|
|| (filemtime($testManifestFile) < filemtime($testManifestFile))
|
||||||
|
|| isset($_GET['flush'])) {
|
||||||
|
|
||||||
|
// Build the manifest, including the tests/ folders
|
||||||
|
$manifestInfo = self::get_manifest_info(BASE_PATH);
|
||||||
|
$manifest = self::generate_php_file($manifestInfo);
|
||||||
|
if($fh = fopen($testManifestFile, "w")) {
|
||||||
|
fwrite($fh, $manifest);
|
||||||
|
fclose($fh);
|
||||||
|
} else {
|
||||||
|
user_error("Cannot write manifest file! Check permissions of " . MANIFEST_FILE, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require($testManifestFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -157,7 +172,7 @@ class ManifestBuilder {
|
|||||||
$project = null;
|
$project = null;
|
||||||
|
|
||||||
// Class, CSS, template manifest
|
// Class, CSS, template manifest
|
||||||
$classManifest = array();
|
$allPhpFiles = array();
|
||||||
$templateManifest = array();
|
$templateManifest = array();
|
||||||
$cssManifest = array();
|
$cssManifest = array();
|
||||||
|
|
||||||
@ -166,7 +181,7 @@ class ManifestBuilder {
|
|||||||
// $restrict_to_modules is set, so we include only those specified
|
// $restrict_to_modules is set, so we include only those specified
|
||||||
// modules
|
// modules
|
||||||
foreach(self::$restrict_to_modules as $module)
|
foreach(self::$restrict_to_modules as $module)
|
||||||
ManifestBuilder::getClassManifest($baseDir . '/' . $module, $excludedFolders, $classManifest);
|
ManifestBuilder::get_all_php_files($baseDir . '/' . $module, $excludedFolders, $allPhpFiles);
|
||||||
} else {
|
} else {
|
||||||
// Include all directories which have an _config.php file but don't
|
// Include all directories which have an _config.php file but don't
|
||||||
// have an _manifest_exclude file
|
// have an _manifest_exclude file
|
||||||
@ -182,7 +197,7 @@ class ManifestBuilder {
|
|||||||
!file_exists("$baseDir/$filename/_manifest_exclude")) {
|
!file_exists("$baseDir/$filename/_manifest_exclude")) {
|
||||||
|
|
||||||
// Get classes, templates, and CSS files
|
// Get classes, templates, and CSS files
|
||||||
ManifestBuilder::getClassManifest("$baseDir/$filename", $excludedFolders, $classManifest);
|
ManifestBuilder::get_all_php_files("$baseDir/$filename", $excludedFolders, $allPhpFiles);
|
||||||
ManifestBuilder::getTemplateManifest($baseDir, $filename, $excludedFolders, $templateManifest, $cssManifest);
|
ManifestBuilder::getTemplateManifest($baseDir, $filename, $excludedFolders, $templateManifest, $cssManifest);
|
||||||
|
|
||||||
// List the _config.php files
|
// List the _config.php files
|
||||||
@ -208,7 +223,11 @@ class ManifestBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Build class-info array from class manifest
|
// Build class-info array from class manifest
|
||||||
$allClasses = ManifestBuilder::allClasses($classManifest);
|
$allClasses = ManifestBuilder::allClasses($allPhpFiles);
|
||||||
|
|
||||||
|
// Pull the class filenames out
|
||||||
|
$classManifest = $allClasses['file'];
|
||||||
|
unset($allClasses['file']);
|
||||||
|
|
||||||
// Ensure that any custom templates get favoured
|
// Ensure that any custom templates get favoured
|
||||||
if(!$project) user_error("\$project isn't set", E_USER_WARNING);
|
if(!$project) user_error("\$project isn't set", E_USER_WARNING);
|
||||||
@ -225,13 +244,12 @@ class ManifestBuilder {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates the class manifest - a list of all the PHP files in the
|
* Generates a list of all the PHP files that should be analysed by the manifest builder.
|
||||||
* application
|
|
||||||
*
|
*
|
||||||
* @param string $folder The folder to traverse (recursively)
|
* @param string $folder The folder to traverse (recursively)
|
||||||
* @param array $classMap The already built class map
|
* @param array $classMap The already built class map
|
||||||
*/
|
*/
|
||||||
private static function getClassManifest($folder, $excludedFolders, &$classMap) {
|
private static function get_all_php_files($folder, $excludedFolders, &$allPhpFiles) {
|
||||||
$items = scandir($folder);
|
$items = scandir($folder);
|
||||||
if($items) foreach($items as $item) {
|
if($items) foreach($items as $item) {
|
||||||
// Skip some specific PHP files
|
// Skip some specific PHP files
|
||||||
@ -260,26 +278,9 @@ class ManifestBuilder {
|
|||||||
if(in_array($item, $excludedFolders)) continue;
|
if(in_array($item, $excludedFolders)) continue;
|
||||||
|
|
||||||
// recurse into directories (if not in $ignore_folders)
|
// recurse into directories (if not in $ignore_folders)
|
||||||
ManifestBuilder::getClassManifest("$folder/$item", $excludedFolders, $classMap);
|
ManifestBuilder::get_all_php_files("$folder/$item", $excludedFolders, $allPhpFiles);
|
||||||
} else {
|
} else {
|
||||||
// include item in the manifest
|
$allPhpFiles[] = "$folder/$item";
|
||||||
$itemCode = substr($item,0,-4);
|
|
||||||
// if $itemCode is already in manifest, check if the two files do really contain the same class
|
|
||||||
if($classMap && array_key_exists($itemCode, $classMap)) {
|
|
||||||
$regex = '/class\s' . $itemCode .'/';
|
|
||||||
if(
|
|
||||||
preg_match($regex, file_get_contents("$folder/$item"))
|
|
||||||
&& preg_match($regex, file_get_contents($classMap[$itemCode]))
|
|
||||||
) {
|
|
||||||
user_error("Warning: there are two '$itemCode' files both containing the same class: '$folder/$item' and '{$classMap[$itemCode]}'.
|
|
||||||
This might mean that the wrong code is being used.", E_USER_WARNING);
|
|
||||||
} else {
|
|
||||||
user_error("Warning: there are two '$itemCode' files with the same filename: '$folder/$item' and '{$classMap[$itemCode]}'.
|
|
||||||
This might mean that the wrong code is being used.", E_USER_NOTICE);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$classMap[$itemCode] = "$folder/$item";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -353,6 +354,7 @@ class ManifestBuilder {
|
|||||||
|
|
||||||
foreach(self::$classArray as $class => $info) {
|
foreach(self::$classArray as $class => $info) {
|
||||||
$allClasses['exists'][$class] = $class;
|
$allClasses['exists'][$class] = $class;
|
||||||
|
$allClasses['file'][$class] = $info['file'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build a map of classes and their subclasses
|
// Build a map of classes and their subclasses
|
||||||
@ -414,6 +416,13 @@ class ManifestBuilder {
|
|||||||
self::$implementsArray[$interface][$className] = $className;
|
self::$implementsArray[$interface][$className] = $className;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(isset(self::$classArray[$className])) {
|
||||||
|
$file1 = self::$classArray[$className]['file'];
|
||||||
|
$file2 = $class[$className];
|
||||||
|
user_error("There are two files both containing the same class: '$file1' and " .
|
||||||
|
"'$file2'. This might mean that the wrong code is being used.", E_USER_WARNING);
|
||||||
|
}
|
||||||
|
|
||||||
self::$classArray[$className] = $class;
|
self::$classArray[$className] = $class;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -422,6 +431,14 @@ class ManifestBuilder {
|
|||||||
unset($interface['interfaceName']);
|
unset($interface['interfaceName']);
|
||||||
$interface['file'] = $filename;
|
$interface['file'] = $filename;
|
||||||
if(!isset($interface['extends'])) $interface['extends'] = null;
|
if(!isset($interface['extends'])) $interface['extends'] = null;
|
||||||
|
|
||||||
|
if(isset(self::$classArray[$className])) {
|
||||||
|
$file1 = self::$classArray[$className]['file'];
|
||||||
|
$file2 = $interface[$className];
|
||||||
|
user_error("There are two files both containing the same class: '$file1' and " .
|
||||||
|
"'$file2'. This might mean that the wrong code is being used.", E_USER_WARNING);
|
||||||
|
}
|
||||||
|
|
||||||
self::$classArray[$className] = $interface;
|
self::$classArray[$className] = $interface;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user