Update 2024-09-03 02:37:43

This commit is contained in:
Robot 2024-09-03 02:37:07 +02:00
parent 26e410cc2d
commit b894dfc8af
Signed by untrusted user: Robot
GPG Key ID: 14DECD44E7E1BB95
4 changed files with 261 additions and 66 deletions

View File

@ -20,13 +20,17 @@ class UsersSubform << (F,LightGreen) >> #RoyalBlue {
+ get(string $linkValue, string $linkKey, ...) : ?array + get(string $linkValue, string $linkKey, ...) : ?array
+ set(mixed $items, string $indexKey, ...) : bool + set(mixed $items, string $indexKey, ...) : bool
+ getTable() : string + getTable() : string
# initializeUserProperties() : void - initializeUserProperties() : void
- purge(array $items, string $indexKey, ...) : void - purge(array $items, string $indexKey, ...) : void
- getUsersDetails(array $items) : array - getUsersDetails(array $items) : array
- getUserDetails(array $item) : void - getUserDetails(array $item) : void
- converter(array $items, array $keySet, ...) : array - converter(array $items, array $keySet, ...) : array
- process(mixed $items, string $indexKey, ...) : array - process(mixed $items, string $indexKey, ...) : array
- setUserDetails(array $item) : int - setUserDetails(array $item) : int
- loadUser(array $item) : ?User
- extractUserDetails(array $item, ?User $user) : array
- assignUserGroups($details, ?User $user, ...) : void
- saveUserDetails(array $details, int $userId) : int
} }
note right of UsersSubform::__construct note right of UsersSubform::__construct
@ -136,7 +140,42 @@ note right of UsersSubform::process
end note end note
note left of UsersSubform::setUserDetails note left of UsersSubform::setUserDetails
Set the user details. Handles setting user details and saving them.
This function retrieves the user by ID, sets the user details,
and adds appropriate user groups before saving the user.
since: 5.0.2
return: int
end note
note right of UsersSubform::loadUser
Load the user based on the user ID from the item array.
since: 5.0.2
return: ?User
end note
note left of UsersSubform::extractUserDetails
Extract user details from the item array and prepare them for saving.
since: 5.0.2
return: array
end note
note right of UsersSubform::assignUserGroups
Assigns user groups based on existing groups and entity type.
since: 5.0.2
return: void
arguments:
$details
?User $user
array $item
end note
note left of UsersSubform::saveUserDetails
Save the user details using UserHelper and handle exceptions.
since: 5.0.2 since: 5.0.2
return: int return: int

View File

