From b0cdf9d36e4e57b0078984924d48215c2303de15 Mon Sep 17 00:00:00 2001 From: aB0t Date: Thu, 12 Sep 2024 03:45:11 +0200 Subject: [PATCH] Update 2024-09-11 03:45:23 --- README.md | 12 + .../README.md | 117 +++++++ .../code.php | 229 +++++++++++++ .../code.power | 203 ++++++++++++ .../settings.json | 24 ++ .../README.md | 84 +++++ .../code.php | 114 +++++++ .../code.power | 83 +++++ .../settings.json | 39 +++ .../README.md | 107 ++++++ .../code.php | 129 ++++++++ .../code.power | 103 ++++++ .../settings.json | 19 ++ .../README.md | 1 + .../code.php | 20 +- .../code.power | 20 +- .../README.md | 101 ++++++ .../code.php | 167 ++++++++++ .../code.power | 137 ++++++++ .../settings.json | 40 +++ .../README.md | 53 +++ .../code.php | 48 +++ .../code.power | 15 + .../settings.json | 42 +++ .../code.php | 106 +++--- .../README.md | 60 ++++ .../code.php | 73 ++++ .../code.power | 47 +++ .../settings.json | 24 ++ .../README.md | 88 +++++ .../code.php | 312 ++++++++++++++++++ .../code.power | 281 ++++++++++++++++ .../settings.json | 31 ++ .../code.php | 22 +- .../code.power | 22 +- .../README.md | 2 +- .../code.php | 2 +- super-powers.json | 88 +++++ 38 files changed, 2982 insertions(+), 83 deletions(-) create mode 100644 src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/README.md create mode 100644 src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/code.php create mode 100644 src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/code.power create mode 100644 src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/settings.json create mode 100644 src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/README.md create mode 100644 src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/code.php create mode 100644 src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/code.power create mode 100644 src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/settings.json create mode 100644 src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/README.md create mode 100644 src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/code.php create mode 100644 src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/code.power create mode 100644 src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/settings.json create mode 100644 src/67a5e0ca-0ff0-4979-9b41-da0b09988016/README.md create mode 100644 src/67a5e0ca-0ff0-4979-9b41-da0b09988016/code.php create mode 100644 src/67a5e0ca-0ff0-4979-9b41-da0b09988016/code.power create mode 100644 src/67a5e0ca-0ff0-4979-9b41-da0b09988016/settings.json create mode 100644 src/884eca78-281f-4eab-b962-d97e355af16d/README.md create mode 100644 src/884eca78-281f-4eab-b962-d97e355af16d/code.php create mode 100644 src/884eca78-281f-4eab-b962-d97e355af16d/code.power create mode 100644 src/884eca78-281f-4eab-b962-d97e355af16d/settings.json create mode 100644 src/d46c4667-378b-49e8-9782-ffb28d92415a/README.md create mode 100644 src/d46c4667-378b-49e8-9782-ffb28d92415a/code.php create mode 100644 src/d46c4667-378b-49e8-9782-ffb28d92415a/code.power create mode 100644 src/d46c4667-378b-49e8-9782-ffb28d92415a/settings.json create mode 100644 src/d7600b43-771a-4747-9f5d-952765721799/README.md create mode 100644 src/d7600b43-771a-4747-9f5d-952765721799/code.php create mode 100644 src/d7600b43-771a-4747-9f5d-952765721799/code.power create mode 100644 src/d7600b43-771a-4747-9f5d-952765721799/settings.json diff --git a/README.md b/README.md index 7fabb2d..be81373 100644 --- a/README.md +++ b/README.md @@ -92,8 +92,10 @@ This repository contains an index (see below) of all the approved powers within - **abstract class GuidHelper** | [Details](src/9c513baf-b279-43fd-ae29-a585c8cbc4f0) | [Code](src/9c513baf-b279-43fd-ae29-a585c8cbc4f0/code.php) | [Settings](src/9c513baf-b279-43fd-ae29-a585c8cbc4f0/settings.json) | SPK: `Super---9c513baf_b279_43fd_ae29_a585c8cbc4f0---Power` - **abstract class JsonHelper** | [Details](src/4b225c51-d293-48e4-b3f6-5136cf5c3f18) | [Code](src/4b225c51-d293-48e4-b3f6-5136cf5c3f18/code.php) | [Settings](src/4b225c51-d293-48e4-b3f6-5136cf5c3f18/settings.json) | SPK: `Super---4b225c51_d293_48e4_b3f6_5136cf5c3f18---Power` - **abstract class MathHelper** | [Details](src/152c8793-8b75-4715-996a-257b9f65451c) | [Code](src/152c8793-8b75-4715-996a-257b9f65451c/code.php) | [Settings](src/152c8793-8b75-4715-996a-257b9f65451c/settings.json) | SPK: `Super---152c8793_8b75_4715_996a_257b9f65451c---Power` + - **abstract class MimeHelper** | [Details](src/f11dc790-713e-4706-9a85-a318ed3ad56e) | [Code](src/f11dc790-713e-4706-9a85-a318ed3ad56e/code.php) | [Settings](src/f11dc790-713e-4706-9a85-a318ed3ad56e/settings.json) | SPK: `Super---f11dc790_713e_4706_9a85_a318ed3ad56e---Power` - **abstract class ObjectHelper** | [Details](src/91004529-94a9-4590-b842-e7c6b624ecf5) | [Code](src/91004529-94a9-4590-b842-e7c6b624ecf5/code.php) | [Settings](src/91004529-94a9-4590-b842-e7c6b624ecf5/settings.json) | SPK: `Super---91004529_94a9_4590_b842_e7c6b624ecf5---Power` - **abstract class StringHelper** | [Details](src/1f28cb53-60d9-4db1-b517-3c7dc6b429ef) | [Code](src/1f28cb53-60d9-4db1-b517-3c7dc6b429ef/code.php) | [Settings](src/1f28cb53-60d9-4db1-b517-3c7dc6b429ef/settings.json) | SPK: `Super---1f28cb53_60d9_4db1_b517_3c7dc6b429ef---Power` + - **abstract class UploadHelper** | [Details](src/d7600b43-771a-4747-9f5d-952765721799) | [Code](src/d7600b43-771a-4747-9f5d-952765721799/code.php) | [Settings](src/d7600b43-771a-4747-9f5d-952765721799/settings.json) | SPK: `Super---d7600b43_771a_4747_9f5d_952765721799---Power` - **Namespace**: [VDM\Joomla\Abstraction\Remote](#vdm-joomla-abstraction-remote) - **abstract class Get** | [Details](src/728ee726-3f0f-4762-899d-f8c9430cee58) | [Code](src/728ee726-3f0f-4762-899d-f8c9430cee58/code.php) | [Settings](src/728ee726-3f0f-4762-899d-f8c9430cee58/settings.json) | SPK: `Super---728ee726_3f0f_4762_899d_f8c9430cee58---Power` @@ -101,6 +103,13 @@ This repository contains an index (see below) of all the approved powers within - **Namespace**: [VDM\Joomla\Componentbuilder\Abstraction](#vdm-joomla-componentbuilder-abstraction) - **abstract class BaseRegistry** | [Details](src/b84e947d-2a13-44f7-ac0f-3902ae55ae0c) | [Code](src/b84e947d-2a13-44f7-ac0f-3902ae55ae0c/code.php) | [Settings](src/b84e947d-2a13-44f7-ac0f-3902ae55ae0c/settings.json) | SPK: `Super---b84e947d_2a13_44f7_ac0f_3902ae55ae0c---Power` +- **Namespace**: [VDM\Joomla\Componentbuilder\File](#vdm-joomla-componentbuilder-file) + + - **abstract class Factory** | [Details](src/884eca78-281f-4eab-b962-d97e355af16d) | [Code](src/884eca78-281f-4eab-b962-d97e355af16d/code.php) | [Settings](src/884eca78-281f-4eab-b962-d97e355af16d/settings.json) | SPK: `Super---884eca78_281f_4eab_b962_d97e355af16d---Power` + - **final class Display** | [Details](src/d46c4667-378b-49e8-9782-ffb28d92415a) | [Code](src/d46c4667-378b-49e8-9782-ffb28d92415a/code.php) | [Settings](src/d46c4667-378b-49e8-9782-ffb28d92415a/settings.json) | SPK: `Super---d46c4667_378b_49e8_9782_ffb28d92415a---Power` + - **final class Handler** | [Details](src/4144ad3b-2ad5-401f-af0c-a3d856c1e688) | [Code](src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/code.php) | [Settings](src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/settings.json) | SPK: `Super---4144ad3b_2ad5_401f_af0c_a3d856c1e688---Power` + - **final class Manager** | [Details](src/67a5e0ca-0ff0-4979-9b41-da0b09988016) | [Code](src/67a5e0ca-0ff0-4979-9b41-da0b09988016/code.php) | [Settings](src/67a5e0ca-0ff0-4979-9b41-da0b09988016/settings.json) | SPK: `Super---67a5e0ca_0ff0_4979_9b41_da0b09988016---Power` + - **final class Type** | [Details](src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e) | [Code](src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/code.php) | [Settings](src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/settings.json) | SPK: `Super---12a2a8de_a893_4dbb_a53d_b52de4f6cb0e---Power` - **Namespace**: [VDM\Joomla\Componentbuilder\Table](#vdm-joomla-componentbuilder-table) - **final class Schema** | [Details](src/b3d2ec33-76d4-4c3b-bb2c-86ac14a221ce) | [Code](src/b3d2ec33-76d4-4c3b-bb2c-86ac14a221ce/code.php) | [Settings](src/b3d2ec33-76d4-4c3b-bb2c-86ac14a221ce/settings.json) | SPK: `Super---b3d2ec33_76d4_4c3b_bb2c_86ac14a221ce---Power` @@ -156,6 +165,9 @@ This repository contains an index (see below) of all the approved powers within - **trait IsString** | [Details](src/ff7d0111-8f79-42aa-ac14-b53ba2c49369) | [Code](src/ff7d0111-8f79-42aa-ac14-b53ba2c49369/code.php) | [Settings](src/ff7d0111-8f79-42aa-ac14-b53ba2c49369/settings.json) | SPK: `Super---ff7d0111_8f79_42aa_ac14_b53ba2c49369---Power` - **trait ToString** | [Details](src/7d494d91-ab60-43cd-aecf-d50e07f7f30e) | [Code](src/7d494d91-ab60-43cd-aecf-d50e07f7f30e/code.php) | [Settings](src/7d494d91-ab60-43cd-aecf-d50e07f7f30e/settings.json) | SPK: `Super---7d494d91_ab60_43cd_aecf_d50e07f7f30e---Power` - **trait VarExport** | [Details](src/52a1d14f-304a-431c-8fa4-411179942db5) | [Code](src/52a1d14f-304a-431c-8fa4-411179942db5/code.php) | [Settings](src/52a1d14f-304a-431c-8fa4-411179942db5/settings.json) | SPK: `Super---52a1d14f_304a_431c_8fa4_411179942db5---Power` +- **Namespace**: [VDM\Joomla\Componentbuilder\File\Service](#vdm-joomla-componentbuilder-file-service) + + - **class File** | [Details](src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088) | [Code](src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/code.php) | [Settings](src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/settings.json) | SPK: `Super---202ccd9e_dfcf_4cde_a0ce_bde1fd27f088---Power` - **Namespace**: [VDM\Joomla\Componentbuilder\Utilities\Exception](#vdm-joomla-componentbuilder-utilities-exception) - **class NoUserIdFoundException** | [Details](src/1c10a5f1-204d-4f17-ad9f-0e0684f2030d) | [Code](src/1c10a5f1-204d-4f17-ad9f-0e0684f2030d/code.php) | [Settings](src/1c10a5f1-204d-4f17-ad9f-0e0684f2030d/settings.json) | SPK: `Super---1c10a5f1_204d_4f17_ad9f_0e0684f2030d---Power` diff --git a/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/README.md b/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/README.md new file mode 100644 index 0000000..3b462fb --- /dev/null +++ b/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/README.md @@ -0,0 +1,117 @@ +``` +██████╗ ██████╗ ██╗ ██╗███████╗██████╗ +██╔══██╗██╔═══██╗██║ ██║██╔════╝██╔══██╗ +██████╔╝██║ ██║██║ █╗ ██║█████╗ ██████╔╝ +██╔═══╝ ██║ ██║██║███╗██║██╔══╝ ██╔══██╗ +██║ ╚██████╔╝╚███╔███╔╝███████╗██║ ██║ +╚═╝ ╚═════╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝ +``` +# final class Type (Details) +> namespace: **VDM\Joomla\Componentbuilder\File** + +```uml +@startuml +class Type << (F,LightGreen) >> #RoyalBlue { + # Item $item + # array $fileTypes + + __construct(Item $item) + + get(string $guid, string $target) : ?array + + load(string $guid, string $target) : ?array + + details(string $guid) : ?object + # validTarget(object $data, string $target) : bool + # getFieldName(object $data) : string + # getAllow(object $data) : string + # getAllowSpan(object $data) : string + # getAllowFormats(object $data) : ?array +} + +note right of Type::__construct + Constructor. + + since: 5.0.2 +end note + +note left of Type::get + Retrieves the file type details (ajax) + + since: 5.0.2 + return: ?array +end note + +note right of Type::load + Retrieves the file type details (upload) + + since: 5.0.2 + return: ?array +end note + +note left of Type::details + Retrieves the file type details + + since: 5.0.2 + return: ?object +end note + +note right of Type::validTarget + Valid if this is a correct target trying to call this file type + + since: 5.0.2 + return: bool +end note + +note left of Type::getFieldName + Retrieves the field name + + since: 5.0.2 + return: string +end note + +note right of Type::getAllow + Retrieves the allow formats (for script) + + since: 5.0.2 + return: string +end note + +note left of Type::getAllowSpan + Retrieves the allow formats (for span) + + since: 5.0.2 + return: string +end note + +note right of Type::getAllowFormats + Retrieves the allow formats + + since: 5.0.2 + return: ?array +end note + +@enduml +``` + +The Power feature in JCB allows you to write PHP classes and their implementations, making it easy to include them in your Joomla project. JCB handles linking, autoloading, namespacing, and folder structure creation for you. + +By using the SPK (Super Power Key) in your custom code (replacing the class name in your code with the SPK), JCB will automatically pull the power from the repository into your project. This makes it available in your JCB instance, allowing you to edit it and include the class in your generated Joomla component. + +JCB uses placeholders like [[[`NamespacePrefix`]]] and [[[`ComponentNamespace`]]] in namespacing to prevent collisions and improve reusability across different JCB systems. You can also set the **JCB powers path** globally or per component under the **Dynamic Integration** tab, providing flexibility and easy maintainability. + +To add this specific Power to your project in JCB: + +> simply use this SPK +``` +Super---12a2a8de_a893_4dbb_a53d_b52de4f6cb0e---Power +``` +> remember to replace the `---` with `___` to activate this Power in your code + +--- +``` + ██╗ ██████╗██████╗ + ██║██╔════╝██╔══██╗ + ██║██║ ██████╔╝ +██ ██║██║ ██╔══██╗ +╚█████╔╝╚██████╗██████╔╝ + ╚════╝ ╚═════╝╚═════╝ +``` +> Build with [Joomla Component Builder](https://git.vdm.dev/joomla/Component-Builder) + diff --git a/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/code.php b/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/code.php new file mode 100644 index 0000000..4cf69c4 --- /dev/null +++ b/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/code.php @@ -0,0 +1,229 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\File; + + +use VDM\Joomla\Interfaces\Data\ItemInterface as Item; + + +/** + * File Type Class + * + * @since 5.0.2 + */ +final class Type +{ + /** + * The Item Class. + * + * @var Item + * @since 5.0.2 + */ + protected Item $item; + + /** + * The File Types + * + * @var array + * @since 5.0.2 + */ + protected array $fileTypes = [1 => 'image' , 2 => 'document' , 3 => 'media', 4 => 'file']; + + /** + * Constructor. + * + * @param Item $item The Item Class. + * + * @since 5.0.2 + */ + public function __construct(Item $item) + { + $this->item = $item; + } + + /** + * Retrieves the file type details (ajax) + * + * @param string $guid The GUID (Globally Unique Identifier) used as the key to retrieve the file type + * @param string $target The entity target name. + * + * @return array|null The item object if found, or null if the item does not exist. + * @since 5.0.2 + */ + public function get(string $guid, string $target): ?array + { + if (($fileType = $this->details($guid)) !== null && + $this->validTarget($fileType, $target)) + { + return [ + 'name' => $this->getFieldName($fileType), + 'allow' => $this->getAllow($fileType), + 'allow_span' => $this->getAllowSpan($fileType), + 'file_type_span' => $fileType->name ?? 'file', + 'display_fields' => $fileType->display_fields ?? null, + 'param_fields' => $fileType->param_fields ?? null, + ]; + } + + return null; + } + + /** + * Retrieves the file type details (upload) + * + * @param string $guid The GUID (Globally Unique Identifier) used as the key to retrieve the file type + * @param string $target The entity target name. + * + * @return array|null The item object if found, or null if the item does not exist. + * @since 5.0.2 + */ + public function load(string $guid, string $target): ?array + { + if (($fileType = $this->details($guid)) !== null && + $this->validTarget($fileType, $target)) + { + return [ + 'field' => $this->getFieldName($fileType), + 'type' => $this->getFieldName($fileType), + 'formats' => $this->getAllowFormats($fileType) ?? [], + 'filter' => $fileType->filter ?? null, + 'path' => $fileType->path ?? null + ]; + } + + return null; + } + + /** + * Retrieves the file type details + * + * @param string $guid The GUID (Globally Unique Identifier) used as the key to retrieve the file type. + * + * @return object|null The item object if found, or null if the item does not exist. + * @since 5.0.2 + */ + public function details(string $guid): ?object + { + return $this->item->table('file_type')->get($guid); + } + + /** + * Valid if this is a correct target trying to call this file type + * + * @param object $data The type data array + * @param string $target The entity target name. + * + * @return bool True if valid target + * @since 5.0.2 + */ + protected function validTarget(object $data, string $target): bool + { + $targets = $data->target ?? null; + if (!empty($targets)) + { + $targets = (array) $targets; + return in_array($target, $targets); + } + + return false; + } + + /** + * Retrieves the field name + * + * @param object $data The type data array + * + * @return string The field name + * @since 5.0.2 + */ + protected function getFieldName(object $data): string + { + $type = $data->type ?? 4; + if (isset($this->fileTypes[$type])) + { + return $this->fileTypes[$type]; + } + return 'file'; + } + + /** + * Retrieves the allow formats (for script) + * + * @param object $data The type data array + * + * @return string The allow values + * @since 5.0.2 + */ + protected function getAllow(object $data): string + { + $formats = $this->getAllowFormats($data); + if (!empty($formats)) + { + return '*.(' . implode('|', $formats) . ')'; + } + return ''; + } + + /** + * Retrieves the allow formats (for span) + * + * @param object $data The type data array + * + * @return string The allow values + * @since 5.0.2 + */ + protected function getAllowSpan(object $data): string + { + $formats = $this->getAllowFormats($data); + if (!empty($formats)) + { + return '(formats allowed: ' . implode(', ', $formats) . ')'; + } + return ''; + } + + /** + * Retrieves the allow formats + * + * @param object|null $data The type data array + * + * @return array|null The allow values + * @since 5.0.2 + */ + protected function getAllowFormats(object $data): ?array + { + $type = $data->type ?? 4; + switch ($type) + { + case 1: + $formats = $data->image_formats ?? null; + break; + case 2: + $formats = $data->document_formats ?? null; + break; + case 3: + $formats = $data->media_formats ?? null; + break; + default: + $formats = $data->file_formats ?? null; + break; + } + + if ($formats) + { + return (array) $formats; + } + + return null; + } +} + diff --git a/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/code.power b/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/code.power new file mode 100644 index 0000000..68a8b18 --- /dev/null +++ b/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/code.power @@ -0,0 +1,203 @@ + /** + * The Item Class. + * + * @var Item + * @since 5.0.2 + */ + protected Item $item; + + /** + * The File Types + * + * @var array + * @since 5.0.2 + */ + protected array $fileTypes = [1 => 'image' , 2 => 'document' , 3 => 'media', 4 => 'file']; + + /** + * Constructor. + * + * @param Item $item The Item Class. + * + * @since 5.0.2 + */ + public function __construct(Item $item) + { + $this->item = $item; + } + + /** + * Retrieves the file type details (ajax) + * + * @param string $guid The GUID (Globally Unique Identifier) used as the key to retrieve the file type + * @param string $target The entity target name. + * + * @return array|null The item object if found, or null if the item does not exist. + * @since 5.0.2 + */ + public function get(string $guid, string $target): ?array + { + if (($fileType = $this->details($guid)) !== null && + $this->validTarget($fileType, $target)) + { + return [ + 'name' => $this->getFieldName($fileType), + 'allow' => $this->getAllow($fileType), + 'allow_span' => $this->getAllowSpan($fileType), + 'file_type_span' => $fileType->name ?? 'file', + 'display_fields' => $fileType->display_fields ?? null, + 'param_fields' => $fileType->param_fields ?? null, + ]; + } + + return null; + } + + /** + * Retrieves the file type details (upload) + * + * @param string $guid The GUID (Globally Unique Identifier) used as the key to retrieve the file type + * @param string $target The entity target name. + * + * @return array|null The item object if found, or null if the item does not exist. + * @since 5.0.2 + */ + public function load(string $guid, string $target): ?array + { + if (($fileType = $this->details($guid)) !== null && + $this->validTarget($fileType, $target)) + { + return [ + 'field' => $this->getFieldName($fileType), + 'type' => $this->getFieldName($fileType), + 'formats' => $this->getAllowFormats($fileType) ?? [], + 'filter' => $fileType->filter ?? null, + 'path' => $fileType->path ?? null + ]; + } + + return null; + } + + /** + * Retrieves the file type details + * + * @param string $guid The GUID (Globally Unique Identifier) used as the key to retrieve the file type. + * + * @return object|null The item object if found, or null if the item does not exist. + * @since 5.0.2 + */ + public function details(string $guid): ?object + { + return $this->item->table('file_type')->get($guid); + } + + /** + * Valid if this is a correct target trying to call this file type + * + * @param object $data The type data array + * @param string $target The entity target name. + * + * @return bool True if valid target + * @since 5.0.2 + */ + protected function validTarget(object $data, string $target): bool + { + $targets = $data->target ?? null; + if (!empty($targets)) + { + $targets = (array) $targets; + return in_array($target, $targets); + } + + return false; + } + + /** + * Retrieves the field name + * + * @param object $data The type data array + * + * @return string The field name + * @since 5.0.2 + */ + protected function getFieldName(object $data): string + { + $type = $data->type ?? 4; + if (isset($this->fileTypes[$type])) + { + return $this->fileTypes[$type]; + } + return 'file'; + } + + /** + * Retrieves the allow formats (for script) + * + * @param object $data The type data array + * + * @return string The allow values + * @since 5.0.2 + */ + protected function getAllow(object $data): string + { + $formats = $this->getAllowFormats($data); + if (!empty($formats)) + { + return '*.(' . implode('|', $formats) . ')'; + } + return ''; + } + + /** + * Retrieves the allow formats (for span) + * + * @param object $data The type data array + * + * @return string The allow values + * @since 5.0.2 + */ + protected function getAllowSpan(object $data): string + { + $formats = $this->getAllowFormats($data); + if (!empty($formats)) + { + return '(formats allowed: ' . implode(', ', $formats) . ')'; + } + return ''; + } + + /** + * Retrieves the allow formats + * + * @param object|null $data The type data array + * + * @return array|null The allow values + * @since 5.0.2 + */ + protected function getAllowFormats(object $data): ?array + { + $type = $data->type ?? 4; + switch ($type) + { + case 1: + $formats = $data->image_formats ?? null; + break; + case 2: + $formats = $data->document_formats ?? null; + break; + case 3: + $formats = $data->media_formats ?? null; + break; + default: + $formats = $data->file_formats ?? null; + break; + } + + if ($formats) + { + return (array) $formats; + } + + return null; + } \ No newline at end of file diff --git a/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/settings.json b/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/settings.json new file mode 100644 index 0000000..b5ac909 --- /dev/null +++ b/src/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e/settings.json @@ -0,0 +1,24 @@ +{ + "add_head": "0", + "add_licensing_template": "2", + "extends": "", + "guid": "12a2a8de-a893-4dbb-a53d-b52de4f6cb0e", + "implements": null, + "load_selection": null, + "name": "Type", + "power_version": "1.0.0", + "system_name": "Joomla.File.Type", + "type": "final class", + "use_selection": { + "use_selection0": { + "use": "05744dd3-4030-4cf8-8dda-a93ab809b473", + "as": "Item" + } + }, + "extendsinterfaces": null, + "namespace": "[[[NamespacePrefix]]]\\Joomla\\[[[ComponentNamespace]]].File.Type", + "description": "File Type Class\r\n\r\n@since 5.0.2", + "licensing_template": "\/**\r\n * @package Joomla.Component.Builder\r\n *\r\n * @created 3rd September, 2020\r\n * @author Llewellyn van der Merwe \r\n * @git Joomla Component Builder \r\n * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.\r\n * @license GNU General Public License version 2 or later; see LICENSE.txt\r\n *\/\r\n", + "head": "", + "composer": "" +} \ No newline at end of file diff --git a/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/README.md b/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/README.md new file mode 100644 index 0000000..bbccf18 --- /dev/null +++ b/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/README.md @@ -0,0 +1,84 @@ +``` +██████╗ ██████╗ ██╗ ██╗███████╗██████╗ +██╔══██╗██╔═══██╗██║ ██║██╔════╝██╔══██╗ +██████╔╝██║ ██║██║ █╗ ██║█████╗ ██████╔╝ +██╔═══╝ ██║ ██║██║███╗██║██╔══╝ ██╔══██╗ +██║ ╚██████╔╝╚███╔███╔╝███████╗██║ ██║ +╚═╝ ╚═════╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝ +``` +# class File (Details) +> namespace: **VDM\Joomla\Componentbuilder\File\Service** + +```uml +@startuml +class File #Gold { + + register(Container $container) : void + + getType(Container $container) : Type + + getHandler(Container $container) : Handler + + getManager(Container $container) : Manager + + getDisplay(Container $container) : Display +} + +note right of File::register + Registers the service provider with a DI container. + + since: 5.0.3 + return: void +end note + +note right of File::getType + Get The Type Class. + + since: 5.0.3 + return: Type +end note + +note right of File::getHandler + Get The Handler Class. + + since: 5.0.3 + return: Handler +end note + +note right of File::getManager + Get The Manager Class. + + since: 5.0.3 + return: Manager +end note + +note right of File::getDisplay + Get The Display Class. + + since: 5.0.3 + return: Display +end note + +@enduml +``` + +The Power feature in JCB allows you to write PHP classes and their implementations, making it easy to include them in your Joomla project. JCB handles linking, autoloading, namespacing, and folder structure creation for you. + +By using the SPK (Super Power Key) in your custom code (replacing the class name in your code with the SPK), JCB will automatically pull the power from the repository into your project. This makes it available in your JCB instance, allowing you to edit it and include the class in your generated Joomla component. + +JCB uses placeholders like [[[`NamespacePrefix`]]] and [[[`ComponentNamespace`]]] in namespacing to prevent collisions and improve reusability across different JCB systems. You can also set the **JCB powers path** globally or per component under the **Dynamic Integration** tab, providing flexibility and easy maintainability. + +To add this specific Power to your project in JCB: + +> simply use this SPK +``` +Super---202ccd9e_dfcf_4cde_a0ce_bde1fd27f088---Power +``` +> remember to replace the `---` with `___` to activate this Power in your code + +--- +``` + ██╗ ██████╗██████╗ + ██║██╔════╝██╔══██╗ + ██║██║ ██████╔╝ +██ ██║██║ ██╔══██╗ +╚█████╔╝╚██████╗██████╔╝ + ╚════╝ ╚═════╝╚═════╝ +``` +> Build with [Joomla Component Builder](https://git.vdm.dev/joomla/Component-Builder) + diff --git a/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/code.php b/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/code.php new file mode 100644 index 0000000..db3da01 --- /dev/null +++ b/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/code.php @@ -0,0 +1,114 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\File\Service; + + +use Joomla\DI\Container; +use Joomla\DI\ServiceProviderInterface; +use VDM\Joomla\Componentbuilder\File\Type; +use VDM\Joomla\Componentbuilder\File\Handler; +use VDM\Joomla\Componentbuilder\File\Manager; +use VDM\Joomla\Componentbuilder\File\Display; + + +/** + * File Service Provider + * + * @since 5.0.3 + */ +class File implements ServiceProviderInterface +{ + /** + * Registers the service provider with a DI container. + * + * @param Container $container The DI container. + * + * @return void + * @since 5.0.3 + */ + public function register(Container $container) + { + $container->alias(Type::class, 'File.Type') + ->share('File.Type', [$this, 'getType'], true); + + $container->alias(Handler::class, 'File.Handler') + ->share('File.Handler', [$this, 'getHandler'], true); + + $container->alias(Manager::class, 'File.Manager') + ->share('File.Manager', [$this, 'getManager'], true); + + $container->alias(Display::class, 'File.Display') + ->share('File.Display', [$this, 'getDisplay'], true); + } + + /** + * Get The Type Class. + * + * @param Container $container The DI container. + * + * @return Type + * @since 5.0.3 + */ + public function getType(Container $container): Type + { + return new Type( + $container->get('Data.Item') + ); + } + + /** + * Get The Handler Class. + * + * @param Container $container The DI container. + * + * @return Handler + * @since 5.0.3 + */ + public function getHandler(Container $container): Handler + { + return new Handler(); + } + + /** + * Get The Manager Class. + * + * @param Container $container The DI container. + * + * @return Manager + * @since 5.0.3 + */ + public function getManager(Container $container): Manager + { + return new Manager( + $container->get('Data.Item'), + $container->get('Data.Items'), + $container->get('File.Type'), + $container->get('File.Handler') + ); + } + + /** + * Get The Display Class. + * + * @param Container $container The DI container. + * + * @return Display + * @since 5.0.3 + */ + public function getDisplay(Container $container): Display + { + return new Display( + $container->get('Data.Items') + ); + } +} + diff --git a/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/code.power b/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/code.power new file mode 100644 index 0000000..2f189cd --- /dev/null +++ b/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/code.power @@ -0,0 +1,83 @@ + /** + * Registers the service provider with a DI container. + * + * @param Container $container The DI container. + * + * @return void + * @since 5.0.3 + */ + public function register(Container $container) + { + $container->alias(Type::class, 'File.Type') + ->share('File.Type', [$this, 'getType'], true); + + $container->alias(Handler::class, 'File.Handler') + ->share('File.Handler', [$this, 'getHandler'], true); + + $container->alias(Manager::class, 'File.Manager') + ->share('File.Manager', [$this, 'getManager'], true); + + $container->alias(Display::class, 'File.Display') + ->share('File.Display', [$this, 'getDisplay'], true); + } + + /** + * Get The Type Class. + * + * @param Container $container The DI container. + * + * @return Type + * @since 5.0.3 + */ + public function getType(Container $container): Type + { + return new Type( + $container->get('Data.Item') + ); + } + + /** + * Get The Handler Class. + * + * @param Container $container The DI container. + * + * @return Handler + * @since 5.0.3 + */ + public function getHandler(Container $container): Handler + { + return new Handler(); + } + + /** + * Get The Manager Class. + * + * @param Container $container The DI container. + * + * @return Manager + * @since 5.0.3 + */ + public function getManager(Container $container): Manager + { + return new Manager( + $container->get('Data.Item'), + $container->get('Data.Items'), + $container->get('File.Type'), + $container->get('File.Handler') + ); + } + + /** + * Get The Display Class. + * + * @param Container $container The DI container. + * + * @return Display + * @since 5.0.3 + */ + public function getDisplay(Container $container): Display + { + return new Display( + $container->get('Data.Items') + ); + } \ No newline at end of file diff --git a/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/settings.json b/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/settings.json new file mode 100644 index 0000000..18b7c13 --- /dev/null +++ b/src/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088/settings.json @@ -0,0 +1,39 @@ +{ + "add_head": "1", + "add_licensing_template": "2", + "extends": "", + "guid": "202ccd9e-dfcf-4cde-a0ce-bde1fd27f088", + "implements": [ + "-1" + ], + "load_selection": null, + "name": "File", + "power_version": "1.0.0", + "system_name": "JCB.File.Service.File", + "type": "class", + "use_selection": { + "use_selection0": { + "use": "12a2a8de-a893-4dbb-a53d-b52de4f6cb0e", + "as": "default" + }, + "use_selection1": { + "use": "4144ad3b-2ad5-401f-af0c-a3d856c1e688", + "as": "default" + }, + "use_selection2": { + "use": "67a5e0ca-0ff0-4979-9b41-da0b09988016", + "as": "default" + }, + "use_selection3": { + "use": "d46c4667-378b-49e8-9782-ffb28d92415a", + "as": "default" + } + }, + "extendsinterfaces": null, + "namespace": "[[[NamespacePrefix]]]\\Joomla\\[[[ComponentNamespace]]].File.Service.File", + "description": "File Service Provider\r\n\r\n@since 5.0.3", + "implements_custom": "ServiceProviderInterface", + "licensing_template": "\/**\r\n * @package Joomla.Component.Builder\r\n *\r\n * @created 4th September, 2022\r\n * @author Llewellyn van der Merwe \r\n * @git Joomla Component Builder \r\n * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.\r\n * @license GNU General Public License version 2 or later; see LICENSE.txt\r\n *\/\r\n", + "head": "use Joomla\\DI\\Container;\r\nuse Joomla\\DI\\ServiceProviderInterface;", + "composer": "" +} \ No newline at end of file diff --git a/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/README.md b/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/README.md new file mode 100644 index 0000000..b5bf5eb --- /dev/null +++ b/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/README.md @@ -0,0 +1,107 @@ +``` +██████╗ ██████╗ ██╗ ██╗███████╗██████╗ +██╔══██╗██╔═══██╗██║ ██║██╔════╝██╔══██╗ +██████╔╝██║ ██║██║ █╗ ██║█████╗ ██████╔╝ +██╔═══╝ ██║ ██║██║███╗██║██╔══╝ ██╔══██╗ +██║ ╚██████╔╝╚███╔███╔╝███████╗██║ ██║ +╚═╝ ╚═════╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝ +``` +# final class Handler (Details) +> namespace: **VDM\Joomla\Componentbuilder\File** +> extends: **UploadHelper** + +```uml +@startuml +class Handler << (F,LightGreen) >> #RoyalBlue { + + setUseStreams(bool $useStreams) : self + + setAllowUnsafe(bool $allowUnsafe) : self + + setSafeFileOptions(array $safeFileOptions) : self + + setEnqueueError(bool $enqueueError) : self + + setLegalFormats(array $legalFormats) : self + + getFile(string $field, string $type, ...) : ?array + + getErrors(bool $toString = true) : string|array +} + +note right of Handler::setUseStreams + Set the $useStreams property to use streams for file handling + + since: 5.0.3 + return: self +end note + +note right of Handler::setAllowUnsafe + Set the $allowUnsafe property to allow or disallow unsafe file uploads. + + since: 5.0.3 + return: self +end note + +note right of Handler::setSafeFileOptions + Set the $safeFileOptions property to define options for file safety checks. + + since: 5.0.3 + return: self +end note + +note right of Handler::setEnqueueError + Set the $enqueueError property to control error reporting behavior. + + since: 5.0.3 + return: self +end note + +note right of Handler::setLegalFormats + Set the $legalFormats property to define legal file formats. + + since: 5.0.3 + return: self +end note + +note right of Handler::getFile + Get a file from the input based on field name and file type, then process it. + + since: 3.0.11 + return: ?array + + arguments: + string $field + string $type + string $filter = null + string $path = null +end note + +note right of Handler::getErrors + Get the error messages as a string. + + since: 5.0.3 + return: string|array +end note + +@enduml +``` + +The Power feature in JCB allows you to write PHP classes and their implementations, making it easy to include them in your Joomla project. JCB handles linking, autoloading, namespacing, and folder structure creation for you. + +By using the SPK (Super Power Key) in your custom code (replacing the class name in your code with the SPK), JCB will automatically pull the power from the repository into your project. This makes it available in your JCB instance, allowing you to edit it and include the class in your generated Joomla component. + +JCB uses placeholders like [[[`NamespacePrefix`]]] and [[[`ComponentNamespace`]]] in namespacing to prevent collisions and improve reusability across different JCB systems. You can also set the **JCB powers path** globally or per component under the **Dynamic Integration** tab, providing flexibility and easy maintainability. + +To add this specific Power to your project in JCB: + +> simply use this SPK +``` +Super---4144ad3b_2ad5_401f_af0c_a3d856c1e688---Power +``` +> remember to replace the `---` with `___` to activate this Power in your code + +--- +``` + ██╗ ██████╗██████╗ + ██║██╔════╝██╔══██╗ + ██║██║ ██████╔╝ +██ ██║██║ ██╔══██╗ +╚█████╔╝╚██████╗██████╔╝ + ╚════╝ ╚═════╝╚═════╝ +``` +> Build with [Joomla Component Builder](https://git.vdm.dev/joomla/Component-Builder) + diff --git a/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/code.php b/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/code.php new file mode 100644 index 0000000..c319fff --- /dev/null +++ b/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/code.php @@ -0,0 +1,129 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\File; + + +use VDM\Joomla\Utilities\UploadHelper; + + +/** + * File Handler Class + * + * @since 5.0.2 + */ +final class Handler extends UploadHelper +{ + /** + * Set the $useStreams property to use streams for file handling + * + * @param bool $useStreams True to use streams, false otherwise. + * + * @return self Returns the current instance to allow for method chaining. + * @since 5.0.3 + */ + public function setUseStreams(bool $useStreams): self + { + static::$useStreams = $useStreams; + + return $this; + } + + /** + * Set the $allowUnsafe property to allow or disallow unsafe file uploads. + * + * @param bool $allowUnsafe True to allow unsafe file uploads, false otherwise. + * + * @return self Returns the current instance to allow for method chaining. + * @since 5.0.3 + */ + public function setAllowUnsafe(bool $allowUnsafe): self + { + static::$allowUnsafe = $allowUnsafe; + + return $this; + } + + /** + * Set the $safeFileOptions property to define options for file safety checks. + * + * @param array $safeFileOptions An array of options for InputFilter::isSafeFile. + * + * @return self Returns the current instance to allow for method chaining. + * @since 5.0.3 + */ + public function setSafeFileOptions(array $safeFileOptions): self + { + static::$safeFileOptions = $safeFileOptions; + + return $this; + } + + /** + * Set the $enqueueError property to control error reporting behavior. + * + * @param bool $enqueueError True to enqueue error messages, false to store them in the internal error array. + * + * @return self Returns the current instance to allow for method chaining. + * @since 5.0.3 + */ + public function setEnqueueError(bool $enqueueError): self + { + static::$enqueueError = $enqueueError; + + return $this; + } + + /** + * Set the $legalFormats property to define legal file formats. + * + * @param array $legalFormats An array of allowed file formats (e.g., ['jpg', 'png']). + * + * @return self Returns the current instance to allow for method chaining. + * @since 5.0.3 + */ + public function setLegalFormats(array $legalFormats): self + { + static::$legalFormats = $legalFormats; + + return $this; + } + + /** + * Get a file from the input based on field name and file type, then process it. + * + * @param string $field The input field name for the file upload. + * @param string $type The type of file (e.g., 'image', 'document'). + * @param string|null $filter The filter to apply when uploading the file. + * @param string|null $path The directory path where the file should be saved. + * + * @return array|null File details or false on failure. + * @since 3.0.11 + */ + public function getFile(string $field, string $type, string $filter = null, string $path = null): ?array + { + return static::get($field, $type, $filter, $path); + } + + /** + * Get the error messages as a string. + * + * @param bool $toString The option to return errors as a string + * + * @return string|array Returns the error messages as a single concatenated string. + * @since 5.0.3 + */ + public function getErrors(bool $toString = true): string|array + { + return static::getError($toString); + } +} + diff --git a/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/code.power b/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/code.power new file mode 100644 index 0000000..4e98a1e --- /dev/null +++ b/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/code.power @@ -0,0 +1,103 @@ + /** + * Set the $useStreams property to use streams for file handling + * + * @param bool $useStreams True to use streams, false otherwise. + * + * @return self Returns the current instance to allow for method chaining. + * @since 5.0.3 + */ + public function setUseStreams(bool $useStreams): self + { + static::$useStreams = $useStreams; + + return $this; + } + + /** + * Set the $allowUnsafe property to allow or disallow unsafe file uploads. + * + * @param bool $allowUnsafe True to allow unsafe file uploads, false otherwise. + * + * @return self Returns the current instance to allow for method chaining. + * @since 5.0.3 + */ + public function setAllowUnsafe(bool $allowUnsafe): self + { + static::$allowUnsafe = $allowUnsafe; + + return $this; + } + + /** + * Set the $safeFileOptions property to define options for file safety checks. + * + * @param array $safeFileOptions An array of options for InputFilter::isSafeFile. + * + * @return self Returns the current instance to allow for method chaining. + * @since 5.0.3 + */ + public function setSafeFileOptions(array $safeFileOptions): self + { + static::$safeFileOptions = $safeFileOptions; + + return $this; + } + + /** + * Set the $enqueueError property to control error reporting behavior. + * + * @param bool $enqueueError True to enqueue error messages, false to store them in the internal error array. + * + * @return self Returns the current instance to allow for method chaining. + * @since 5.0.3 + */ + public function setEnqueueError(bool $enqueueError): self + { + static::$enqueueError = $enqueueError; + + return $this; + } + + /** + * Set the $legalFormats property to define legal file formats. + * + * @param array $legalFormats An array of allowed file formats (e.g., ['jpg', 'png']). + * + * @return self Returns the current instance to allow for method chaining. + * @since 5.0.3 + */ + public function setLegalFormats(array $legalFormats): self + { + static::$legalFormats = $legalFormats; + + return $this; + } + + /** + * Get a file from the input based on field name and file type, then process it. + * + * @param string $field The input field name for the file upload. + * @param string $type The type of file (e.g., 'image', 'document'). + * @param string|null $filter The filter to apply when uploading the file. + * @param string|null $path The directory path where the file should be saved. + * + * @return array|null File details or false on failure. + * @since 3.0.11 + */ + public function getFile(string $field, string $type, string $filter = null, string $path = null): ?array + { + return static::get($field, $type, $filter, $path); + } + + /** + * Get the error messages as a string. + * + * @param bool $toString The option to return errors as a string + * + * @return string|array Returns the error messages as a single concatenated string. + * @since 5.0.3 + */ + public function getErrors(bool $toString = true): string|array + { + return static::getError($toString); + } \ No newline at end of file diff --git a/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/settings.json b/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/settings.json new file mode 100644 index 0000000..be35d7f --- /dev/null +++ b/src/4144ad3b-2ad5-401f-af0c-a3d856c1e688/settings.json @@ -0,0 +1,19 @@ +{ + "add_head": "0", + "add_licensing_template": "2", + "extends": "d7600b43-771a-4747-9f5d-952765721799", + "guid": "4144ad3b-2ad5-401f-af0c-a3d856c1e688", + "implements": null, + "load_selection": null, + "name": "Handler", + "power_version": "1.0.0", + "system_name": "Joomla.File.Handler", + "type": "final class", + "use_selection": null, + "extendsinterfaces": null, + "namespace": "[[[NamespacePrefix]]]\\Joomla\\[[[ComponentNamespace]]].File.Handler", + "description": "File Handler Class\r\n\r\n@since 5.0.2", + "licensing_template": "\/**\r\n * @package Joomla.Component.Builder\r\n *\r\n * @created 3rd September, 2020\r\n * @author Llewellyn van der Merwe \r\n * @git Joomla Component Builder \r\n * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.\r\n * @license GNU General Public License version 2 or later; see LICENSE.txt\r\n *\/\r\n", + "head": "", + "composer": "" +} \ No newline at end of file diff --git a/src/46b98346-ec98-42b3-a393-96c7d1282b1c/README.md b/src/46b98346-ec98-42b3-a393-96c7d1282b1c/README.md index 0fa3b87..2ad6e91 100644 --- a/src/46b98346-ec98-42b3-a393-96c7d1282b1c/README.md +++ b/src/46b98346-ec98-42b3-a393-96c7d1282b1c/README.md @@ -15,6 +15,7 @@ class UsersSubform << (F,LightGreen) >> #RoyalBlue { # Items $items # string $table # array $user + # User $identity # array $activeUsers + __construct(Items $items, ?string $table = null) + table(string $table) : self diff --git a/src/46b98346-ec98-42b3-a393-96c7d1282b1c/code.php b/src/46b98346-ec98-42b3-a393-96c7d1282b1c/code.php index 21c9592..995c1c8 100644 --- a/src/46b98346-ec98-42b3-a393-96c7d1282b1c/code.php +++ b/src/46b98346-ec98-42b3-a393-96c7d1282b1c/code.php @@ -61,6 +61,14 @@ final class UsersSubform implements GuidInterface, SubformInterface */ protected array $user; + /** + * The current active user + * + * @var User + * @since 5.0.2 + */ + protected User $identity; + /** * The active users * @@ -85,6 +93,8 @@ final class UsersSubform implements GuidInterface, SubformInterface $this->table = $table; } + $this->identity = Factory::getApplication()->getIdentity(); + // Retrieve the user properties $this->initializeUserProperties(); } @@ -429,8 +439,12 @@ final class UsersSubform implements GuidInterface, SubformInterface { $user = $this->loadUser($item, $activeUsers); $details = $this->extractUserDetails($item, $user); - $this->assignUserGroups($details, $user, $item); - + + if ($this->identity->id != $user->id) + { + $this->assignUserGroups($details, $user, $item); + } + return $this->saveUserDetails($details, $details['id'] ?? 0); } @@ -535,7 +549,7 @@ final class UsersSubform implements GuidInterface, SubformInterface private function saveUserDetails(array $details, int $userId): int { try { - return UserHelper::save($details); + return UserHelper::save($details, 0, ['useractivation' => 0, 'sendpassword' => 1, 'allowUserRegistration' => 1]); } catch (NoUserIdFoundException $e) { Factory::getApplication()->enqueueMessage($e->getMessage(), 'error'); } catch (\Exception $e) { diff --git a/src/46b98346-ec98-42b3-a393-96c7d1282b1c/code.power b/src/46b98346-ec98-42b3-a393-96c7d1282b1c/code.power index 07a1144..7524d48 100644 --- a/src/46b98346-ec98-42b3-a393-96c7d1282b1c/code.power +++ b/src/46b98346-ec98-42b3-a393-96c7d1282b1c/code.power @@ -29,6 +29,14 @@ */ protected array $user; + /** + * The current active user + * + * @var User + * @since 5.0.2 + */ + protected User $identity; + /** * The active users * @@ -53,6 +61,8 @@ $this->table = $table; } + $this->identity = Factory::getApplication()->getIdentity(); + // Retrieve the user properties $this->initializeUserProperties(); } @@ -397,8 +407,12 @@ { $user = $this->loadUser($item, $activeUsers); $details = $this->extractUserDetails($item, $user); - $this->assignUserGroups($details, $user, $item); - + + if ($this->identity->id != $user->id) + { + $this->assignUserGroups($details, $user, $item); + } + return $this->saveUserDetails($details, $details['id'] ?? 0); } @@ -503,7 +517,7 @@ private function saveUserDetails(array $details, int $userId): int { try { - return UserHelper::save($details); + return UserHelper::save($details, 0, ['useractivation' => 0, 'sendpassword' => 1, 'allowUserRegistration' => 1]); } catch (NoUserIdFoundException $e) { Factory::getApplication()->enqueueMessage($e->getMessage(), 'error'); } catch (\Exception $e) { diff --git a/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/README.md b/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/README.md new file mode 100644 index 0000000..f7aad01 --- /dev/null +++ b/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/README.md @@ -0,0 +1,101 @@ +``` +██████╗ ██████╗ ██╗ ██╗███████╗██████╗ +██╔══██╗██╔═══██╗██║ ██║██╔════╝██╔══██╗ +██████╔╝██║ ██║██║ █╗ ██║█████╗ ██████╔╝ +██╔═══╝ ██║ ██║██║███╗██║██╔══╝ ██╔══██╗ +██║ ╚██████╔╝╚███╔███╔╝███████╗██║ ██║ +╚═╝ ╚═════╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝ +``` +# final class Manager (Details) +> namespace: **VDM\Joomla\Componentbuilder\File** + +```uml +@startuml +class Manager << (F,LightGreen) >> #RoyalBlue { + # Item $item + # Items $items + # Type $type + # Handler $handler + + __construct(Item $item, Items $items, ...) + + upload(string $guid, string $entity, ...) : void + + delete(string $guid, string $entity, ...) : void + # modelFileDetails(array $details, string $guid, ...) : object +} + +note right of Manager::__construct + Constructor. + + since: 5.0.2 + + arguments: + Item $item + Items $items + Type $type + Handler $handler +end note + +note right of Manager::upload + Upload a file, of a given file type and link it to an entity. + + since: 5.0.2 + return: void + + arguments: + string $guid + string $entity + string $target +end note + +note right of Manager::delete + Delete a file of a given entity. + + since: 5.0.2 + return: void + + arguments: + string $guid + string $entity + string $target +end note + +note right of Manager::modelFileDetails + model the file details to store in the file table + + since: 5.0.2 + return: object + + arguments: + array $details + string $guid + string $entity + string $target +end note + +@enduml +``` + +The Power feature in JCB allows you to write PHP classes and their implementations, making it easy to include them in your Joomla project. JCB handles linking, autoloading, namespacing, and folder structure creation for you. + +By using the SPK (Super Power Key) in your custom code (replacing the class name in your code with the SPK), JCB will automatically pull the power from the repository into your project. This makes it available in your JCB instance, allowing you to edit it and include the class in your generated Joomla component. + +JCB uses placeholders like [[[`NamespacePrefix`]]] and [[[`ComponentNamespace`]]] in namespacing to prevent collisions and improve reusability across different JCB systems. You can also set the **JCB powers path** globally or per component under the **Dynamic Integration** tab, providing flexibility and easy maintainability. + +To add this specific Power to your project in JCB: + +> simply use this SPK +``` +Super---67a5e0ca_0ff0_4979_9b41_da0b09988016---Power +``` +> remember to replace the `---` with `___` to activate this Power in your code + +--- +``` + ██╗ ██████╗██████╗ + ██║██╔════╝██╔══██╗ + ██║██║ ██████╔╝ +██ ██║██║ ██╔══██╗ +╚█████╔╝╚██████╗██████╔╝ + ╚════╝ ╚═════╝╚═════╝ +``` +> Build with [Joomla Component Builder](https://git.vdm.dev/joomla/Component-Builder) + diff --git a/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/code.php b/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/code.php new file mode 100644 index 0000000..bb7f297 --- /dev/null +++ b/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/code.php @@ -0,0 +1,167 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\File; + + +use VDM\Joomla\Interfaces\Data\ItemInterface as Item; +use VDM\Joomla\Interfaces\Data\ItemsInterface as Items; +use VDM\Joomla\Data\Guid; +use VDM\Joomla\Componentbuilder\File\Type; +use VDM\Joomla\Componentbuilder\File\Handler; + + +/** + * File Manager Class + * + * @since 5.0.2 + */ +final class Manager +{ + /** + * The Globally Unique Identifier. + * + * @since 5.0.2 + */ + use Guid; + + /** + * The Item Class. + * + * @var Item + * @since 5.0.2 + */ + protected Item $item; + + /** + * The Items Class. + * + * @var Items + * @since 5.0.2 + */ + protected Items $items; + + /** + * The Type Class. + * + * @var Type + * @since 5.0.2 + */ + protected Type $type; + + /** + * The Handler Class. + * + * @var Handler + * @since 5.0.2 + */ + protected Handler $handler; + + /** + * Constructor. + * + * @param Item $item The Item Class. + * @param Items $items The Items Class. + * @param Type $type The Type Class. + * @param Handler $handler The Handler Class. + * + * @since 5.0.2 + */ + public function __construct(Item $item, Items $items, Type $type, Handler $handler) + { + $this->item = $item; + $this->items = $items; + $this->type = $type; + $this->handler = $handler; + } + + /** + * Upload a file, of a given file type and link it to an entity. + * + * @param string $guid The file type guid + * @param string $entity The entity guid + * @param string $target The target entity name + * + * @return void + * @throws \InvalidArgumentException If the file type is not valid. + * @throws \RuntimeException If there is an error during file upload. + * @since 5.0.2 + */ + public function upload(string $guid, string $entity, string $target): void + { + if (($fileType = $this->type->load($guid, $target)) === null) + { + throw new \InvalidArgumentException(Text::sprintf('COM_COMPONENTBUILDER_FILE_TYPE_NOT_VALID_IN_S_AREA', $target)); + } + + $details = $this->handler + ->setEnqueueError(false) + ->setLegalFormats($fileType['formats']) + ->getFile( + $fileType['field'], // The input field name + $fileType['type'], // The file type + $fileType['filter'], // The filter to use when uploading the file + $fileType['path'] // The path to the directory where the file must be placed + ); + + if ($details === null) + { + // Throw an exception if file details couldn't be retrieved + throw new \RuntimeException($this->handler->getErrors()); + } + + // store file in the file table + $this->item->set( + $this->modelFileDetails($details, $guid) + ); + } + + /** + * Delete a file of a given entity. + * + * @param string $guid The file guid + * @param string $entity The entity guid + * @param string $target The target entity name + * + * @return void + * @since 5.0.2 + */ + public function delete(string $guid, string $entity, string $target): void + { + + } + + /** + * model the file details to store in the file table + * + * @param array $details The uploaded file details. + * @param string $guid The file type guid + * @param string $entity The entity guid + * @param string $target The target entity name + * + * @return object + * @since 5.0.2 + */ + protected function modelFileDetails(array $details, string $guid, string $entity, string $target): object + { + return (object) [ + 'name' => 'soon', + 'file_type' => $guid, + 'ext' => 'me', + 'size_kb' => 45, + 'filepath' => $details['full_path'], + 'entity_type' => $target, + 'entity' => $guid, + 'guid' => $this->getGuid('file'), + ]; + } +} + diff --git a/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/code.power b/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/code.power new file mode 100644 index 0000000..1773e50 --- /dev/null +++ b/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/code.power @@ -0,0 +1,137 @@ + /** + * The Globally Unique Identifier. + * + * @since 5.0.2 + */ + use Guid; + + /** + * The Item Class. + * + * @var Item + * @since 5.0.2 + */ + protected Item $item; + + /** + * The Items Class. + * + * @var Items + * @since 5.0.2 + */ + protected Items $items; + + /** + * The Type Class. + * + * @var Type + * @since 5.0.2 + */ + protected Type $type; + + /** + * The Handler Class. + * + * @var Handler + * @since 5.0.2 + */ + protected Handler $handler; + + /** + * Constructor. + * + * @param Item $item The Item Class. + * @param Items $items The Items Class. + * @param Type $type The Type Class. + * @param Handler $handler The Handler Class. + * + * @since 5.0.2 + */ + public function __construct(Item $item, Items $items, Type $type, Handler $handler) + { + $this->item = $item; + $this->items = $items; + $this->type = $type; + $this->handler = $handler; + } + + /** + * Upload a file, of a given file type and link it to an entity. + * + * @param string $guid The file type guid + * @param string $entity The entity guid + * @param string $target The target entity name + * + * @return void + * @throws \InvalidArgumentException If the file type is not valid. + * @throws \RuntimeException If there is an error during file upload. + * @since 5.0.2 + */ + public function upload(string $guid, string $entity, string $target): void + { + if (($fileType = $this->type->load($guid, $target)) === null) + { + throw new \InvalidArgumentException(Text::sprintf('File type not valid in %s area.', $target)); + } + + $details = $this->handler + ->setEnqueueError(false) + ->setLegalFormats($fileType['formats']) + ->getFile( + $fileType['field'], // The input field name + $fileType['type'], // The file type + $fileType['filter'], // The filter to use when uploading the file + $fileType['path'] // The path to the directory where the file must be placed + ); + + if ($details === null) + { + // Throw an exception if file details couldn't be retrieved + throw new \RuntimeException($this->handler->getErrors()); + } + + // store file in the file table + $this->item->set( + $this->modelFileDetails($details, $guid) + ); + } + + /** + * Delete a file of a given entity. + * + * @param string $guid The file guid + * @param string $entity The entity guid + * @param string $target The target entity name + * + * @return void + * @since 5.0.2 + */ + public function delete(string $guid, string $entity, string $target): void + { + + } + + /** + * model the file details to store in the file table + * + * @param array $details The uploaded file details. + * @param string $guid The file type guid + * @param string $entity The entity guid + * @param string $target The target entity name + * + * @return object + * @since 5.0.2 + */ + protected function modelFileDetails(array $details, string $guid, string $entity, string $target): object + { + return (object) [ + 'name' => 'soon', + 'file_type' => $guid, + 'ext' => 'me', + 'size_kb' => 45, + 'filepath' => $details['full_path'], + 'entity_type' => $target, + 'entity' => $guid, + 'guid' => $this->getGuid('file'), + ]; + } \ No newline at end of file diff --git a/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/settings.json b/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/settings.json new file mode 100644 index 0000000..33c6aac --- /dev/null +++ b/src/67a5e0ca-0ff0-4979-9b41-da0b09988016/settings.json @@ -0,0 +1,40 @@ +{ + "add_head": "0", + "add_licensing_template": "2", + "extends": "", + "guid": "67a5e0ca-0ff0-4979-9b41-da0b09988016", + "implements": null, + "load_selection": null, + "name": "Manager", + "power_version": "1.0.0", + "system_name": "Joomla.File.Manager", + "type": "final class", + "use_selection": { + "use_selection0": { + "use": "05744dd3-4030-4cf8-8dda-a93ab809b473", + "as": "Item" + }, + "use_selection1": { + "use": "7212e4db-371f-4cfd-8122-32e9bb100d83", + "as": "Items" + }, + "use_selection2": { + "use": "5acded67-0e3d-4c6b-a6ea-b533b076de0c", + "as": "default" + }, + "use_selection3": { + "use": "12a2a8de-a893-4dbb-a53d-b52de4f6cb0e", + "as": "default" + }, + "use_selection4": { + "use": "4144ad3b-2ad5-401f-af0c-a3d856c1e688", + "as": "default" + } + }, + "extendsinterfaces": null, + "namespace": "[[[NamespacePrefix]]]\\Joomla\\[[[ComponentNamespace]]].File.Manager", + "description": "File Manager Class\r\n\r\n@since 5.0.2", + "licensing_template": "\/**\r\n * @package Joomla.Component.Builder\r\n *\r\n * @created 3rd September, 2020\r\n * @author Llewellyn van der Merwe \r\n * @git Joomla Component Builder \r\n * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.\r\n * @license GNU General Public License version 2 or later; see LICENSE.txt\r\n *\/\r\n", + "head": "", + "composer": "" +} \ No newline at end of file diff --git a/src/884eca78-281f-4eab-b962-d97e355af16d/README.md b/src/884eca78-281f-4eab-b962-d97e355af16d/README.md new file mode 100644 index 0000000..80829ff --- /dev/null +++ b/src/884eca78-281f-4eab-b962-d97e355af16d/README.md @@ -0,0 +1,53 @@ +``` +██████╗ ██████╗ ██╗ ██╗███████╗██████╗ +██╔══██╗██╔═══██╗██║ ██║██╔════╝██╔══██╗ +██████╔╝██║ ██║██║ █╗ ██║█████╗ ██████╔╝ +██╔═══╝ ██║ ██║██║███╗██║██╔══╝ ██╔══██╗ +██║ ╚██████╔╝╚███╔███╔╝███████╗██║ ██║ +╚═╝ ╚═════╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝ +``` +# abstract class Factory (Details) +> namespace: **VDM\Joomla\Componentbuilder\File** +> extends: **ExtendingFactory** + +```uml +@startuml +abstract Factory #Orange { + # {static} createContainer() : Container +} + +note right of Factory::createContainer + Create a container object + + since: 3.2.2 + return: Container +end note + +@enduml +``` + +The Power feature in JCB allows you to write PHP classes and their implementations, making it easy to include them in your Joomla project. JCB handles linking, autoloading, namespacing, and folder structure creation for you. + +By using the SPK (Super Power Key) in your custom code (replacing the class name in your code with the SPK), JCB will automatically pull the power from the repository into your project. This makes it available in your JCB instance, allowing you to edit it and include the class in your generated Joomla component. + +JCB uses placeholders like [[[`NamespacePrefix`]]] and [[[`ComponentNamespace`]]] in namespacing to prevent collisions and improve reusability across different JCB systems. You can also set the **JCB powers path** globally or per component under the **Dynamic Integration** tab, providing flexibility and easy maintainability. + +To add this specific Power to your project in JCB: + +> simply use this SPK +``` +Super---884eca78_281f_4eab_b962_d97e355af16d---Power +``` +> remember to replace the `---` with `___` to activate this Power in your code + +--- +``` + ██╗ ██████╗██████╗ + ██║██╔════╝██╔══██╗ + ██║██║ ██████╔╝ +██ ██║██║ ██╔══██╗ +╚█████╔╝╚██████╗██████╔╝ + ╚════╝ ╚═════╝╚═════╝ +``` +> Build with [Joomla Component Builder](https://git.vdm.dev/joomla/Component-Builder) + diff --git a/src/884eca78-281f-4eab-b962-d97e355af16d/code.php b/src/884eca78-281f-4eab-b962-d97e355af16d/code.php new file mode 100644 index 0000000..85e7b43 --- /dev/null +++ b/src/884eca78-281f-4eab-b962-d97e355af16d/code.php @@ -0,0 +1,48 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\File; + + +use Joomla\DI\Container; +use VDM\Joomla\Service\Table; +use VDM\Joomla\Service\Database; +use VDM\Joomla\Service\Model; +use VDM\Joomla\Service\Data; +use VDM\Joomla\Componentbuilder\File\Service\File; +use VDM\Joomla\Interfaces\FactoryInterface; +use VDM\Joomla\Abstraction\Factory as ExtendingFactory; + + +/** + * File Factory + * + * @since 5.0.2 + */ +abstract class Factory extends ExtendingFactory implements FactoryInterface +{ + /** + * Create a container object + * + * @return Container + * @since 3.2.2 + */ + protected static function createContainer(): Container + { + return (new Container()) + ->registerServiceProvider(new Table()) + ->registerServiceProvider(new Database()) + ->registerServiceProvider(new Model()) + ->registerServiceProvider(new Data()) + ->registerServiceProvider(new File()); + } +} + diff --git a/src/884eca78-281f-4eab-b962-d97e355af16d/code.power b/src/884eca78-281f-4eab-b962-d97e355af16d/code.power new file mode 100644 index 0000000..7f08cac --- /dev/null +++ b/src/884eca78-281f-4eab-b962-d97e355af16d/code.power @@ -0,0 +1,15 @@ + /** + * Create a container object + * + * @return Container + * @since 3.2.2 + */ + protected static function createContainer(): Container + { + return (new Container()) + ->registerServiceProvider(new Table()) + ->registerServiceProvider(new Database()) + ->registerServiceProvider(new Model()) + ->registerServiceProvider(new Data()) + ->registerServiceProvider(new File()); + } \ No newline at end of file diff --git a/src/884eca78-281f-4eab-b962-d97e355af16d/settings.json b/src/884eca78-281f-4eab-b962-d97e355af16d/settings.json new file mode 100644 index 0000000..51d5c89 --- /dev/null +++ b/src/884eca78-281f-4eab-b962-d97e355af16d/settings.json @@ -0,0 +1,42 @@ +{ + "add_head": "1", + "add_licensing_template": "2", + "extends": "2e5bf608-de5c-4b00-a20d-47c26aa350d9", + "guid": "884eca78-281f-4eab-b962-d97e355af16d", + "implements": [ + "caf33c5d-858c-4f9a-894f-ab302ec5445a" + ], + "load_selection": null, + "name": "Factory", + "power_version": "1.0.0", + "system_name": "JCB.File.Factory", + "type": "abstract class", + "use_selection": { + "use_selection0": { + "use": "19b2ba92-1655-4384-acfb-979c80de8b6d", + "as": "default" + }, + "use_selection1": { + "use": "4815e1c7-a433-443d-a112-d1e03d7df84b", + "as": "default" + }, + "use_selection2": { + "use": "2dcedd6c-c95b-4a37-9cac-95d28faedca3", + "as": "default" + }, + "use_selection3": { + "use": "a5daf189-3345-4b13-8716-c51f686f545b", + "as": "default" + }, + "use_selection4": { + "use": "202ccd9e-dfcf-4cde-a0ce-bde1fd27f088", + "as": "default" + } + }, + "extendsinterfaces": null, + "namespace": "[[[NamespacePrefix]]]\\Joomla\\[[[ComponentNamespace]]].File.Factory", + "description": "File Factory\r\n\r\n@since 5.0.2", + "licensing_template": "\/**\r\n * @package Joomla.Component.Builder\r\n *\r\n * @created 4th September, 2022\r\n * @author Llewellyn van der Merwe \r\n * @git Joomla Component Builder \r\n * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.\r\n * @license GNU General Public License version 2 or later; see LICENSE.txt\r\n *\/\r\n", + "head": "use Joomla\\DI\\Container;", + "composer": "" +} \ No newline at end of file diff --git a/src/bfd1d6d5-56c1-4fe9-9fee-1c5910e1f5d8/code.php b/src/bfd1d6d5-56c1-4fe9-9fee-1c5910e1f5d8/code.php index f01e9a8..b85bed2 100644 --- a/src/bfd1d6d5-56c1-4fe9-9fee-1c5910e1f5d8/code.php +++ b/src/bfd1d6d5-56c1-4fe9-9fee-1c5910e1f5d8/code.php @@ -1546,7 +1546,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], 'metakey' => [ @@ -2267,7 +2267,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -2907,7 +2907,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -2987,7 +2987,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -3403,7 +3403,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -4891,7 +4891,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -5483,7 +5483,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -6075,7 +6075,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -6235,7 +6235,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -6395,7 +6395,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -6955,7 +6955,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -7179,7 +7179,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -7307,7 +7307,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -7451,7 +7451,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -7499,7 +7499,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -7659,7 +7659,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -7883,7 +7883,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -7963,7 +7963,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -8379,7 +8379,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -8635,7 +8635,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -8731,7 +8731,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -8779,7 +8779,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -8987,7 +8987,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -9115,7 +9115,7 @@ final class Table extends BaseTable implements Tableinterface 'db' => [ 'type' => 'TEXT', 'default' => 'EMPTY', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'unique_key' => false, 'key' => false, ], @@ -9131,7 +9131,7 @@ final class Table extends BaseTable implements Tableinterface 'db' => [ 'type' => 'TINYINT(1)', 'default' => '0', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'unique_key' => false, 'key' => true, ], @@ -9211,7 +9211,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -9437,7 +9437,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -9485,7 +9485,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -9533,7 +9533,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -9581,7 +9581,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -9629,7 +9629,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -9677,7 +9677,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -9725,7 +9725,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -9773,7 +9773,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -9821,7 +9821,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -9869,7 +9869,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10013,7 +10013,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10061,7 +10061,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10125,7 +10125,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10221,7 +10221,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10253,7 +10253,7 @@ final class Table extends BaseTable implements Tableinterface 'db' => [ 'type' => 'TEXT', 'default' => 'EMPTY', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'unique_key' => false, 'key' => false, ], @@ -10269,7 +10269,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10317,7 +10317,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10365,7 +10365,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10413,7 +10413,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10461,7 +10461,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10573,7 +10573,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10653,7 +10653,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10701,7 +10701,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10813,7 +10813,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10861,7 +10861,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -10909,7 +10909,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], @@ -11021,7 +11021,7 @@ final class Table extends BaseTable implements Tableinterface 'type' => 'INT(10) unsigned', 'default' => '0', 'key' => true, - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', ], ], ], diff --git a/src/d46c4667-378b-49e8-9782-ffb28d92415a/README.md b/src/d46c4667-378b-49e8-9782-ffb28d92415a/README.md new file mode 100644 index 0000000..69d8f3f --- /dev/null +++ b/src/d46c4667-378b-49e8-9782-ffb28d92415a/README.md @@ -0,0 +1,60 @@ +``` +██████╗ ██████╗ ██╗ ██╗███████╗██████╗ +██╔══██╗██╔═══██╗██║ ██║██╔════╝██╔══██╗ +██████╔╝██║ ██║██║ █╗ ██║█████╗ ██████╔╝ +██╔═══╝ ██║ ██║██║███╗██║██╔══╝ ██╔══██╗ +██║ ╚██████╔╝╚███╔███╔╝███████╗██║ ██║ +╚═╝ ╚═════╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝ +``` +# final class Display (Details) +> namespace: **VDM\Joomla\Componentbuilder\File** + +```uml +@startuml +class Display << (F,LightGreen) >> #RoyalBlue { + # Items $items + + __construct(Items $items) + + get(string $entity, string $target) : ?array +} + +note right of Display::__construct + Constructor. + + since: 5.0.2 +end note + +note right of Display::get + Get the file data that belong to this entity + + since: 5.0.2 + return: ?array +end note + +@enduml +``` + +The Power feature in JCB allows you to write PHP classes and their implementations, making it easy to include them in your Joomla project. JCB handles linking, autoloading, namespacing, and folder structure creation for you. + +By using the SPK (Super Power Key) in your custom code (replacing the class name in your code with the SPK), JCB will automatically pull the power from the repository into your project. This makes it available in your JCB instance, allowing you to edit it and include the class in your generated Joomla component. + +JCB uses placeholders like [[[`NamespacePrefix`]]] and [[[`ComponentNamespace`]]] in namespacing to prevent collisions and improve reusability across different JCB systems. You can also set the **JCB powers path** globally or per component under the **Dynamic Integration** tab, providing flexibility and easy maintainability. + +To add this specific Power to your project in JCB: + +> simply use this SPK +``` +Super---d46c4667_378b_49e8_9782_ffb28d92415a---Power +``` +> remember to replace the `---` with `___` to activate this Power in your code + +--- +``` + ██╗ ██████╗██████╗ + ██║██╔════╝██╔══██╗ + ██║██║ ██████╔╝ +██ ██║██║ ██╔══██╗ +╚█████╔╝╚██████╗██████╔╝ + ╚════╝ ╚═════╝╚═════╝ +``` +> Build with [Joomla Component Builder](https://git.vdm.dev/joomla/Component-Builder) + diff --git a/src/d46c4667-378b-49e8-9782-ffb28d92415a/code.php b/src/d46c4667-378b-49e8-9782-ffb28d92415a/code.php new file mode 100644 index 0000000..864ba67 --- /dev/null +++ b/src/d46c4667-378b-49e8-9782-ffb28d92415a/code.php @@ -0,0 +1,73 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\File; + + +use VDM\Joomla\Interfaces\Data\ItemsInterface as Items; + + +/** + * File Display Class + * + * @since 5.0.2 + */ +final class Display +{ + /** + * The Items Class. + * + * @var Items + * @since 5.0.2 + */ + protected Items $items; + + /** + * Constructor. + * + * @param Items $items The Items Class. + * + * @since 5.0.2 + */ + public function __construct(Items $items) + { + $this->items = $items; + } + + /** + * Get the file data that belong to this entity + * + * @param string $entity The entity guid + * @param string $target The target entity name + * + * @return array|null + * @since 5.0.2 + */ + public function get(string $entity, string $target): ?array + { + if (($files = $this->items->table->('file')->get([$entity], 'entity')) !== null) + { + foreach ($files as $n => $file) + { + if ($file->entity_type !== $target) + { + unset($files[$n]); + } + } + + // If the $files array is empty, return null + return !empty($files) ? $files : null; + } + + return null; + } +} + diff --git a/src/d46c4667-378b-49e8-9782-ffb28d92415a/code.power b/src/d46c4667-378b-49e8-9782-ffb28d92415a/code.power new file mode 100644 index 0000000..da9dfb3 --- /dev/null +++ b/src/d46c4667-378b-49e8-9782-ffb28d92415a/code.power @@ -0,0 +1,47 @@ + /** + * The Items Class. + * + * @var Items + * @since 5.0.2 + */ + protected Items $items; + + /** + * Constructor. + * + * @param Items $items The Items Class. + * + * @since 5.0.2 + */ + public function __construct(Items $items) + { + $this->items = $items; + } + + /** + * Get the file data that belong to this entity + * + * @param string $entity The entity guid + * @param string $target The target entity name + * + * @return array|null + * @since 5.0.2 + */ + public function get(string $entity, string $target): ?array + { + if (($files = $this->items->table->('file')->get([$entity], 'entity')) !== null) + { + foreach ($files as $n => $file) + { + if ($file->entity_type !== $target) + { + unset($files[$n]); + } + } + + // If the $files array is empty, return null + return !empty($files) ? $files : null; + } + + return null; + } \ No newline at end of file diff --git a/src/d46c4667-378b-49e8-9782-ffb28d92415a/settings.json b/src/d46c4667-378b-49e8-9782-ffb28d92415a/settings.json new file mode 100644 index 0000000..4fea6d7 --- /dev/null +++ b/src/d46c4667-378b-49e8-9782-ffb28d92415a/settings.json @@ -0,0 +1,24 @@ +{ + "add_head": "0", + "add_licensing_template": "2", + "extends": "", + "guid": "d46c4667-378b-49e8-9782-ffb28d92415a", + "implements": null, + "load_selection": null, + "name": "Display", + "power_version": "1.0.0", + "system_name": "Joomla.File.Display", + "type": "final class", + "use_selection": { + "use_selection0": { + "use": "7212e4db-371f-4cfd-8122-32e9bb100d83", + "as": "Items" + } + }, + "extendsinterfaces": null, + "namespace": "[[[NamespacePrefix]]]\\Joomla\\[[[ComponentNamespace]]].File.Display", + "description": "File Display Class\r\n\r\n@since 5.0.2", + "licensing_template": "\/**\r\n * @package Joomla.Component.Builder\r\n *\r\n * @created 3rd September, 2020\r\n * @author Llewellyn van der Merwe \r\n * @git Joomla Component Builder \r\n * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.\r\n * @license GNU General Public License version 2 or later; see LICENSE.txt\r\n *\/\r\n", + "head": "", + "composer": "" +} \ No newline at end of file diff --git a/src/d7600b43-771a-4747-9f5d-952765721799/README.md b/src/d7600b43-771a-4747-9f5d-952765721799/README.md new file mode 100644 index 0000000..2ac2ed9 --- /dev/null +++ b/src/d7600b43-771a-4747-9f5d-952765721799/README.md @@ -0,0 +1,88 @@ +``` +██████╗ ██████╗ ██╗ ██╗███████╗██████╗ +██╔══██╗██╔═══██╗██║ ██║██╔════╝██╔══██╗ +██████╔╝██║ ██║██║ █╗ ██║█████╗ ██████╔╝ +██╔═══╝ ██║ ██║██║███╗██║██╔══╝ ██╔══██╗ +██║ ╚██████╔╝╚███╔███╔╝███████╗██║ ██║ +╚═╝ ╚═════╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝ +``` +# abstract class UploadHelper (Details) +> namespace: **VDM\Joomla\Utilities** + +```uml +@startuml +abstract UploadHelper #Orange { + + {static} get(string $field, string $type, ...) : ?array + + {static} getError(bool $toString = false) : array|string + # {static} check(array $upload, string $type) : array|null + # {static} remove(string $fullPath) : boolean + # {static} setError(string $message) : void +} + +note right of UploadHelper::get + Get file/files from a HTTP upload. + + since: 3.0.11 + return: ?array + + arguments: + string $field + string $type + string $filter = null + string $path = null +end note + +note right of UploadHelper::getError + Get the errors + + since: 3.0.11 + return: array|string +end note + +note right of UploadHelper::check + Check a file and verifies it as a allowed file format file + + return: array|null +end note + +note right of UploadHelper::remove + Clean up temporary uploaded file + + return: boolean +end note + +note right of UploadHelper::setError + Set the errors + + since: 3.0.11 + return: void +end note + +@enduml +``` + +The Power feature in JCB allows you to write PHP classes and their implementations, making it easy to include them in your Joomla project. JCB handles linking, autoloading, namespacing, and folder structure creation for you. + +By using the SPK (Super Power Key) in your custom code (replacing the class name in your code with the SPK), JCB will automatically pull the power from the repository into your project. This makes it available in your JCB instance, allowing you to edit it and include the class in your generated Joomla component. + +JCB uses placeholders like [[[`NamespacePrefix`]]] and [[[`ComponentNamespace`]]] in namespacing to prevent collisions and improve reusability across different JCB systems. You can also set the **JCB powers path** globally or per component under the **Dynamic Integration** tab, providing flexibility and easy maintainability. + +To add this specific Power to your project in JCB: + +> simply use this SPK +``` +Super---d7600b43_771a_4747_9f5d_952765721799---Power +``` +> remember to replace the `---` with `___` to activate this Power in your code + +--- +``` + ██╗ ██████╗██████╗ + ██║██╔════╝██╔══██╗ + ██║██║ ██████╔╝ +██ ██║██║ ██╔══██╗ +╚█████╔╝╚██████╗██████╔╝ + ╚════╝ ╚═════╝╚═════╝ +``` +> Build with [Joomla Component Builder](https://git.vdm.dev/joomla/Component-Builder) + diff --git a/src/d7600b43-771a-4747-9f5d-952765721799/code.php b/src/d7600b43-771a-4747-9f5d-952765721799/code.php new file mode 100644 index 0000000..af72277 --- /dev/null +++ b/src/d7600b43-771a-4747-9f5d-952765721799/code.php @@ -0,0 +1,312 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Utilities; + + +use Joomla\CMS\Factory; +use Joomla\CMS\Language\Text; +use Joomla\CMS\Filesystem\File; +use Joomla\CMS\Filesystem\Folder; +use Joomla\CMS\Filesystem\Path; +use VDM\Joomla\Utilities\Component\Helper; + + +/** + * Upload Helper + * + * @since 3.0.11 + */ +abstract class UploadHelper +{ + /** + * True to use streams + * + * @var bool + * + * @since 3.0.11 + */ + public static bool $useStreams = false; + + /** + * Allow the upload of unsafe files + * + * @var bool + * + * @since 3.0.11 + */ + public static bool $allowUnsafe = false; + + /** + * Options to InputFilter::isSafeFile + * + * @var array + * + * @since 3.0.11 + */ + public static array $safeFileOptions = []; + + /** + * Set the error behavior + * + * @var bool + * + * @since 3.0.11 + */ + public static bool $enqueueError = true; + + /** + * Legal Formats + * + * @var array + * + * @since 5.0.3 + */ + public static array $legalFormats = []; + + /** + * Errors + * + * @var array + * + * @since 3.0.11 + */ + protected static array $errors = []; + + /** + * Get file/files from a HTTP upload. + * + * @param string $field The input field name + * @param string $type The file type + * @param string|null $filter The filter to use when uploading the file + * @param string|null $path The path to the directory where the file must be placed + * + * @return array|null File details or false on failure. + * @since 3.0.11 + */ + public static function get(string $field, string $type, string $filter = null, string $path = null): ?array + { + // Get the uploaded file information. + $input = Factory::getApplication()->input; + + // set the default filter + if (empty($filter)) + { + $filter = 'array'; + } + // if raw then also unsafe + // see: https://github.com/joomla/joomla-cms/blob/4.1-dev/administrator/components/com_installer/src/Model/InstallModel.php#L259 + elseif ($filter === 'raw') + { + static::$allowUnsafe = true; + } + + // check if we have a file destination name in the field name + $name = null; + if (strpos($field, ':') !== false) + { + list($field, $name) = explode(':', $field); + } + + // See JInputFiles::get. + $userfile = $input->files->get($field, null, $filter); + + // Make sure that file uploads are enabled in php. + if (!(bool) ini_get('file_uploads')) + { + static::setError(Text::_('COM_COMPONENTBUILDER_WARNING_UPLOAD_ERROR')); + + return null; + } + + // If there is no uploaded file, we have a problem... + if (!is_array($userfile)) + { + static::setError(Text::_('COM_COMPONENTBUILDER_NO_UPLOAD_SELECTED')); + + return null; + } + + // Is the PHP tmp directory missing? + if ($userfile['error'] && ($userfile['error'] == UPLOAD_ERR_NO_TMP_DIR)) + { + static::setError(Text::_('COM_COMPONENTBUILDER_THERE_WAS_AN_ERROR_UPLOADING_TO_THE_SERVER') . '
' . Text::_('COM_COMPONENTBUILDER_THE_PHP_TEMPORARY_FOLDER_IS_NOT_SET')); + + return null; + } + + // Is the max upload size too small in php.ini? + if ($userfile['error'] && ($userfile['error'] == UPLOAD_ERR_INI_SIZE)) + { + static::setError(Text::_('COM_COMPONENTBUILDER_THERE_WAS_AN_ERROR_UPLOADING_TO_THE_SERVER') . '
' . Text::_('COM_COMPONENTBUILDER_YOUR_FILE_WAS_IS_LARGER_THAN_THE_ALLOWED_SIZE')); + + return null; + } + + // Check if there was a different problem uploading the file. + if ($userfile['error'] || $userfile['size'] < 1) + { + static::setError(Text::_('COM_COMPONENTBUILDER_THERE_WAS_AN_ERROR_UPLOADING_TO_THE_SERVER')); + + return null; + } + + // check if a path was passed and exist + if (is_string($path) && Folder::create($path)) + { + // set the path + $userfile['path'] = $path; + } + else + { + // get the Joomla config class + $config = Factory::getConfig(); + // set the path + $userfile['path'] = $config->get('tmp_path'); + } + + // set the random part of the name + $userfile['random'] = StringHelper::random(12); + + // set the file name + if (empty($name)) + { + // set the file name + $userfile['file_name'] = $userfile['random'] . $userfile['name']; + } + else + { + // check that his name has file format + if (is_string($name) && strpos($name, '.') === false) + { + $name = $name . '.' . MimeHelper::extension(null, $userfile['type']); + } + $userfile['file_name'] = $name; + } + + // set full path + $userfile['full_path'] = $userfile['path'] . '/' . $userfile['file_name']; + + // Upload the file. + if (File::upload($userfile['tmp_name'], $userfile['full_path'], static::$useStreams, static::$allowUnsafe)) + { + // Check that this is a valid file + return static::check($userfile, $type); + } + + return null; + } + + /** + * Get the errors + * + * @param bool $toString The option to return errors as a string + * + * @return array|string + * @since 3.0.11 + */ + public static function getError($toString = false) + { + if ($toString) + { + return implode(' ' . PHP_EOL, static::$errors); + } + return static::$errors; + } + + /** + * Check a file and verifies it as a allowed file format file + * + * @param array $upload The uploaded details array + * @param string $type The file type + * + * @return array|null of elements + * + */ + protected static function check(array $upload, string $type)? ?array + { + // Default formats + $formats = MimeHelper::extensions($type); + + // Clean the path + $upload_path = Path::clean($upload['full_path']); + + // Get file extension/format + $format = MimeHelper::extension($upload_path); + + // Legal file formats + $legal = []; + + // check if the file format is even in the list + if (in_array($format, $formats)) + { + // get allowed formats + $legal_formats = (array) Helper::getParams()->get($type . '_formats', []); + $legal = array_values(array_unique(array_merge($legal_formats, static::$legalFormats))) + } + + // check the extension + if (!in_array($format, $legal)) + { + // Cleanup the import file + static::remove($upload['full_path']); + + static::setError(Text::_('COM_COMPONENTBUILDER_UPLOAD_IS_NOT_A_VALID_TYPE')); + + return null; + } + + return $upload; + } + + /** + * Clean up temporary uploaded file + * + * @param string $fullPath The full path of the uploaded file + * + * @return boolean True on success + * + */ + protected static function remove($fullPath) + { + // Is the package file a valid file? + if (is_file($fullPath)) + { + File::delete($fullPath); + } + elseif (is_file(Path::clean($fullPath))) + { + // It might also be just a base filename + File::delete(Path::clean($fullPath)); + } + } + + /** + * Set the errors + * + * @param string $message The error message + * + * @return void + * @since 3.0.11 + */ + protected static function setError($message) + { + if (static::$enqueueError) + { + Factory::getApplication()->enqueueMessage($message, 'error'); + } + else + { + static::$errors[] = $message; + } + } +} + diff --git a/src/d7600b43-771a-4747-9f5d-952765721799/code.power b/src/d7600b43-771a-4747-9f5d-952765721799/code.power new file mode 100644 index 0000000..a399991 --- /dev/null +++ b/src/d7600b43-771a-4747-9f5d-952765721799/code.power @@ -0,0 +1,281 @@ + /** + * True to use streams + * + * @var bool + * + * @since 3.0.11 + */ + public static bool $useStreams = false; + + /** + * Allow the upload of unsafe files + * + * @var bool + * + * @since 3.0.11 + */ + public static bool $allowUnsafe = false; + + /** + * Options to InputFilter::isSafeFile + * + * @var array + * + * @since 3.0.11 + */ + public static array $safeFileOptions = []; + + /** + * Set the error behavior + * + * @var bool + * + * @since 3.0.11 + */ + public static bool $enqueueError = true; + + /** + * Legal Formats + * + * @var array + * + * @since 5.0.3 + */ + public static array $legalFormats = []; + + /** + * Errors + * + * @var array + * + * @since 3.0.11 + */ + protected static array $errors = []; + + /** + * Get file/files from a HTTP upload. + * + * @param string $field The input field name + * @param string $type The file type + * @param string|null $filter The filter to use when uploading the file + * @param string|null $path The path to the directory where the file must be placed + * + * @return array|null File details or false on failure. + * @since 3.0.11 + */ + public static function get(string $field, string $type, string $filter = null, string $path = null): ?array + { + // Get the uploaded file information. + $input = Factory::getApplication()->input; + + // set the default filter + if (empty($filter)) + { + $filter = 'array'; + } + // if raw then also unsafe + // see: https://github.com/joomla/joomla-cms/blob/4.1-dev/administrator/components/com_installer/src/Model/InstallModel.php#L259 + elseif ($filter === 'raw') + { + static::$allowUnsafe = true; + } + + // check if we have a file destination name in the field name + $name = null; + if (strpos($field, ':') !== false) + { + list($field, $name) = explode(':', $field); + } + + // See JInputFiles::get. + $userfile = $input->files->get($field, null, $filter); + + // Make sure that file uploads are enabled in php. + if (!(bool) ini_get('file_uploads')) + { + static::setError(Text::_('Warning, upload error.')); + + return null; + } + + // If there is no uploaded file, we have a problem... + if (!is_array($userfile)) + { + static::setError(Text::_('No upload selected')); + + return null; + } + + // Is the PHP tmp directory missing? + if ($userfile['error'] && ($userfile['error'] == UPLOAD_ERR_NO_TMP_DIR)) + { + static::setError(Text::_('There was an error uploading to the server.') . '
' . Text::_('The PHP temporary folder is not set.')); + + return null; + } + + // Is the max upload size too small in php.ini? + if ($userfile['error'] && ($userfile['error'] == UPLOAD_ERR_INI_SIZE)) + { + static::setError(Text::_('There was an error uploading to the server.') . '
' . Text::_('Your file was is larger than the allowed size.')); + + return null; + } + + // Check if there was a different problem uploading the file. + if ($userfile['error'] || $userfile['size'] < 1) + { + static::setError(Text::_('There was an error uploading to the server.')); + + return null; + } + + // check if a path was passed and exist + if (is_string($path) && Folder::create($path)) + { + // set the path + $userfile['path'] = $path; + } + else + { + // get the Joomla config class + $config = Factory::getConfig(); + // set the path + $userfile['path'] = $config->get('tmp_path'); + } + + // set the random part of the name + $userfile['random'] = StringHelper::random(12); + + // set the file name + if (empty($name)) + { + // set the file name + $userfile['file_name'] = $userfile['random'] . $userfile['name']; + } + else + { + // check that his name has file format + if (is_string($name) && strpos($name, '.') === false) + { + $name = $name . '.' . MimeHelper::extension(null, $userfile['type']); + } + $userfile['file_name'] = $name; + } + + // set full path + $userfile['full_path'] = $userfile['path'] . '/' . $userfile['file_name']; + + // Upload the file. + if (File::upload($userfile['tmp_name'], $userfile['full_path'], static::$useStreams, static::$allowUnsafe)) + { + // Check that this is a valid file + return static::check($userfile, $type); + } + + return null; + } + + /** + * Get the errors + * + * @param bool $toString The option to return errors as a string + * + * @return array|string + * @since 3.0.11 + */ + public static function getError($toString = false) + { + if ($toString) + { + return implode(' ' . PHP_EOL, static::$errors); + } + return static::$errors; + } + + /** + * Check a file and verifies it as a allowed file format file + * + * @param array $upload The uploaded details array + * @param string $type The file type + * + * @return array|null of elements + * + */ + protected static function check(array $upload, string $type)? ?array + { + // Default formats + $formats = MimeHelper::extensions($type); + + // Clean the path + $upload_path = Path::clean($upload['full_path']); + + // Get file extension/format + $format = MimeHelper::extension($upload_path); + + // Legal file formats + $legal = []; + + // check if the file format is even in the list + if (in_array($format, $formats)) + { + // get allowed formats + $legal_formats = (array) Helper::getParams()->get($type . '_formats', []); + $legal = array_values(array_unique(array_merge($legal_formats, static::$legalFormats))) + } + + // check the extension + if (!in_array($format, $legal)) + { + // Cleanup the import file + static::remove($upload['full_path']); + + static::setError(Text::_('Upload is not a valid type.')); + + return null; + } + + return $upload; + } + + /** + * Clean up temporary uploaded file + * + * @param string $fullPath The full path of the uploaded file + * + * @return boolean True on success + * + */ + protected static function remove($fullPath) + { + // Is the package file a valid file? + if (is_file($fullPath)) + { + File::delete($fullPath); + } + elseif (is_file(Path::clean($fullPath))) + { + // It might also be just a base filename + File::delete(Path::clean($fullPath)); + } + } + + /** + * Set the errors + * + * @param string $message The error message + * + * @return void + * @since 3.0.11 + */ + protected static function setError($message) + { + if (static::$enqueueError) + { + Factory::getApplication()->enqueueMessage($message, 'error'); + } + else + { + static::$errors[] = $message; + } + } \ No newline at end of file diff --git a/src/d7600b43-771a-4747-9f5d-952765721799/settings.json b/src/d7600b43-771a-4747-9f5d-952765721799/settings.json new file mode 100644 index 0000000..bdc5840 --- /dev/null +++ b/src/d7600b43-771a-4747-9f5d-952765721799/settings.json @@ -0,0 +1,31 @@ +{ + "add_head": "1", + "add_licensing_template": "2", + "extends": "", + "guid": "d7600b43-771a-4747-9f5d-952765721799", + "implements": null, + "load_selection": { + "load_selection0": { + "load": "f11dc790-713e-4706-9a85-a318ed3ad56e" + }, + "load_selection1": { + "load": "1f28cb53-60d9-4db1-b517-3c7dc6b429ef" + } + }, + "name": "UploadHelper", + "power_version": "1.0.0", + "system_name": "Utilities UploadHelper", + "type": "abstract class", + "use_selection": { + "use_selection0": { + "use": "640b5352-fb09-425f-a26e-cd44eda03f15", + "as": "default" + } + }, + "extendsinterfaces": null, + "namespace": "[[[NamespacePrefix]]]\\Joomla\\Utilities.UploadHelper", + "description": "Upload Helper\r\n\r\n@since 3.0.11", + "licensing_template": "\/**\r\n * @package Joomla.Component.Builder\r\n *\r\n * @created 3rd September, 2020\r\n * @author Llewellyn van der Merwe \r\n * @git Joomla Component Builder \r\n * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.\r\n * @license GNU General Public License version 2 or later; see LICENSE.txt\r\n *\/\r\n", + "head": "use Joomla\\CMS\\Factory;\r\nuse Joomla\\CMS\\Language\\Text;\r\nuse Joomla\\CMS\\Filesystem\\File;\r\nuse Joomla\\CMS\\Filesystem\\Folder;\r\nuse Joomla\\CMS\\Filesystem\\Path;", + "composer": "" +} \ No newline at end of file diff --git a/src/e0f6ddbe-2a35-4537-942c-faff2ebd04f6/code.php b/src/e0f6ddbe-2a35-4537-942c-faff2ebd04f6/code.php index 46227ed..fe497f6 100644 --- a/src/e0f6ddbe-2a35-4537-942c-faff2ebd04f6/code.php +++ b/src/e0f6ddbe-2a35-4537-942c-faff2ebd04f6/code.php @@ -65,7 +65,7 @@ abstract class BaseTable implements Tableinterface 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '0', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'comment' => 'FK to the #__assets table.' ] ], @@ -80,7 +80,7 @@ abstract class BaseTable implements Tableinterface 'db' => [ 'type' => 'INT(11)', 'default' => '0', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'published' => [ @@ -94,7 +94,7 @@ abstract class BaseTable implements Tableinterface 'db' => [ 'type' => 'TINYINT(3)', 'default' => '1', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'key' => true, 'key_name' => 'state' ] @@ -110,7 +110,7 @@ abstract class BaseTable implements Tableinterface 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '0', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'key' => true, 'key_name' => 'modifiedby' ] @@ -126,7 +126,7 @@ abstract class BaseTable implements Tableinterface 'db' => [ 'type' => 'DATETIME', 'default' => '0000-00-00 00:00:00', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'created_by' => [ @@ -140,7 +140,7 @@ abstract class BaseTable implements Tableinterface 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '0', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'key' => true, 'key_name' => 'createdby' ] @@ -156,7 +156,7 @@ abstract class BaseTable implements Tableinterface 'db' => [ 'type' => 'DATETIME', 'default' => '0000-00-00 00:00:00', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'checked_out' => [ @@ -170,7 +170,7 @@ abstract class BaseTable implements Tableinterface 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '0', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'key' => true, 'key_name' => 'checkout' ] @@ -186,7 +186,7 @@ abstract class BaseTable implements Tableinterface 'db' => [ 'type' => 'DATETIME', 'default' => '0000-00-00 00:00:00', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'hits' => [ @@ -200,7 +200,7 @@ abstract class BaseTable implements Tableinterface 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '0', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'version' => [ @@ -214,7 +214,7 @@ abstract class BaseTable implements Tableinterface 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '1', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'params' => [ diff --git a/src/e0f6ddbe-2a35-4537-942c-faff2ebd04f6/code.power b/src/e0f6ddbe-2a35-4537-942c-faff2ebd04f6/code.power index b114786..f2b516a 100644 --- a/src/e0f6ddbe-2a35-4537-942c-faff2ebd04f6/code.power +++ b/src/e0f6ddbe-2a35-4537-942c-faff2ebd04f6/code.power @@ -41,7 +41,7 @@ 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '0', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'comment' => 'FK to the #__assets table.' ] ], @@ -56,7 +56,7 @@ 'db' => [ 'type' => 'INT(11)', 'default' => '0', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'published' => [ @@ -70,7 +70,7 @@ 'db' => [ 'type' => 'TINYINT(3)', 'default' => '1', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'key' => true, 'key_name' => 'state' ] @@ -86,7 +86,7 @@ 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '0', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'key' => true, 'key_name' => 'modifiedby' ] @@ -102,7 +102,7 @@ 'db' => [ 'type' => 'DATETIME', 'default' => '0000-00-00 00:00:00', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'created_by' => [ @@ -116,7 +116,7 @@ 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '0', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'key' => true, 'key_name' => 'createdby' ] @@ -132,7 +132,7 @@ 'db' => [ 'type' => 'DATETIME', 'default' => '0000-00-00 00:00:00', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'checked_out' => [ @@ -146,7 +146,7 @@ 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '0', - 'null_switch' => 'NOT NULL', + 'null_switch' => 'NULL', 'key' => true, 'key_name' => 'checkout' ] @@ -162,7 +162,7 @@ 'db' => [ 'type' => 'DATETIME', 'default' => '0000-00-00 00:00:00', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'hits' => [ @@ -176,7 +176,7 @@ 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '0', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'version' => [ @@ -190,7 +190,7 @@ 'db' => [ 'type' => 'INT(10) unsigned', 'default' => '1', - 'null_switch' => 'NOT NULL' + 'null_switch' => 'NULL' ] ], 'params' => [ diff --git a/src/f11dc790-713e-4706-9a85-a318ed3ad56e/README.md b/src/f11dc790-713e-4706-9a85-a318ed3ad56e/README.md index fdf9849..69b9361 100644 --- a/src/f11dc790-713e-4706-9a85-a318ed3ad56e/README.md +++ b/src/f11dc790-713e-4706-9a85-a318ed3ad56e/README.md @@ -7,7 +7,7 @@ ╚═╝ ╚═════╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝ ``` # abstract class MimeHelper (Details) -> namespace: **TrueChristianSermon\Joomla\Utilities** +> namespace: **VDM\Joomla\Utilities** ```uml @startuml diff --git a/src/f11dc790-713e-4706-9a85-a318ed3ad56e/code.php b/src/f11dc790-713e-4706-9a85-a318ed3ad56e/code.php index 9bcafd4..2fc06df 100644 --- a/src/f11dc790-713e-4706-9a85-a318ed3ad56e/code.php +++ b/src/f11dc790-713e-4706-9a85-a318ed3ad56e/code.php @@ -9,7 +9,7 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -namespace TrueChristianSermon\Joomla\Utilities; +namespace VDM\Joomla\Utilities; /** diff --git a/super-powers.json b/super-powers.json index d36b97e..aa239d1 100644 --- a/super-powers.json +++ b/super-powers.json @@ -76,6 +76,17 @@ "spk": "Super---1198aecf_84c6_45d2_aea8_d531aa4afdfa---Power", "guid": "1198aecf-84c6-45d2-aea8-d531aa4afdfa" }, + "12a2a8de-a893-4dbb-a53d-b52de4f6cb0e": { + "name": "Type", + "type": "final class", + "namespace": "VDM\\Joomla\\Componentbuilder\\File", + "code": "src\/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e\/code.php", + "power": "src\/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e\/code.power", + "settings": "src\/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e\/settings.json", + "path": "src\/12a2a8de-a893-4dbb-a53d-b52de4f6cb0e", + "spk": "Super---12a2a8de_a893_4dbb_a53d_b52de4f6cb0e---Power", + "guid": "12a2a8de-a893-4dbb-a53d-b52de4f6cb0e" + }, "13c2cac1-a70d-42d7-99fc-eb7ac3443069": { "name": "ClassHelper", "type": "abstract class", @@ -153,6 +164,17 @@ "spk": "Super---1f28cb53_60d9_4db1_b517_3c7dc6b429ef---Power", "guid": "1f28cb53-60d9-4db1-b517-3c7dc6b429ef" }, + "202ccd9e-dfcf-4cde-a0ce-bde1fd27f088": { + "name": "File", + "type": "class", + "namespace": "VDM\\Joomla\\Componentbuilder\\File\\Service", + "code": "src\/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088\/code.php", + "power": "src\/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088\/code.power", + "settings": "src\/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088\/settings.json", + "path": "src\/202ccd9e-dfcf-4cde-a0ce-bde1fd27f088", + "spk": "Super---202ccd9e_dfcf_4cde_a0ce_bde1fd27f088---Power", + "guid": "202ccd9e-dfcf-4cde-a0ce-bde1fd27f088" + }, "215b35ac-1b26-4838-bbcf-d1fdbbd9353f": { "name": "InArray", "type": "trait", @@ -274,6 +296,17 @@ "spk": "Super---3fc72954_a303_4cac_b53c_554be38b85e7---Power", "guid": "3fc72954-a303-4cac-b53c-554be38b85e7" }, + "4144ad3b-2ad5-401f-af0c-a3d856c1e688": { + "name": "Handler", + "type": "final class", + "namespace": "VDM\\Joomla\\Componentbuilder\\File", + "code": "src\/4144ad3b-2ad5-401f-af0c-a3d856c1e688\/code.php", + "power": "src\/4144ad3b-2ad5-401f-af0c-a3d856c1e688\/code.power", + "settings": "src\/4144ad3b-2ad5-401f-af0c-a3d856c1e688\/settings.json", + "path": "src\/4144ad3b-2ad5-401f-af0c-a3d856c1e688", + "spk": "Super---4144ad3b_2ad5_401f_af0c_a3d856c1e688---Power", + "guid": "4144ad3b-2ad5-401f-af0c-a3d856c1e688" + }, "43134867-5cb8-4280-9be8-309fd2fd135f": { "name": "ActiveRegistry", "type": "abstract class", @@ -483,6 +516,17 @@ "spk": "Super---65a0f81a_14fc_4870_9382_b8d830b19937---Power", "guid": "65a0f81a-14fc-4870-9382-b8d830b19937" }, + "67a5e0ca-0ff0-4979-9b41-da0b09988016": { + "name": "Manager", + "type": "final class", + "namespace": "VDM\\Joomla\\Componentbuilder\\File", + "code": "src\/67a5e0ca-0ff0-4979-9b41-da0b09988016\/code.php", + "power": "src\/67a5e0ca-0ff0-4979-9b41-da0b09988016\/code.power", + "settings": "src\/67a5e0ca-0ff0-4979-9b41-da0b09988016\/settings.json", + "path": "src\/67a5e0ca-0ff0-4979-9b41-da0b09988016", + "spk": "Super---67a5e0ca_0ff0_4979_9b41_da0b09988016---Power", + "guid": "67a5e0ca-0ff0-4979-9b41-da0b09988016" + }, "68a41264-64c0-441a-a3d8-8a5e557b1883": { "name": "UpdateInterface", "type": "interface", @@ -604,6 +648,17 @@ "spk": "Super---85785701_07b2_4f81_bc1e_0f423700c254---Power", "guid": "85785701-07b2-4f81-bc1e-0f423700c254" }, + "884eca78-281f-4eab-b962-d97e355af16d": { + "name": "Factory", + "type": "abstract class", + "namespace": "VDM\\Joomla\\Componentbuilder\\File", + "code": "src\/884eca78-281f-4eab-b962-d97e355af16d\/code.php", + "power": "src\/884eca78-281f-4eab-b962-d97e355af16d\/code.power", + "settings": "src\/884eca78-281f-4eab-b962-d97e355af16d\/settings.json", + "path": "src\/884eca78-281f-4eab-b962-d97e355af16d", + "spk": "Super---884eca78_281f_4eab_b962_d97e355af16d---Power", + "guid": "884eca78-281f-4eab-b962-d97e355af16d" + }, "8aef58c1-3f70-4bd4-b9e4-3f29fcd41cff": { "name": "ModelInterface", "type": "interface", @@ -945,6 +1000,28 @@ "spk": "Super---d1de5d5b_bf29_4031_8094_76c4f6c75900---Power", "guid": "d1de5d5b-bf29-4031-8094-76c4f6c75900" }, + "d46c4667-378b-49e8-9782-ffb28d92415a": { + "name": "Display", + "type": "final class", + "namespace": "VDM\\Joomla\\Componentbuilder\\File", + "code": "src\/d46c4667-378b-49e8-9782-ffb28d92415a\/code.php", + "power": "src\/d46c4667-378b-49e8-9782-ffb28d92415a\/code.power", + "settings": "src\/d46c4667-378b-49e8-9782-ffb28d92415a\/settings.json", + "path": "src\/d46c4667-378b-49e8-9782-ffb28d92415a", + "spk": "Super---d46c4667_378b_49e8_9782_ffb28d92415a---Power", + "guid": "d46c4667-378b-49e8-9782-ffb28d92415a" + }, + "d7600b43-771a-4747-9f5d-952765721799": { + "name": "UploadHelper", + "type": "abstract class", + "namespace": "VDM\\Joomla\\Utilities", + "code": "src\/d7600b43-771a-4747-9f5d-952765721799\/code.php", + "power": "src\/d7600b43-771a-4747-9f5d-952765721799\/code.power", + "settings": "src\/d7600b43-771a-4747-9f5d-952765721799\/settings.json", + "path": "src\/d7600b43-771a-4747-9f5d-952765721799", + "spk": "Super---d7600b43_771a_4747_9f5d_952765721799---Power", + "guid": "d7600b43-771a-4747-9f5d-952765721799" + }, "d8f9ba53-c490-4e8b-8e9f-6757224e069c": { "name": "DeleteInterface", "type": "interface", @@ -1011,6 +1088,17 @@ "spk": "Super---eb7d69c2_4ee9_4bd0_aacc_ab51a12be895---Power", "guid": "eb7d69c2-4ee9-4bd0-aacc-ab51a12be895" }, + "f11dc790-713e-4706-9a85-a318ed3ad56e": { + "name": "MimeHelper", + "type": "abstract class", + "namespace": "VDM\\Joomla\\Utilities", + "code": "src\/f11dc790-713e-4706-9a85-a318ed3ad56e\/code.php", + "power": "src\/f11dc790-713e-4706-9a85-a318ed3ad56e\/code.power", + "settings": "src\/f11dc790-713e-4706-9a85-a318ed3ad56e\/settings.json", + "path": "src\/f11dc790-713e-4706-9a85-a318ed3ad56e", + "spk": "Super---f11dc790_713e_4706_9a85_a318ed3ad56e---Power", + "guid": "f11dc790-713e-4706-9a85-a318ed3ad56e" + }, "f3c04c28-bce4-422e-be93-7d163e4e342b": { "name": "Schema", "type": "abstract class",