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;
}