forked from joomla/super-powers
Update 2024-09-16 03:55:10
This commit is contained in:
parent
c67a23df10
commit
3efc0de510
@ -23,6 +23,8 @@ class Type << (F,LightGreen) >> #RoyalBlue {
|
||||
# getAllow(object $data) : string
|
||||
# getAllowSpan(object $data) : string
|
||||
# getAllowFormats(object $data) : ?array
|
||||
# getFileTypePath(object $data) : ?string
|
||||
# getLastFolderName(string $path) : ?string
|
||||
}
|
||||
|
||||
note right of Type::__construct
|
||||
@ -87,6 +89,25 @@ note right of Type::getAllowFormats
|
||||
return: ?array
|
||||
end note
|
||||
|
||||
note left of Type::getFileTypePath
|
||||
Retrieves the file type path based on provided data.
|
||||
Performs safety checks and returns either a cleaned path if it exists
|
||||
and is a writable directory, or constructs a relative path to the 'images' folder
|
||||
based on the last folder name from the given path.
|
||||
|
||||
since: 5.0.2
|
||||
return: ?string
|
||||
end note
|
||||
|
||||
note right of Type::getLastFolderName
|
||||
Recursively retrieves the last folder name from a given path, ignoring any file names.
|
||||
If the last part of the path contains a dot (indicating a file), it moves up the directory tree
|
||||
until it finds a valid folder name. Returns null if no valid folder is found.
|
||||
|
||||
since: 5.0.2
|
||||
return: ?string
|
||||
end note
|
||||
|
||||
@enduml
|
||||
```
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
namespace VDM\Joomla\Componentbuilder\File;
|
||||
|
||||
|
||||
use Joomla\Filesystem\Path;
|
||||
use VDM\Joomla\Interfaces\Data\ItemInterface as Item;
|
||||
|
||||
|
||||
@ -91,10 +92,6 @@ final class Type
|
||||
if (($fileType = $this->details($guid)) !== null &&
|
||||
$this->validTarget($fileType, $target))
|
||||
{
|
||||
// some safety checks
|
||||
$path = isset($fileType->path) && is_string($fileType->path) && trim($fileType->path) !== '' ? trim($fileType->path) : null;
|
||||
$path = ($path !== null && is_dir($path) && is_writable($path)) ? $path : null;
|
||||
|
||||
return [
|
||||
'name' => $fileType->name ?? 'files',
|
||||
'access' => $fileType->access ?? 1,
|
||||
@ -103,7 +100,7 @@ final class Type
|
||||
'type' => $this->getFieldName($fileType),
|
||||
'formats' => $this->getAllowFormats($fileType) ?? [],
|
||||
'filter' => $fileType->filter ?? null,
|
||||
'path' => $path
|
||||
'path' => $this->getFileTypePath($fileType)
|
||||
];
|
||||
}
|
||||
|
||||
@ -232,5 +229,73 @@ final class Type
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the file type path based on provided data.
|
||||
*
|
||||
* Performs safety checks and returns either a cleaned path if it exists
|
||||
* and is a writable directory, or constructs a relative path to the 'images' folder
|
||||
* based on the last folder name from the given path.
|
||||
*
|
||||
* @param object $data The type data object containing path information.
|
||||
*
|
||||
* @return string|null Returns the cleaned file path or null if no valid path is found.
|
||||
* @since 5.0.2
|
||||
*/
|
||||
protected function getFileTypePath(object $data): ?string
|
||||
{
|
||||
// Validate the provided path data
|
||||
$path = isset($data->path) && is_string($data->path) && trim($data->path) !== '' ?
|
||||
Path::clean(trim($data->path)) : null;
|
||||
|
||||
// Return the path if it's a valid directory and writable
|
||||
if ($path !== null && is_dir($path) && is_writable($path))
|
||||
{
|
||||
return $path;
|
||||
}
|
||||
|
||||
// If no valid path is found, try to derive a relative path from the 'images' folder
|
||||
if ($path !== null && ($folder = $this->getLastFolderName($path)) !== null)
|
||||
{
|
||||
return JPATH_SITE . '/images/' . $folder;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively retrieves the last folder name from a given path, ignoring any file names.
|
||||
* If the last part of the path contains a dot (indicating a file), it moves up the directory tree
|
||||
* until it finds a valid folder name. Returns null if no valid folder is found.
|
||||
*
|
||||
* @param string $path The file system path from which to extract the last folder name.
|
||||
*
|
||||
* @return string|null Returns the last folder name if found, or null if no valid folder exists.
|
||||
* @since 5.0.2
|
||||
*/
|
||||
protected function getLastFolderName(string $path): ?string
|
||||
{
|
||||
// Remove any trailing slashes to avoid an empty result
|
||||
$path = rtrim($path, '/\\');
|
||||
|
||||
// If the path becomes empty, return null (base case)
|
||||
if (empty($path))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// Get the last part of the path
|
||||
$lastPart = basename($path);
|
||||
|
||||
// If the last part contains a dot (and it's not a hidden folder), move up the directory tree
|
||||
if (strpos($lastPart, '.') > 0)
|
||||
{
|
||||
// If it contains a dot, treat it as a file and move up one level
|
||||
return $this->getLastFolderName(dirname($path));
|
||||
}
|
||||
|
||||
// Return the last folder name (if it's valid and not a file)
|
||||
return $lastPart;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -67,10 +67,6 @@
|
||||
if (($fileType = $this->details($guid)) !== null &&
|
||||
$this->validTarget($fileType, $target))
|
||||
{
|
||||
// some safety checks
|
||||
$path = isset($fileType->path) && is_string($fileType->path) && trim($fileType->path) !== '' ? trim($fileType->path) : null;
|
||||
$path = ($path !== null && is_dir($path) && is_writable($path)) ? $path : null;
|
||||
|
||||
return [
|
||||
'name' => $fileType->name ?? 'files',
|
||||
'access' => $fileType->access ?? 1,
|
||||
@ -79,7 +75,7 @@
|
||||
'type' => $this->getFieldName($fileType),
|
||||
'formats' => $this->getAllowFormats($fileType) ?? [],
|
||||
'filter' => $fileType->filter ?? null,
|
||||
'path' => $path
|
||||
'path' => $this->getFileTypePath($fileType)
|
||||
];
|
||||
}
|
||||
|
||||
@ -208,3 +204,71 @@
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the file type path based on provided data.
|
||||
*
|
||||
* Performs safety checks and returns either a cleaned path if it exists
|
||||
* and is a writable directory, or constructs a relative path to the 'images' folder
|
||||
* based on the last folder name from the given path.
|
||||
*
|
||||
* @param object $data The type data object containing path information.
|
||||
*
|
||||
* @return string|null Returns the cleaned file path or null if no valid path is found.
|
||||
* @since 5.0.2
|
||||
*/
|
||||
protected function getFileTypePath(object $data): ?string
|
||||
{
|
||||
// Validate the provided path data
|
||||
$path = isset($data->path) && is_string($data->path) && trim($data->path) !== '' ?
|
||||
Path::clean(trim($data->path)) : null;
|
||||
|
||||
// Return the path if it's a valid directory and writable
|
||||
if ($path !== null && is_dir($path) && is_writable($path))
|
||||
{
|
||||
return $path;
|
||||
}
|
||||
|
||||
// If no valid path is found, try to derive a relative path from the 'images' folder
|
||||
if ($path !== null && ($folder = $this->getLastFolderName($path)) !== null)
|
||||
{
|
||||
return JPATH_SITE . '/images/' . $folder;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively retrieves the last folder name from a given path, ignoring any file names.
|
||||
* If the last part of the path contains a dot (indicating a file), it moves up the directory tree
|
||||
* until it finds a valid folder name. Returns null if no valid folder is found.
|
||||
*
|
||||
* @param string $path The file system path from which to extract the last folder name.
|
||||
*
|
||||
* @return string|null Returns the last folder name if found, or null if no valid folder exists.
|
||||
* @since 5.0.2
|
||||
*/
|
||||
protected function getLastFolderName(string $path): ?string
|
||||
{
|
||||
// Remove any trailing slashes to avoid an empty result
|
||||
$path = rtrim($path, '/\\');
|
||||
|
||||
// If the path becomes empty, return null (base case)
|
||||
if (empty($path))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// Get the last part of the path
|
||||
$lastPart = basename($path);
|
||||
|
||||
// If the last part contains a dot (and it's not a hidden folder), move up the directory tree
|
||||
if (strpos($lastPart, '.') > 0)
|
||||
{
|
||||
// If it contains a dot, treat it as a file and move up one level
|
||||
return $this->getLastFolderName(dirname($path));
|
||||
}
|
||||
|
||||
// Return the last folder name (if it's valid and not a file)
|
||||
return $lastPart;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"add_head": "0",
|
||||
"add_head": "1",
|
||||
"add_licensing_template": "2",
|
||||
"extends": "",
|
||||
"guid": "12a2a8de-a893-4dbb-a53d-b52de4f6cb0e",
|
||||
@ -19,6 +19,6 @@
|
||||
"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 <https:\/\/dev.vdm.io>\r\n * @git Joomla Component Builder <https:\/\/git.vdm.dev\/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": "",
|
||||
"head": "use Joomla\\Filesystem\\Path;",
|
||||
"composer": ""
|
||||
}
|
@ -18,6 +18,8 @@ use Joomla\Filesystem\File;
|
||||
use Joomla\Filesystem\Folder;
|
||||
use Joomla\Filesystem\Path;
|
||||
use VDM\Joomla\Utilities\Component\Helper;
|
||||
use VDM\Joomla\Utilities\MimeHelper;
|
||||
use VDM\Joomla\Utilities\StringHelper;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -4,14 +4,7 @@
|
||||
"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"
|
||||
}
|
||||
},
|
||||
"load_selection": null,
|
||||
"name": "UploadHelper",
|
||||
"power_version": "1.0.0",
|
||||
"system_name": "Utilities UploadHelper",
|
||||
@ -20,6 +13,14 @@
|
||||
"use_selection0": {
|
||||
"use": "640b5352-fb09-425f-a26e-cd44eda03f15",
|
||||
"as": "default"
|
||||
},
|
||||
"use_selection1": {
|
||||
"use": "f11dc790-713e-4706-9a85-a318ed3ad56e",
|
||||
"as": "default"
|
||||
},
|
||||
"use_selection2": {
|
||||
"use": "1f28cb53-60d9-4db1-b517-3c7dc6b429ef",
|
||||
"as": "default"
|
||||
}
|
||||
},
|
||||
"extendsinterfaces": null,
|
||||
|
Loading…
Reference in New Issue
Block a user