diff --git a/TODO.md b/TODO.md index 19e0c06..1c71852 100644 --- a/TODO.md +++ b/TODO.md @@ -21,5 +21,63 @@ ->all(); ``` déterminer le genre de traitements que l'on peut offrir +* syntaxe pour CTable: définition des en-têtes et des valeurs des colonnes dans + la même expression + ~~~php + new CTable($rows, [ + "contents" => [ + ## champ + ["Nom", "nom"], + ["Prénom", "prenom"], + ## fonction + ["Age", function(Cursor $cursor) { + return (new Date())->diff($cursor->row["date_naissance"]); + }], + ## Pas de contenu + ["Vide", null], + ## Contenu dynamique + ["Contenu", [ + "before", + v::span("hello"), + Cursor::dyn("name"), + "after", + Cursor::dyn(function(Cursor $cursor) { + return $cursor["surname"]; + }), + ]], + ## colspan + ["First", + function() { return "sur deux colonnes"; }, + "colspan" => 2, + ], + ["Second", null], + ## colspan dynamique + # la valeur de Element n'est évaluée que si colspan==null + ["Groupe", function(Cursor $row) { + $break = $breaker->shouldBreakOn($row["code_groupe"])); + if ($break) { + $row->set("colspan", 2); + return "{$row["code_groupe"]} {$row["libelle_groupe"]}"; + } else { + $row->set("colspan", null); + return null; + } + }, "colspan" => function(Cursor $row) { + return $row->get("colspan"); + }], + ["Element", function(Cursor $row) { + return $row["libelle_element"]; + }] + ], + ]); + ~~~ + bien entendu, bien que ce ne soit pas démontré ici, le premier argument + (l'en-tête) est un contenu, pas seulement une chaine +* Cursor::dyn permet d'insérer une valeur qui sera évaluée plus tard lors de la + résolution du contenu +* pour Cursor, CTable, etc., un paramètre "params_func" permet de générer une + partie des paramètres de façon dynamique. + c'est juste du sucre, c'est strictement équivalent à construire le tableau + des paramètres avant d'instancier l'objet. -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/nur_src/v/base/AbstractPageContainer.php b/nur_src/v/base/AbstractPageContainer.php index 260e607..db7eb81 100644 --- a/nur_src/v/base/AbstractPageContainer.php +++ b/nur_src/v/base/AbstractPageContainer.php @@ -269,23 +269,34 @@ abstract class AbstractPageContainer implements IPageContainer { $this->phase = self::SETUP_PHASE; if (self::ensure_setupc($page, false, $output)) { + if ($output === false) { + # désactiver la gestion des actions si le retour est false (retour en + # l'état) + $page->dispatchAction(false); + } $this->overrideSetup($page); $page->afterSetup(); } $this->phase = self::PRINT_PHASE; if ($output instanceof IComponent) { + # composant autonome self::ensure_phasec($output); if ($this->beforePrint($output)) { $this->haveOutput = true; co::_print([$output]); } } elseif (is_callable($output)) { + # générateur de contenu if ($this->beforePrint(null)) { $this->haveOutput = true; $output(); } + } elseif ($output === false) { + # retour en l'état (contenu déjà géré dans setup()) + $this->haveOutput = false; } elseif ($output !== null) { + # contenu json ou texte if ($this->beforePrint(null)) { $this->haveOutput = true; if (is_iterable($output)) { @@ -299,10 +310,11 @@ abstract class AbstractPageContainer implements IPageContainer { } echo "]"; } else { - co::_print([strval($output)]); + co::_write([strval($output)]); } } } else { + # afficher la page normalement $this->overridePrint($page); } } catch (Throwable $e) { diff --git a/nur_src/v/plugins/showmorePlugin.php b/nur_src/v/plugins/showmorePlugin.php index 483a011..62f1b41 100644 --- a/nur_src/v/plugins/showmorePlugin.php +++ b/nur_src/v/plugins/showmorePlugin.php @@ -49,6 +49,13 @@ class showmorePlugin extends BasePlugin { protected ?string $onShow; + protected bool $initialShow = false; + + function show(bool $show=true): self { + $this->initialShow = $show; + return $this; + } + function startc(): array { return v::sdiv(["class" => $this->containerClass]); } @@ -56,7 +63,10 @@ class showmorePlugin extends BasePlugin { function invite($vs=null): array { $vs ??= $this->inviteContent; return v::a([ - "class" => $this->inviteClass, + "class" => [ + $this->inviteClass, + "hidden" => $this->initialShow, + ], "href" => "#", $vs, ]); @@ -64,7 +74,10 @@ class showmorePlugin extends BasePlugin { function startp(): array { return v::sdiv([ - "class" => [$this->panelClass, "hidden"], + "class" => [ + $this->panelClass, + "hidden" => !$this->initialShow, + ], ]); } diff --git a/src/cache/CacheDataChannel.php b/src/cache/CacheDataChannel.php index 768b6d0..af885d6 100644 --- a/src/cache/CacheDataChannel.php +++ b/src/cache/CacheDataChannel.php @@ -4,7 +4,7 @@ namespace nulib\cache; use Closure; use IteratorAggregate; use nulib\cache\CacheChannel; -use nulib\cache\storage_cache; +use nulib\cache\cache; use nulib\cl; use nulib\db\CapacitorChannel; use Traversable; @@ -40,7 +40,7 @@ class CacheDataChannel extends CapacitorChannel implements IteratorAggregate { } function getIterator(): Traversable { - $cm = storage_cache::get(); + $cm = cache::get(); if ($cm->shouldUpdate($this->cacheIds)) { $this->capacitor->reset(); foreach (($this->builder)() as $key => $row) { diff --git a/src/cache/storage_cache.php b/src/cache/cache.php similarity index 80% rename from src/cache/storage_cache.php rename to src/cache/cache.php index 1fc6814..46f93b0 100644 --- a/src/cache/storage_cache.php +++ b/src/cache/cache.php @@ -1,13 +1,20 @@ getVarfile("cache.db"); + } + protected static ?CapacitorStorage $storage = null; static function set_storage(CapacitorStorage $storage): CapacitorStorage { @@ -15,7 +22,7 @@ class storage_cache { } protected static function get_storage(): CapacitorStorage { - return self::$storage ??= new SqliteStorage(""); + return self::$storage ??= new SqliteStorage(self::dbfile()); } protected static ?CacheChannel $channel = null; diff --git a/src/php/coll/Cursor.php b/src/php/coll/Cursor.php index f9a2bdb..bc5c9a3 100644 --- a/src/php/coll/Cursor.php +++ b/src/php/coll/Cursor.php @@ -1,6 +1,7 @@ ["?iterable"], "rows_func" => ["?callable"], @@ -70,10 +71,14 @@ class Cursor implements Iterator { /** un générateur de lignes */ private ?Traversable $rowsGenerator; - /** une fonction de signature function(mixed $rows, Cursor): ?iterable */ + /** + * une fonction de signature function(mixed $rows, Cursor): ?iterable + */ private ?func $rowsFunc; - /** une fonction de signature function(?array $row, Cursor): bool */ + /** + * une fonction de signature function(?array $row, Cursor): bool + */ private ?func $filterFunc = null; function setFilter(array $filter): self { @@ -89,7 +94,9 @@ class Cursor implements Iterator { return $this; } - /** une fonction de signature function(?array $row, Cursor): ?array */ + /** + * une fonction de signature function(?array $row, Cursor): ?array + */ private ?func $mapFunc = null; function setMap(array $map): self { @@ -105,7 +112,9 @@ class Cursor implements Iterator { return $this; } - /** une fonction de signature function(?array $row, Cursor): ?array */ + /** + * une fonction de signature function(?array $row, Cursor): ?array + */ private ?func $colsFunc = null; function setColsFunc(?callable $func): self { @@ -151,6 +160,50 @@ class Cursor implements Iterator { return null; } + function offsetExists($offset): bool { + return cl::has($this->row, $offset); + } + + function offsetGet($offset) { + return cl::get($this->row, $offset); + } + + function offsetSet($offset, $value): void { + cl::set($this->row, $offset, $value); + } + + function offsetUnset($offset): void { + cl::del($this->row, $offset); + } + + /** + * données de session: cela permet de maintenir certaines informations pendant + * le parcours des données + */ + protected ?array $data; + + /** @param string|int $key */ + function has($key): bool { + return cl::has($this->data, $key); + } + + /** @param string|int $key */ + function get($key) { + return cl::get($this->data, $key); + } + + /** @param string|int $key */ + function set($key, $value): void { + $this->data[$key] = $value; + } + + /** @param string|int $key */ + function del($key) { + $orig = cl::get($this->data, $key); + unset($this->data[$key]); + return $orig; + } + protected function convertToRow($raw): ?array { return cl::withn($raw); } @@ -177,6 +230,7 @@ class Cursor implements Iterator { $this->key = null; $this->raw = null; $this->row = null; + $this->data = null; if ($this->rowsGenerator !== null) { $rows = $this->rowsGenerator; if ($rows instanceof IteratorAggregate) $rows = $rows->getIterator(); @@ -223,6 +277,8 @@ class Cursor implements Iterator { $this->key = null; $this->raw = null; $this->row = null; + # ne pas toucher à data, l'utilisateur peut vouloir continuer à consulter + # les valeurs } return $valid; }