@ -12,11 +12,13 @@
namespace VDM\Joomla\Data; namespace VDM\Joomla\Data;
use Joomla\CMS\Factory; use Joomla\CMS\Factory;
use Joomla\CMS\User\User;
use VDM\Joomla\Interfaces\Data\ItemsInterface as Items; use VDM\Joomla\Interfaces\Data\ItemsInterface as Items;
use VDM\Joomla\Data\Guid; use VDM\Joomla\Data\Guid;
use VDM\Joomla\Componentbuilder\Utilities\UserHelper; use VDM\Joomla\Componentbuilder\Utilities\UserHelper;
use VDM\Joomla\Componentbuilder\Utilities\Exception\NoUserIdFoundException; use VDM\Joomla\Componentbuilder\Utilities\Exception\NoUserIdFoundException;
use VDM\Joomla\Utilities\Component\Helper as Component;
use VDM\Joomla\Interfaces\Data\GuidInterface; use VDM\Joomla\Interfaces\Data\GuidInterface;
use VDM\Joomla\Interfaces\Data\SubformInterface; use VDM\Joomla\Interfaces\Data\SubformInterface;
@ -85,7 +87,7 @@ final class UsersSubform implements GuidInterface, SubformInterface
* @param string $table The table that should be active * @param string $table The table that should be active
* *
* @return self * @return self
* @since 3.2.2 * @since 3.2.2
*/ */
public function table(string $table): self public function table(string $table): self
{ {
@ -103,7 +105,7 @@ final class UsersSubform implements GuidInterface, SubformInterface
* @param array $get The array get:set of the keys of each row in the subform. * @param array $get The array get:set of the keys of each row in the subform.
* *
* @return array|null The subform * @return array|null The subform
* @since 3.2.2 * @since 3.2.2
*/ */
public function get(string $linkValue, string $linkKey, string $field, array $get): ?array public function get(string $linkValue, string $linkKey, string $field, array $get): ?array
{ {
@ -128,7 +130,7 @@ final class UsersSubform implements GuidInterface, SubformInterface
* @param string $linkValue The value of the link key in child table. * @param string $linkValue The value of the link key in child table.
* *
* @return bool * @return bool
* @since 3.2.2 * @since 3.2.2
*/ */
public function set(mixed $items, string $indexKey, string $linkKey, string $linkValue): bool public function set(mixed $items, string $indexKey, string $linkKey, string $linkValue): bool
{ {
@ -150,7 +152,7 @@ final class UsersSubform implements GuidInterface, SubformInterface
* Get the current active table * Get the current active table
* *
* @return string * @return string
* @since 3.2.2 * @since 3.2.2
*/ */
public function getTable(): string public function getTable(): string
{ {
@ -163,7 +165,7 @@ final class UsersSubform implements GuidInterface, SubformInterface
* @return void * @return void
* @since 5.0.2 * @since 5.0.2
*/ */
protected function initializeUserProperties(): void private function initializeUserProperties(): void
{ {
$user = UserHelper::getUserById(0); $user = UserHelper::getUserById(0);
@ -187,7 +189,7 @@ final class UsersSubform implements GuidInterface, SubformInterface
* @param string $linkValue The value of the link key in child table. * @param string $linkValue The value of the link key in child table.
* *
* @return void * @return void
* @since 3.2.2 * @since 3.2.2
*/ */
private function purge(array $items, string $indexKey, string $linkKey, string $linkValue): void private function purge(array $items, string $indexKey, string $linkKey, string $linkValue): void
{ {
@ -229,7 +231,7 @@ final class UsersSubform implements GuidInterface, SubformInterface
* @param array $items Array of objects or arrays to be filtered. * @param array $items Array of objects or arrays to be filtered.
* *
* @return array * @return array
* @since 5.0.2 * @since 5.0.2
*/ */
private function getUsersDetails(array $items): array private function getUsersDetails(array $items): array
{ {
@ -248,7 +250,7 @@ final class UsersSubform implements GuidInterface, SubformInterface
* @param array $item The user map array * @param array $item The user map array
* *
* @return void * @return void
* @since 5.0.2 * @since 5.0.2
*/ */
private function getUserDetails(array &$item): void private function getUserDetails(array &$item): void
{ {
@ -285,7 +287,7 @@ final class UsersSubform implements GuidInterface, SubformInterface
* @param string $field The field prefix for the resulting associative array. * @param string $field The field prefix for the resulting associative array.
* *
* @return array Array of filtered arrays set by association. * @return array Array of filtered arrays set by association.
* @since 3.2.2 * @since 3.2.2
*/ */
private function converter(array $items, array $keySet, string $field): array private function converter(array $items, array $keySet, string $field): array
{ {
@ -329,7 +331,7 @@ final class UsersSubform implements GuidInterface, SubformInterface
* @param string $linkValue The value of the link key in child table. * @param string $linkValue The value of the link key in child table.
* *
* @return array The processed array of arrays. * @return array The processed array of arrays.
* @since 3.2.2 * @since 3.2.2
*/ */
private function process($items, string $indexKey, string $linkKey, string $linkValue): array private function process($items, string $indexKey, string $linkKey, string $linkValue): array
{ {
@ -365,27 +367,66 @@ final class UsersSubform implements GuidInterface, SubformInterface
} }
/** /**
* Set the user details. * Handles setting user details and saving them.
* *
* @param array $item The user details * This function retrieves the user by ID, sets the user details,
* and adds appropriate user groups before saving the user.
* *
* @return int * @param array $item The user details passed by reference.
* @since 5.0.2 *
* @return int The ID of the saved user, or 0 on failure.
* @since 5.0.2
*/ */
private function setUserDetails(array &$item): int private function setUserDetails(array &$item): int
{ {
$details = []; $user = $this->loadUser($item);
$user = null; $details = $this->extractUserDetails($item, $user);
$this->assignUserGroups($details, $user, $item);
return $this->saveUserDetails($details, $details['id'] ?? 0);
}
// now load the user ID /**
if (isset($item['user_id']) && is_numeric($item['user_id']) && $item['user_id'] > 0) * Load the user based on the user ID from the item array.
*
* @param array $item The array containing user details.
*
* @return User|null The user object if found, null otherwise.
* @since 5.0.2
*/
private function loadUser(array $item): ?User
{
if (!isset($item['user_id']) || !is_numeric($item['user_id']) || $item['user_id'] <= 0)
{ {
// Retrieve the user by ID return null;
$user = UserHelper::getUserById((int)$item['user_id']); }
if ($user->id == $item['user_id'])
{ $user = UserHelper::getUserById((int) $item['user_id']);
$details['id'] = (int) $item['user_id'];
} if ($user && $user->id == $item['user_id'])
{
return $user;
}
return null;
}
/**
* Extract user details from the item array and prepare them for saving.
*
* @param array $item The array containing user details.
* @param User|null $user The user object if found, null otherwise.
*
* @return array The prepared user details array.
* @since 5.0.2
*/
private function extractUserDetails(array &$item, ?User $user): array
{
$details = [];
if ($user !== null)
{
$details['id'] = (int) $item['user_id'];
} }
foreach ($this->user as $property) foreach ($this->user as $property)
@ -397,18 +438,54 @@ final class UsersSubform implements GuidInterface, SubformInterface
} }
} }
if ($user !== null) return $details;
{ }
$details['group'] = $user->getAuthorisedGroups();
}
/**
* Assigns user groups based on existing groups and entity type.
*
* @param array &$details The array to store user details including groups.
* @param User|null $user The user object if found, null otherwise.
* @param array $item The array containing additional user details.
*
* @return void
* @since 5.0.2
*/
private function assignUserGroups(array &$details, ?User $user, array $item): void
{
$details['groups'] = $user !== null ? $user->groups : [];
if (!empty($item['entity_type']))
{
$groups = Component::getParams()->get($item['entity_type'] . '_groups', []);
foreach ($groups as $group)
{
if (!in_array($group, $details['groups']))
{
$details['groups'][] = $group;
}
}
}
}
/**
* Save the user details using UserHelper and handle exceptions.
*
* @param array $details The prepared user details array.
* @param int $userId The ID of the user being processed.
*
* @return int The ID of the saved user, or 0 on failure.
* @since 5.0.2
*/
private function saveUserDetails(array $details, int $userId): int
{
try { try {
return UserHelper::save($details); return UserHelper::save($details);
} catch(NoUserIdFoundException $e) { } catch (NoUserIdFoundException $e) {
Factory::getApplication()->enqueueMessage($e->getMessage(), 'error'); Factory::getApplication()->enqueueMessage($e->getMessage(), 'error');
} catch(\Exception $e) { } catch (\Exception $e) {
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning'); Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
return $item['user_id']; return $userId;
} }
return 0; return 0;

View File

@ -55,7 +55,7 @@
* @param string $table The table that should be active * @param string $table The table that should be active
* *
* @return self * @return self
* @since 3.2.2 * @since 3.2.2
*/ */
public function table(string $table): self public function table(string $table): self
{ {
@ -73,7 +73,7 @@
* @param array $get The array get:set of the keys of each row in the subform. * @param array $get The array get:set of the keys of each row in the subform.
* *
* @return array|null The subform * @return array|null The subform
* @since 3.2.2 * @since 3.2.2
*/ */
public function get(string $linkValue, string $linkKey, string $field, array $get): ?array public function get(string $linkValue, string $linkKey, string $field, array $get): ?array
{ {
@ -98,7 +98,7 @@
* @param string $linkValue The value of the link key in child table. * @param string $linkValue The value of the link key in child table.
* *
* @return bool * @return bool
* @since 3.2.2 * @since 3.2.2
*/ */
public function set(mixed $items, string $indexKey, string $linkKey, string $linkValue): bool public function set(mixed $items, string $indexKey, string $linkKey, string $linkValue): bool
{ {
@ -120,7 +120,7 @@
* Get the current active table * Get the current active table
* *
* @return string * @return string
* @since 3.2.2 * @since 3.2.2
*/ */
public function getTable(): string public function getTable(): string
{ {
@ -133,7 +133,7 @@
* @return void * @return void
* @since 5.0.2 * @since 5.0.2
*/ */
protected function initializeUserProperties(): void private function initializeUserProperties(): void
{ {
$user = UserHelper::getUserById(0); $user = UserHelper::getUserById(0);
@ -157,7 +157,7 @@
* @param string $linkValue The value of the link key in child table. * @param string $linkValue The value of the link key in child table.
* *
* @return void * @return void
* @since 3.2.2 * @since 3.2.2
*/ */
private function purge(array $items, string $indexKey, string $linkKey, string $linkValue): void private function purge(array $items, string $indexKey, string $linkKey, string $linkValue): void
{ {
@ -199,7 +199,7 @@
* @param array $items Array of objects or arrays to be filtered. * @param array $items Array of objects or arrays to be filtered.
* *
* @return array * @return array
* @since 5.0.2 * @since 5.0.2
*/ */
private function getUsersDetails(array $items): array private function getUsersDetails(array $items): array
{ {
@ -218,7 +218,7 @@
* @param array $item The user map array * @param array $item The user map array
* *
* @return void * @return void
* @since 5.0.2 * @since 5.0.2
*/ */
private function getUserDetails(array &$item): void private function getUserDetails(array &$item): void
{ {
@ -255,7 +255,7 @@
* @param string $field The field prefix for the resulting associative array. * @param string $field The field prefix for the resulting associative array.
* *
* @return array Array of filtered arrays set by association. * @return array Array of filtered arrays set by association.
* @since 3.2.2 * @since 3.2.2
*/ */
private function converter(array $items, array $keySet, string $field): array private function converter(array $items, array $keySet, string $field): array
{ {
@ -299,7 +299,7 @@
* @param string $linkValue The value of the link key in child table. * @param string $linkValue The value of the link key in child table.
* *
* @return array The processed array of arrays. * @return array The processed array of arrays.
* @since 3.2.2 * @since 3.2.2
*/ */
private function process($items, string $indexKey, string $linkKey, string $linkValue): array private function process($items, string $indexKey, string $linkKey, string $linkValue): array
{ {
@ -335,27 +335,66 @@
} }
/** /**
* Set the user details. * Handles setting user details and saving them.
* *
* @param array $item The user details * This function retrieves the user by ID, sets the user details,
* and adds appropriate user groups before saving the user.
* *
* @return int * @param array $item The user details passed by reference.
* @since 5.0.2 *
* @return int The ID of the saved user, or 0 on failure.
* @since 5.0.2
*/ */
private function setUserDetails(array &$item): int private function setUserDetails(array &$item): int
{ {
$details = []; $user = $this->loadUser($item);
$user = null; $details = $this->extractUserDetails($item, $user);
$this->assignUserGroups($details, $user, $item);
return $this->saveUserDetails($details, $details['id'] ?? 0);
}
// now load the user ID /**
if (isset($item['user_id']) && is_numeric($item['user_id']) && $item['user_id'] > 0) * Load the user based on the user ID from the item array.
*
* @param array $item The array containing user details.
*
* @return User|null The user object if found, null otherwise.
* @since 5.0.2
*/
private function loadUser(array $item): ?User
{
if (!isset($item['user_id']) || !is_numeric($item['user_id']) || $item['user_id'] <= 0)
{ {
// Retrieve the user by ID return null;
$user = UserHelper::getUserById((int)$item['user_id']); }
if ($user->id == $item['user_id'])
{ $user = UserHelper::getUserById((int) $item['user_id']);
$details['id'] = (int) $item['user_id'];
} if ($user && $user->id == $item['user_id'])
{
return $user;
}
return null;
}
/**
* Extract user details from the item array and prepare them for saving.
*
* @param array $item The array containing user details.
* @param User|null $user The user object if found, null otherwise.
*
* @return array The prepared user details array.
* @since 5.0.2
*/
private function extractUserDetails(array &$item, ?User $user): array
{
$details = [];
if ($user !== null)
{
$details['id'] = (int) $item['user_id'];
} }
foreach ($this->user as $property) foreach ($this->user as $property)
@ -367,18 +406,54 @@
} }
} }
if ($user !== null) return $details;
{ }
$details['group'] = $user->getAuthorisedGroups();
}
/**
* Assigns user groups based on existing groups and entity type.
*
* @param array &$details The array to store user details including groups.
* @param User|null $user The user object if found, null otherwise.
* @param array $item The array containing additional user details.
*
* @return void
* @since 5.0.2
*/
private function assignUserGroups(array &$details, ?User $user, array $item): void
{
$details['groups'] = $user !== null ? $user->groups : [];
if (!empty($item['entity_type']))
{
$groups = Component::getParams()->get($item['entity_type'] . '_groups', []);
foreach ($groups as $group)
{
if (!in_array($group, $details['groups']))
{
$details['groups'][] = $group;
}
}
}
}
/**
* Save the user details using UserHelper and handle exceptions.
*
* @param array $details The prepared user details array.
* @param int $userId The ID of the user being processed.
*
* @return int The ID of the saved user, or 0 on failure.
* @since 5.0.2
*/
private function saveUserDetails(array $details, int $userId): int
{
try { try {
return UserHelper::save($details); return UserHelper::save($details);
} catch(NoUserIdFoundException $e) { } catch (NoUserIdFoundException $e) {
Factory::getApplication()->enqueueMessage($e->getMessage(), 'error'); Factory::getApplication()->enqueueMessage($e->getMessage(), 'error');
} catch(\Exception $e) { } catch (\Exception $e) {
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning'); Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
return $item['user_id']; return $userId;
} }
return 0; return 0;

View File

@ -28,12 +28,16 @@
"use_selection3": { "use_selection3": {
"use": "1c10a5f1-204d-4f17-ad9f-0e0684f2030d", "use": "1c10a5f1-204d-4f17-ad9f-0e0684f2030d",
"as": "default" "as": "default"
},
"use_selection4": {
"use": "640b5352-fb09-425f-a26e-cd44eda03f15",
"as": "Component"
} }
}, },
"extendsinterfaces": null, "extendsinterfaces": null,
"namespace": "[[[NamespacePrefix]]]\\Joomla\\Data.UsersSubform", "namespace": "[[[NamespacePrefix]]]\\Joomla\\Data.UsersSubform",
"description": "CRUD the user data of any sub-form to another view (table)\r\n\r\n@since 5.0.2", "description": "CRUD the user data of any sub-form to another view (table)\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", "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": "use Joomla\\CMS\\Factory;", "head": "use Joomla\\CMS\\Factory;\r\nuse Joomla\\CMS\\User\\User;",
"composer": "" "composer": ""
} }