modifs.mineures sans commentaires
This commit is contained in:
parent
9b134ae7c6
commit
a70bccbeb8
|
@ -37,7 +37,7 @@ class Capacitor {
|
|||
return $this->storage->_get($this->channel, $filter);
|
||||
}
|
||||
|
||||
function each($filter, callable $func, ?array $args=null): void {
|
||||
function each($filter, ?callable $func=null, ?array $args=null): void {
|
||||
$this->storage->_each($this->channel, $filter, $func, $args);
|
||||
}
|
||||
|
||||
|
|
|
@ -59,4 +59,39 @@ class CapacitorChannel {
|
|||
function getKeyValues($item): ?array {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* méthode appelée lors du chargement d'un élément avec
|
||||
* {@link Capacitor::charge()}
|
||||
*
|
||||
* @param mixed $item l'élément à charger
|
||||
* @param array $values les valeurs calculées par {@link getKeyValues()}
|
||||
* @param ?array $row la ligne à mettre à jour. vaut null s'il faut insérer
|
||||
* une nouvelle ligne
|
||||
* @return ?array le cas échéant, un tableau non null à marger dans $values et
|
||||
* utiliser pour provisionner la ligne nouvelle créée, ou mettre à jour la
|
||||
* ligne existante
|
||||
*
|
||||
* Si $item est modifié dans cette méthode, il est possible de le retourner
|
||||
* avec la clé "_item" pour mettre à jour la ligne correspondante
|
||||
*/
|
||||
function onCharge($item, array $values, ?array $row): ?array {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* méthode appelée lors du parcours des éléments avec
|
||||
* {@link Capacitor::each()}
|
||||
*
|
||||
* @param mixed $item l'élément courant
|
||||
* @param ?array $row la ligne à mettre à jour
|
||||
* @return ?array le cas échéant, un tableau non null utilisé pour mettre à
|
||||
* jour la ligne courante
|
||||
*
|
||||
* Si $item est modifié dans cette méthode, il est possible de le retourner
|
||||
* avec la clé "_item" pour mettre à jour la ligne correspondante
|
||||
*/
|
||||
function onEach($item, array $row): ?array {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,8 +29,8 @@ abstract class CapacitorStorage {
|
|||
*
|
||||
* Si $func!==null, après avoir calculé les valeurs des clés supplémentaires
|
||||
* avec {@link CapacitorChannel::getKeyValues()}, la fonction est appelée avec
|
||||
* les arguments ($item, $keyValues, $row, ...$args)
|
||||
* Si la fonction retourne un tableau, il est utilisé pour modifié les valeurs
|
||||
* la signature ($item, $keyValues, $row, ...$args)
|
||||
* Si la fonction retourne un tableau, il est utilisé pour modifier les valeurs
|
||||
* insérées/mises à jour
|
||||
*
|
||||
* @return true si l'objet a été chargé ou mis à jour, false s'il existait
|
||||
|
@ -58,17 +58,17 @@ abstract class CapacitorStorage {
|
|||
return $this->_get($this->getChannel($channel), $filter);
|
||||
}
|
||||
|
||||
abstract function _each(CapacitorChannel $channel, $filter, callable $func, ?array $args): void;
|
||||
abstract function _each(CapacitorChannel $channel, $filter, ?callable $func, ?array $args): void;
|
||||
|
||||
/**
|
||||
* appeler une fonction pour chaque élément du canal spécifié.
|
||||
*
|
||||
* $filter permet de filtrer parmi les élements chargés
|
||||
*
|
||||
* si $func retourne un tableau, il est utilisé pour mettre à jour
|
||||
* l'enregistrement.
|
||||
* $func est appelé avec la signature ($item, $row, ...$args). si la fonction
|
||||
* retourne un tableau, il est utilisé pour mettre à jour la ligne
|
||||
*/
|
||||
function each(?string $channel, $filter, callable $func, ?array $args=null): void {
|
||||
function each(?string $channel, $filter, ?callable $func=null, ?array $args=null): void {
|
||||
$this->_each($this->getChannel($channel), $filter, $func, $args);
|
||||
}
|
||||
|
||||
|
|
|
@ -110,10 +110,11 @@ class SqliteCapacitor extends CapacitorStorage {
|
|||
]);
|
||||
$insert = false;
|
||||
}
|
||||
if ($func !== null) {
|
||||
$context = func::_prepare($func);
|
||||
|
||||
if ($func === null) $func = [$channel, "onCharge"];
|
||||
$onCharge = func::_prepare($func);
|
||||
$args ??= [];
|
||||
$updates = func::_call($context, [$item, $values, $row, ...$args]);
|
||||
$updates = func::_call($onCharge, [$item, $values, $row, ...$args]);
|
||||
if (is_array($updates)) {
|
||||
if (array_key_exists("_item", $updates)) {
|
||||
$_item = serialize($updates["_item"]);
|
||||
|
@ -125,7 +126,7 @@ class SqliteCapacitor extends CapacitorStorage {
|
|||
}
|
||||
$values = cl::merge($values, $updates);
|
||||
}
|
||||
}
|
||||
|
||||
if ($insert === null) {
|
||||
# aucune modification
|
||||
return false;
|
||||
|
@ -173,9 +174,10 @@ class SqliteCapacitor extends CapacitorStorage {
|
|||
else return unserialize($row["_item"]);
|
||||
}
|
||||
|
||||
function _each(CapacitorChannel $channel, $filter, callable $func, ?array $args): void {
|
||||
function _each(CapacitorChannel $channel, $filter, ?callable $func, ?array $args): void {
|
||||
if ($func === null) $func = [$channel, "onEach"];
|
||||
$onEach = func::_prepare($func);
|
||||
if ($filter !== null && !is_array($filter)) $filter = ["_id" => $filter];
|
||||
$context = func::_prepare($func);
|
||||
$sqlite = $this->sqlite;
|
||||
$tableName = $channel->getTableName();
|
||||
$commited = false;
|
||||
|
@ -189,7 +191,7 @@ class SqliteCapacitor extends CapacitorStorage {
|
|||
$args ??= [];
|
||||
foreach ($rows as $row) {
|
||||
$item = unserialize($row['_item']);
|
||||
$updates = func::_call($context, [$item, $row, ...$args]);
|
||||
$updates = func::_call($onEach, [$item, $row, ...$args]);
|
||||
if (is_array($updates)) {
|
||||
if (array_key_exists("_item", $updates)) {
|
||||
$updates["_item"] = serialize($updates["_item"]);
|
||||
|
|
Loading…
Reference in New Issue