Update 2024-06-22 4:38:12

This commit is contained in:
Robot 2024-06-22 03:41:16 +02:00
parent f2eb3a484a
commit 6ae30a020c
Signed by untrusted user: Robot
GPG Key ID: 14DECD44E7E1BB95
13 changed files with 207 additions and 81 deletions

View File

@ -23,7 +23,7 @@ class Items << (F,LightGreen) >> #RoyalBlue {
+ get(array $values, string $key = 'guid') : ?array
+ values(array $values, string $key = 'guid', ...) : ?array
+ set(array $items, string $key = 'guid') : bool
+ delete(string $values, string $key = 'guid') : bool
+ delete(array $values, string $key = 'guid') : bool
+ getTable() : string
- insert(array $items) : bool
- update(array $items, string $key) : bool

View File

@ -202,7 +202,7 @@ final class Items implements ItemsInterface
* @return bool
* @since 3.2.2
*/
public function delete(string $values, string $key = 'guid'): bool
public function delete(array $values, string $key = 'guid'): bool
{
return $this->delete->table($this->getTable())->items([$key => ['operator' => 'IN', 'value' => $values]]);
}

View File

@ -173,7 +173,7 @@
* @return bool
* @since 3.2.2
*/
public function delete(string $values, string $key = 'guid'): bool
public function delete(array $values, string $key = 'guid'): bool
{
return $this->delete->table($this->getTable())->items([$key => ['operator' => 'IN', 'value' => $values]]);
}

View File

@ -13,8 +13,8 @@
@startuml
interface SubformInterface #Lavender {
+ table(string $table) : self
+ get(string $value, string $key, ...) : ?array
+ set(array $items, string $key) : bool
+ get(string $linkValue, string $linkKey, ...) : ?array
+ set(array $items, string $indexKey, ...) : bool
+ getTable() : string
}
@ -32,8 +32,8 @@ note right of SubformInterface::get
return: ?array
arguments:
string $value
string $key
string $linkValue
string $linkKey
string $field
array $set
end note
@ -43,6 +43,12 @@ note right of SubformInterface::set
since: 3.2.2
return: bool
arguments:
array $items
string $indexKey
string $linkKey
string $linkValue
end note
note right of SubformInterface::getTable

View File

