Asset now part of \Crispage\Framework

Assets now loadable with Crispage->loadClass
new shortnames parameter for Crispage->loadClass
This commit is contained in:
crispycat 2024-05-20 00:16:44 -04:00
parent 3dabd9209e
commit 4a8bc32bab
36 changed files with 69 additions and 81 deletions

View File

@ -14,7 +14,7 @@
defined("ROOT") or die();
use \Crispage\Asset;
use \Crispage\Framework\Asset;
use \Crispage\Auth\CorePermissions;
class APIAssetAction extends \Crispage\Framework\Action
@ -67,7 +67,7 @@
$class = strval($this->app->request->json["_class"] ?? null);
if (
!class_exists($class) ||
!is_a($class, "\\Crispage\\Asset", true)
!is_a($class, "\\Crispage\\Framework\\Asset", true)
) {
http_response_code(400);
$out = ["error" => "Bad Request"];

View File

@ -14,7 +14,7 @@
defined("ROOT") or die();
use \Crispage\Asset;
use \Crispage\Framework\Asset;
use \Crispage\Auth\CorePermissions;
class APIAssetOptionsAction extends \Crispage\Framework\Action

View File

@ -15,7 +15,7 @@
defined("ROOT") or die();
use \Crispage\Auth\CorePermissions;
use \Crispage\Asset;
use \Crispage\Framework\Asset;
class APIAssetsAction extends \Crispage\Framework\Action
implements \Crispage\Response\APIPermissions {

View File

@ -55,7 +55,7 @@
}
// Get required permissions
$this->app->loadClass($route->action, "\Crispage\Framework\Action");
$this->app->loadClass($route->action, "\\Crispage\\Framework\\Action");
if (!is_a($route->action, "\\Crispage\\Response\\APIPermissions", true)) {
http_response_code(500);
header("Content-Type: application/json");

View File

@ -16,7 +16,7 @@
use \Crispage\CrispageException;
use \Crispage\Utils\URIUtils;
use \Crispage\Asset;
use \Crispage\Framework\Asset;
class AssetDeleteAction extends \Crispage\Framework\Action {
public static function getExtensionInfo(): array {
@ -33,11 +33,11 @@
public function run(): void {
// Get class name
$this->data["classname"] = strval(
$this->app->request->params["classname"] ?? "\\Crispage\\Asset"
$this->app->request->params["classname"] ?? "\\Crispage\\Framework\\Asset"
);
if (
!class_exists($this->data["classname"]) ||
!is_a($this->data["classname"], "\\Crispage\\Asset", true)
!is_a($this->data["classname"], "\\Crispage\\Framework\\Asset", true)
) {
$this->app->handleException(
new CrispageException(

View File

@ -16,7 +16,7 @@
use \Crispage\CrispageException;
use \Crispage\Utils\URIUtils;
use \Crispage\Asset;
use \Crispage\Framework\Asset;
class AssetEditorAction extends \Crispage\Framework\Action {
public static function getExtensionInfo(): array {
@ -33,12 +33,12 @@
public function run(): void {
// Get class name
$this->data["classname"] = strval(
$this->app->request->params["classname"] ?? "\\Crispage\\Asset"
$this->app->request->params["classname"] ?? "\\Crispage\\Framework\\Asset"
);
if (
!class_exists($this->data["classname"]) ||
!is_a($this->data["classname"], "\\Crispage\\Asset", true)
!is_a($this->data["classname"], "\\Crispage\\Framework\\Asset", true)
) {
$this->app->handleException(
new CrispageException(

View File

@ -32,11 +32,11 @@
public function run(): void {
// Get class name
$this->data["classname"] = strval(
$this->app->request->params["classname"] ?? "\\Crispage\\Asset"
$this->app->request->params["classname"] ?? "\\Crispage\\Framework\\Asset"
);
if (
!class_exists($this->data["classname"]) ||
!is_a($this->data["classname"], "\\Crispage\\Asset", true)
!is_a($this->data["classname"], "\\Crispage\\Framework\\Asset", true)
) {
$this->app->handleException(
new CrispageException(

View File

@ -16,7 +16,7 @@
use \Crispage\CrispageException;
use \Crispage\Utils\URIUtils;
use \Crispage\Asset;
use \Crispage\Framework\Asset;
use \Crispage\Assets\Module;
class ModuleCreateAction extends \Crispage\Framework\Action {
@ -54,7 +54,7 @@
// If classname given, create the module
$component = strval($this->app->request->params["component"] ?? "");
if (!empty($component)) {
$this->app->loadClass($component, "\Crispage\Framework\Component");
$this->app->loadClass($component, "\\Crispage\\Framework\\Component");
if (!is_a($component, "\Crispage\Framework\ModuleComponent", true)) {
$this->app->page->setPersistentMessage(
"invalid_module_component",

View File

@ -16,7 +16,7 @@
use \Crispage\CrispageException;
use \Crispage\Utils\URIUtils;
use \Crispage\Asset;
use \Crispage\Framework\Asset;
use \Crispage\Assets\User;
class UserCreateAction extends \Crispage\Framework\Action {

View File

@ -66,7 +66,7 @@
require_once ROOT . "/core/app/text/ShortcodeEngine.php";
use \Crispage\Assets\Plugin;
use \Crispage\Framwork\PluginClass;
use \Crispage\Framework\PluginClass;
require_once ROOT . "/core/app/framework/PluginClass.php";
require_once ROOT . "/core/app/utils/FileUtils.php";
@ -239,22 +239,29 @@
$this->dispatcher->trigger("crispage.initialized");
}
public function loadClass(string $classname, string $type = "\Crispage\Framework\Component"): void {
public function loadClass(string $classname, string $type, bool $shortnames = false): void {
// Return if already loaded
if (in_array($classname, $this->loadedClasses)) return;
// Assemble paths
$pathend = preg_replace("/\\\\/", "/", $classname) . ".php";
$paths = Config::CLASS_PATHS[$type] ?? null;
if (!$paths) {
$classpaths = Config::CLASS_PATHS[$type] ?? null;
if (!$classpaths) {
$this->handleException(new CrispageException(
"Unknown class type $type", 500
));
}
$fullpaths = array_map(fn(string $p): string => ROOT . $p . $pathend, $paths);
$name = preg_replace("/\\\\/", "/", $classname) . ".php";
$paths = [];
foreach ($classpaths as $cpath) $paths[] = ROOT . $cpath . $name;
if ($shortnames) {
foreach ($classpaths as $cpath)
$paths[] = ROOT . $cpath . "/" . basename($name);
}
// Try each path and return if class loaded
foreach ($fullpaths as $path) {
foreach ($paths as $path) {
if (!file_exists($path)) continue;
include_once $path;
if (class_exists($classname)) {
@ -427,6 +434,7 @@
}
public function handleException(\Throwable $exception): void {
//throw $exception;
if ($this->handlingException) return;
$this->handlingException = true;

View File

@ -14,10 +14,11 @@
defined("ROOT") or die();
require_once ROOT . "/core/app/assets/Asset.php";
use \Crispage\Framework\Asset;
require_once ROOT . "/core/app/framework/Asset.php";
// Include default assets
require_once ROOT . "/core/app/assets/class/Article.php";
/*require_once ROOT . "/core/app/assets/class/Article.php";
require_once ROOT . "/core/app/assets/class/Category.php";
require_once ROOT . "/core/app/assets/class/Comment.php";
require_once ROOT . "/core/app/assets/class/Redirect.php";
@ -26,7 +27,7 @@
require_once ROOT . "/core/app/assets/class/Module.php";
require_once ROOT . "/core/app/assets/class/Plugin.php";
require_once ROOT . "/core/app/assets/class/Role.php";
require_once ROOT . "/core/app/assets/class/User.php";
require_once ROOT . "/core/app/assets/class/User.php";*/
use \Crispage\Framework\ApplicationFeature;
use \Crispage\Signaling\Receiver;
@ -34,23 +35,28 @@
use \Crispage\Text\ShortcodeRenderer;
class AssetManager extends ApplicationFeature {
private array $registeredClasses = [];
private int $nextTempId = -2147483648;
public const CORE_CLASSES = [
"\\Crispage\\Assets\\ContentAsset",
"\\Crispage\\Assets\\Article",
"\\Crispage\\Assets\\Category",
"\\Crispage\\Assets\\Comment",
"\\Crispage\\Assets\\Redirect",
"\\Crispage\\Assets\\Menu",
"\\Crispage\\Assets\\MenuItem",
"\\Crispage\\Assets\\Module",
"\\Crispage\\Assets\\Plugin",
"\\Crispage\\Assets\\Role",
"\\Crispage\\Assets\\User"
];
private int $nextTempId = PHP_INT_MIN;
public function __construct(\Crispage $app) {
parent::__construct($app);
// Register default assets
$this->registerClass("\\Crispage\\Assets\\Article");
$this->registerClass("\\Crispage\\Assets\\Category");
$this->registerClass("\\Crispage\\Assets\\Comment");
$this->registerClass("\\Crispage\\Assets\\Redirect");
$this->registerClass("\\Crispage\\Assets\\Menu");
$this->registerClass("\\Crispage\\Assets\\MenuItem");
$this->registerClass("\\Crispage\\Assets\\Module");
$this->registerClass("\\Crispage\\Assets\\Plugin");
$this->registerClass("\\Crispage\\Assets\\Role");
$this->registerClass("\\Crispage\\Assets\\User");
// Load default asset classes
foreach (self::CORE_CLASSES as $class)
$this->app->loadClass($class, "\\Crispage\\Framework\\Asset", true);
// Automatically update routes
$this->app->dispatcher->register(
@ -93,22 +99,6 @@
));
}
public function getRegisteredClasses(): array {
return $this->registeredClasses;
}
public function registerClass(string $classname): void {
if (!in_array($classname, $this->registeredClasses))
$this->registeredClasses[] = $classname;
}
public function unregisterClass(string $classname): void {
$this->registeredClasses = array_filter(
$this->registeredClasses,
fn(string $cn): bool => $cn != $classname
);
}
public function getTable(string $classname): string {
return "assets_" . substr(md5($classname), 0, 8) . @end(explode("\\", $classname));
}
@ -129,7 +119,7 @@
public function createTable(string $classname): bool {
// Error if class is not an asset
if (!is_a($classname, "\\Crispage\\Asset", true)) return false;
if (!is_a($classname, "\\Crispage\\Framework\\Asset", true)) return false;
// Get table name
$table = $this->getTable($classname);
@ -265,7 +255,7 @@
// Error if class is not an asset
if (
!class_exists($classname) ||
!is_a($classname, "\\Crispage\\Asset", true)
!is_a($classname, "\\Crispage\\Framework\\Asset", true)
) {
$this->app->handleException(
new CrispageException("$classname is not an Asset", 500)

View File

@ -14,8 +14,6 @@
defined("ROOT") or die();
require_once ROOT . "/core/app/assets/class/ContentAsset.php";
class Article extends ContentAsset {
public static function getNames(): array {
return ["{%ARTICLE}", "{%ARTICLES}"];

View File

@ -14,8 +14,6 @@
defined("ROOT") or die();
require_once ROOT . "/core/app/assets/class/ContentAsset.php";
class Category extends ContentAsset {
public static function getNames(): array {
return ["{%CATEGORY}", "{%CATEGORIES}"];

View File

@ -16,7 +16,7 @@
use \Crispage\Auth\CorePermissions;
class Comment extends \Crispage\Asset {
class Comment extends \Crispage\Framework\Asset {
public const HIDDEN = -1;
public const PENDING_APPROVAL = 0;
public const APPROVED = 1;

View File

@ -14,13 +14,11 @@
defined("ROOT") or die();
require_once ROOT . "/core/app/assets/Asset.php";
use \Crispage\Auth\CorePermissions;
use \Crispage\Caching\CacheEngine;
use \Crispage\Caching\CacheEntry;
abstract class ContentAsset extends \Crispage\Asset {
abstract class ContentAsset extends \Crispage\Framework\Asset {
public const UNPUBLISHED = 0;
public const PUBLISHED = 1;

View File

@ -16,7 +16,7 @@
use \Crispage\Auth\CorePermissions;
class Menu extends \Crispage\Asset {
class Menu extends \Crispage\Framework\Asset {
public static function getNames(): array {
return ["{%MENU}", "{%MENUS}"];
}

View File

@ -16,7 +16,7 @@
use \Crispage\Auth\CorePermissions;
class MenuItem extends \Crispage\Asset {
class MenuItem extends \Crispage\Framework\Asset {
public static function getNames(): array {
return ["{%MENU_ITEM}", "{%MENU_ITEMS}"];
}

View File

@ -16,7 +16,7 @@
use \Crispage\Auth\CorePermissions;
class Module extends \Crispage\Asset {
class Module extends \Crispage\Framework\Asset {
public static function getNames(): array {
return ["{%MODULE}", "{%MODULES}"];
}

View File

@ -16,7 +16,7 @@
use \Crispage\Auth\CorePermissions;
class Plugin extends \Crispage\Asset {
class Plugin extends \Crispage\Framework\Asset {
public static function getNames(): array {
return ["{%PLUGIN}", "{%PLUGINS}"];
}

View File

@ -16,7 +16,7 @@
use \Crispage\Auth\CorePermissions;
class Redirect extends \Crispage\Asset {
class Redirect extends \Crispage\Framework\Asset {
public static function getNames(): array {
return ["{%REDIRECT}", "{%REDIRECTS}"];
}

View File

@ -14,11 +14,9 @@
defined("ROOT") or die();
require_once ROOT . "/core/app/assets/Asset.php";
use \Crispage\Auth\CorePermissions;
class Role extends \Crispage\Asset {
class Role extends \Crispage\Framework\Asset {
public static function getNames(): array {
return ["{%ROLE}", "{%ROLES}"];
}

View File

@ -14,11 +14,9 @@
defined("ROOT") or die();
require_once ROOT . "/core/app/assets/Asset.php";
use \Crispage\Auth\CorePermissions;
class User extends \Crispage\Asset {
class User extends \Crispage\Framework\Asset {
public const DISABLED = -1;
public const UNCONFIRMED= 0;
public const CONFIRMED = 1;

View File

@ -10,7 +10,7 @@
(at your option) any later version.
*/
namespace Crispage;
namespace Crispage\Framework;
defined("ROOT") or die();

View File

@ -15,7 +15,7 @@
defined("ROOT") or die();
use \Crispage\Config;
use \Crispage\Asset;
use \Crispage\Framework\Asset;
use \Crispage\Framework\ApplicationFeature;
require_once ROOT . "/core/app/request/CoreRoutes.php";

View File

@ -27,7 +27,7 @@
public function __construct(\Crispage $app, array $data) {
if ($data["asset"] ?? null) {
$app->loadClass($data["asset"]->component, "\Crispage\Framework\Component");
$app->loadClass($data["asset"]->component, "\\Crispage\\Framework\\Component");
$data["fields"] = $data["asset"]->component::getModuleFields();
} else $data["fields"] = [];

View File

@ -14,7 +14,7 @@
defined("ROOT") or die();
use \Crispage\Asset;
use \Crispage\Framework\Asset;
use \Crispage\Assets\ContentAsset;
class NewContentComponent extends \Crispage\Framework\Component

View File

@ -14,7 +14,7 @@
defined("ROOT") or die();
use \Crispage\Asset;
use \Crispage\Framework\Asset;
use \Crispage\Assets\ContentAsset;
class PopularContentComponent extends \Crispage\Framework\Component