@ -32,26 +32,28 @@ interface SubformInterface
/**
* Get a subform items
*
* @param string $value The ids/values of the parent
* @param string $key The parent key on which the items are linked
* @param string $field The parent field name of the subform
* @param array $set The array SET of the keys of each row in the subform
* @param string $linkValue The value of the link key in child table.
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $field The parent field name of the subform in the parent view.
* @param array $set The array SET of the keys of each row in the subform.
*
* @return array|null The subform
* @since 3.2.2
*/
public function get(string $value, string $key, string $field, array $set): ?array;
public function get(string $linkValue, string $linkKey, string $field, array $set): ?array;
/**
* Set a subform items
*
* @param array $items The list of items to set
* @param string $key The child key on which the items should be linked
* @param array $items The list of items from the subform to set
* @param string $indexKey The index key on which the items should be observed as it relates to insert/update/delete.
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $linkValue The value of the link key in child table.
*
* @return bool
* @since 3.2.2
*/
public function set(array $items, string $key): bool;
public function set(array $items, string $indexKey, string $linkKey, string $linkValue): bool;
/**
* Get the current active table

View File

@ -11,26 +11,28 @@
/**
* Get a subform items
*
* @param string $value The ids/values of the parent
* @param string $key The parent key on which the items are linked
* @param string $field The parent field name of the subform
* @param array $set The array SET of the keys of each row in the subform
* @param string $linkValue The value of the link key in child table.
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $field The parent field name of the subform in the parent view.
* @param array $set The array SET of the keys of each row in the subform.
*
* @return array|null The subform
* @since 3.2.2
*/
public function get(string $value, string $key, string $field, array $set): ?array;
public function get(string $linkValue, string $linkKey, string $field, array $set): ?array;
/**
* Set a subform items
*
* @param array $items The list of items to set
* @param string $key The child key on which the items should be linked
* @param array $items The list of items from the subform to set
* @param string $indexKey The index key on which the items should be observed as it relates to insert/update/delete.
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $linkValue The value of the link key in child table.
*
* @return bool
* @since 3.2.2
*/
public function set(array $items, string $key): bool;
public function set(array $items, string $indexKey, string $linkKey, string $linkValue): bool;
/**
* Get the current active table

View File

@ -16,7 +16,7 @@ interface ItemsInterface #Lavender {
+ get(array $values, string $key = 'guid') : ?array
+ values(array $values, string $key = 'guid', ...) : ?array
+ set(array $items, string $key = 'guid') : bool
+ delete(string $values, string $key = 'guid') : bool
+ delete(array $values, string $key = 'guid') : bool
+ getTable() : string
}

View File

@ -72,7 +72,7 @@ interface ItemsInterface
* @return bool
* @since 3.2.2
*/
public function delete(string $values, string $key = 'guid'): bool;
public function delete(array $values, string $key = 'guid'): bool;
/**
* Get the current active table

View File

@ -51,7 +51,7 @@
* @return bool
* @since 3.2.2
*/
public function delete(string $values, string $key = 'guid'): bool;
public function delete(array $values, string $key = 'guid'): bool;
/**
* Get the current active table

View File

@ -16,11 +16,12 @@ class Subform #Gold {
# string $table
+ __construct(Items $items, ?string $table = null)
+ table(string $table) : self
+ get(string $value, string $key, ...) : ?array
+ set(array $items, string $key) : bool
+ get(string $linkValue, string $linkKey, ...) : ?array
+ set(array $items, string $indexKey, ...) : bool
+ getTable() : string
- purge(array $items, string $indexKey, ...) : void
- converter(array $items, array $keySet, ...) : array
- process(array $items, string $key) : array
- process(array $items, string $indexKey, ...) : array
- setGuid(string $key, bool $trim = true) : string
}
@ -44,8 +45,8 @@ note right of Subform::get
return: ?array
arguments:
string $value
string $key
string $linkValue
string $linkKey
string $field
array $set
end note
@ -55,6 +56,12 @@ note left of Subform::set
since: 3.2.2
return: bool
arguments:
array $items
string $indexKey
string $linkKey
string $linkValue
end note
note right of Subform::getTable
@ -64,7 +71,20 @@ note right of Subform::getTable
return: string
end note
note left of Subform::converter
note left of Subform::purge
Purge all items no longer in subform
since: 3.2.2
return: void
arguments:
array $items
string $indexKey
string $linkKey
string $linkValue
end note
note right of Subform::converter
Filters the specified keys from an array of objects or arrays, converts them to arrays,
and sets them by association with a specified key and an incrementing integer.
@ -74,17 +94,23 @@ and sets them by association with a specified key and an incrementing integer.
arguments:
array $items
array $keySet
string $key
string $field
end note
note right of Subform::process
note left of Subform::process
Processes an array of arrays based on the specified key.
since: 3.2.2
return: array
arguments:
array $items
string $indexKey
string $linkKey
string $linkValue
end note
note left of Subform::setGuid
note right of Subform::setGuid
Returns a GUIDv4 string
Thanks to Dave Pearson (and other)
https://www.php.net/manual/en/function.com-create-guid.php#119168

View File

@ -17,7 +17,7 @@ use VDM\Joomla\Interfaces\Data\SubformInterface;
/**
* Store the data of a sub-form
* CRUD the data of any sub-form to another view (table)
*
* @since 3.2.2
*/
@ -74,17 +74,17 @@ class Subform implements SubformInterface
/**
* Get a subform items
*
* @param string $value The ids/values of the parent
* @param string $key The parent key on which the items are linked
* @param string $field The parent field name of the subform
* @param array $set The array SET of the keys of each row in the subform
* @param string $linkValue The value of the link key in child table.
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $field The parent field name of the subform in the parent view.
* @param array $set The array SET of the keys of each row in the subform.
*
* @return array|null The subform
* @since 3.2.2
*/
public function get(string $value, string $key, string $field, array $set): ?array
public function get(string $linkValue, string $linkKey, string $field, array $set): ?array
{
if (($items = $this->items->table($this->getTable())->get([$value], $key)) !== null)
if (($items = $this->items->table($this->getTable())->get([$linkValue], $linkKey)) !== null)
{
return $this->converter($items, $set, $field);
}
@ -94,16 +94,22 @@ class Subform implements SubformInterface
/**
* Set a subform items
*
* @param array $items The list of items to set
* @param string $key The child key on which the items should be linked
* @param array $items The list of items from the subform to set
* @param string $indexKey The index key on which the items should be observed as it relates to insert/update/delete.
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $linkValue The value of the link key in child table.
*
* @return bool
* @since 3.2.2
*/
public function set(array $items, string $key): bool
public function set(array $items, string $indexKey, string $linkKey, string $linkValue): bool
{
$items = $this->process($items, $indexKey, $linkKey, $linkValue);
$this->purge($items, $indexKey, $linkKey, $linkValue);
return $this->items->table($this->getTable())->set(
$this->process($items, $key), $key
$items, $indexKey
);
}
@ -118,18 +124,52 @@ class Subform implements SubformInterface
return $this->table;
}
/**
* Purge all items no longer in subform
*
* @param array $items The list of items to set.
* @param string $indexKey The index key on which the items should be observed as it relates to insert/update/delete
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $linkValue The value of the link key in child table.
*
* @return void
* @since 3.2.2
*/
private function purge(array $items, string $indexKey, string $linkKey, string $linkValue): void
{
// Get the current index values from the database
$currentIndexValues = $this->items->table($this->getTable())->values([$linkValue], $linkKey, $indexKey);
if ($currentIndexValues !== null)
{
// Extract the index values from the items array
$activeIndexValues = array_values(array_map(function($item) use ($indexKey) {
return $item[$indexKey] ?? null;
}, $items));
// Find the index values that are no longer in the items array
$inactiveIndexValues = array_diff($currentIndexValues, $activeIndexValues);
// Delete the inactive index values
if (!empty($inactiveIndexValues))
{
$this->items->table($this->getTable())->delete($inactiveIndexValues, $indexKey);
}
}
}
/**
* Filters the specified keys from an array of objects or arrays, converts them to arrays,
* and sets them by association with a specified key and an incrementing integer.
*
* @param array $items Array of objects or arrays to be filtered.
* @param array $keySet Array of keys to retain in each item.
* @param string $key The key 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.
* @since 3.2.2
*/
private function converter(array $items, array $keySet, string $key): array
private function converter(array $items, array $keySet, string $field): array
{
/**
* Filters keys for a single item and converts it to an array.
@ -144,7 +184,7 @@ class Subform implements SubformInterface
$filteredArray = [];
foreach ($keySet as $key) {
if (is_object($item) && property_exists($item, $key)) {
$filteredArray[$key] = $item->$key;
$filteredArray[$key] = $item->{$key};
} elseif (is_array($item) && array_key_exists($key, $item)) {
$filteredArray[$key] = $item[$key];
}
@ -156,7 +196,7 @@ class Subform implements SubformInterface
foreach ($items as $index => $item)
{
$filteredArray = $filterKeys($item, $keySet);
$result[$key . $index] = $filteredArray;
$result[$field . $index] = $filteredArray;
}
return $result;
@ -166,33 +206,38 @@ class Subform implements SubformInterface
* Processes an array of arrays based on the specified key.
*
* @param array $items Array of arrays to be processed.
* @param string $key The key to check and modify values.
* @param string $indexKey The index key on which the items should be observed as it relates to insert/update/delete
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $linkValue The value of the link key in child table.
*
* @return array The processed array of arrays.
* @since 3.2.2
*/
private function process(array $items, string $key): array
private function process(array $items, string $indexKey, string $linkKey, string $linkValue): array
{
foreach ($items as &$item)
{
$value = $item[$key] ?? '';
switch ($key) {
$value = $item[$indexKey] ?? '';
switch ($indexKey) {
case 'guid':
if (empty($value))
{
$item[$key] = $this->setGuid($key);
// set INDEX
$item[$indexKey] = $this->setGuid($indexKey);
}
break;
case 'id':
if ($value === '')
if (empty($value))
{
$item[$key] = 0;
$item[$indexKey] = 0;
}
break;
default:
// No action for other keys if empty
break;
}
// set LINK
$item[$linkKey] = $linkValue;
}
return array_values($items);

View File

@ -49,17 +49,17 @@
/**
* Get a subform items
*
* @param string $value The ids/values of the parent
* @param string $key The parent key on which the items are linked
* @param string $field The parent field name of the subform
* @param array $set The array SET of the keys of each row in the subform
* @param string $linkValue The value of the link key in child table.
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $field The parent field name of the subform in the parent view.
* @param array $set The array SET of the keys of each row in the subform.
*
* @return array|null The subform
* @since 3.2.2
*/
public function get(string $value, string $key, string $field, array $set): ?array
public function get(string $linkValue, string $linkKey, string $field, array $set): ?array
{
if (($items = $this->items->table($this->getTable())->get([$value], $key)) !== null)
if (($items = $this->items->table($this->getTable())->get([$linkValue], $linkKey)) !== null)
{
return $this->converter($items, $set, $field);
}
@ -69,16 +69,22 @@
/**
* Set a subform items
*
* @param array $items The list of items to set
* @param string $key The child key on which the items should be linked
* @param array $items The list of items from the subform to set
* @param string $indexKey The index key on which the items should be observed as it relates to insert/update/delete.
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $linkValue The value of the link key in child table.
*
* @return bool
* @since 3.2.2
*/
public function set(array $items, string $key): bool
public function set(array $items, string $indexKey, string $linkKey, string $linkValue): bool
{
$items = $this->process($items, $indexKey, $linkKey, $linkValue);
$this->purge($items, $indexKey, $linkKey, $linkValue);
return $this->items->table($this->getTable())->set(
$this->process($items, $key), $key
$items, $indexKey
);
}
@ -93,18 +99,52 @@
return $this->table;
}
/**
* Purge all items no longer in subform
*
* @param array $items The list of items to set.
* @param string $indexKey The index key on which the items should be observed as it relates to insert/update/delete
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $linkValue The value of the link key in child table.
*
* @return void
* @since 3.2.2
*/
private function purge(array $items, string $indexKey, string $linkKey, string $linkValue): void
{
// Get the current index values from the database
$currentIndexValues = $this->items->table($this->getTable())->values([$linkValue], $linkKey, $indexKey);
if ($currentIndexValues !== null)
{
// Extract the index values from the items array
$activeIndexValues = array_values(array_map(function($item) use ($indexKey) {
return $item[$indexKey] ?? null;
}, $items));
// Find the index values that are no longer in the items array
$inactiveIndexValues = array_diff($currentIndexValues, $activeIndexValues);
// Delete the inactive index values
if (!empty($inactiveIndexValues))
{
$this->items->table($this->getTable())->delete($inactiveIndexValues, $indexKey);
}
}
}
/**
* Filters the specified keys from an array of objects or arrays, converts them to arrays,
* and sets them by association with a specified key and an incrementing integer.
*
* @param array $items Array of objects or arrays to be filtered.
* @param array $keySet Array of keys to retain in each item.
* @param string $key The key 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.
* @since 3.2.2
*/
private function converter(array $items, array $keySet, string $key): array
private function converter(array $items, array $keySet, string $field): array
{
/**
* Filters keys for a single item and converts it to an array.
@ -119,7 +159,7 @@
$filteredArray = [];
foreach ($keySet as $key) {
if (is_object($item) && property_exists($item, $key)) {
$filteredArray[$key] = $item->$key;
$filteredArray[$key] = $item->{$key};
} elseif (is_array($item) && array_key_exists($key, $item)) {
$filteredArray[$key] = $item[$key];
}
@ -131,7 +171,7 @@
foreach ($items as $index => $item)
{
$filteredArray = $filterKeys($item, $keySet);
$result[$key . $index] = $filteredArray;
$result[$field . $index] = $filteredArray;
}
return $result;
@ -141,33 +181,38 @@
* Processes an array of arrays based on the specified key.
*
* @param array $items Array of arrays to be processed.
* @param string $key The key to check and modify values.
* @param string $indexKey The index key on which the items should be observed as it relates to insert/update/delete
* @param string $linkKey The link key on which the items where linked in the child table.
* @param string $linkValue The value of the link key in child table.
*
* @return array The processed array of arrays.
* @since 3.2.2
*/
private function process(array $items, string $key): array
private function process(array $items, string $indexKey, string $linkKey, string $linkValue): array
{
foreach ($items as &$item)
{
$value = $item[$key] ?? '';
switch ($key) {
$value = $item[$indexKey] ?? '';
switch ($indexKey) {
case 'guid':
if (empty($value))
{
$item[$key] = $this->setGuid($key);
// set INDEX
$item[$indexKey] = $this->setGuid($indexKey);
}
break;
case 'id':
if ($value === '')
if (empty($value))
{
$item[$key] = 0;
$item[$indexKey] = 0;
}
break;
default:
// No action for other keys if empty
break;
}
// set LINK
$item[$linkKey] = $linkValue;
}
return array_values($items);

View File

@ -19,7 +19,7 @@
},
"extendsinterfaces": null,
"namespace": "[[[NamespacePrefix]]]\\Joomla\\Data.Subform",
"description": "Store the data of a sub-form\r\n\r\n@since 3.2.2",
"description": "CRUD the data of any sub-form to another view (table)\r\n\r\n@since 3.2.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": "",
"composer": ""