diff --git a/PhpEcho.php b/PhpEcho.php
index b1da68d..ff1afbe 100644
--- a/PhpEcho.php
+++ b/PhpEcho.php
@@ -34,7 +34,7 @@
use const DIRECTORY_SEPARATOR;
/**
- * PhpEcho : Native PHP Template engine: One class to rule them all ;-)
+ * PhpEcho: Native PHP Template engine: One class to rule them all ;-)
*
* @author rawsrc
* @copyright MIT License
@@ -120,6 +120,7 @@ class PhpEcho
private static bool $std_helpers_injected = false;
private static bool $opt_return_null_if_not_exist = false;
private static string $opt_seek_value_mode = 'parents'; // parents | root
+ private static bool $opt_detect_infinite_loop = false;
//region MAGIC METHODS
/**
@@ -392,6 +393,14 @@ public static function setSeekValueMode(string $mode): void
throw new InvalidArgumentException("unknown.seek.mode.value.{$mode}");
}
}
+
+ /**
+ * To be deactivated in production, time-consuming routine
+ */
+ public static function setDetectInfiniteLoop(bool $p): void
+ {
+ self::$opt_detect_infinite_loop = $p;
+ }
//endregion OPTIONS
/**
@@ -476,7 +485,7 @@ public function offsetSet(mixed $offset, mixed $value): void
/**
* The returned value is escaped
*
- * Some types are preserved : true bool, true int, true float, PhpEcho instance, object without __toString()
+ * Some types are preserved: true bool, true int, true float, PhpEcho instance, object without __toString()
* For array of PhpEcho blocks, the array is imploded and the blocks are rendered int the order they appear
* Otherwise, the value is cast to a string and escaped
*
@@ -643,7 +652,9 @@ private function addChild(PhpEcho $p): void
{
$this->children[] = $p;
$p->parent = $this;
- $this->detectInfiniteLoop();
+ if (self::$opt_detect_infinite_loop) {
+ $this->detectInfiniteLoop();
+ }
}
private function unsetChild(mixed $offset): void
diff --git a/README.md b/README.md
index 100eb1e..0427c71 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,9 @@
# **PhpEcho**
-`2023-09-24` `PHP 8.0+` `6.1.0`
+`2023-09-26` `PHP 8.0+` `6.1.1`
## **A native PHP template engine : One class to rule them all**
## **IS ONLY FOR PHP 8 AND ABOVE**
--[English version](README_en.md)
--[Version française](README_fr.md)
\ No newline at end of file
+- [English version](README_en.md)
+- [Version française](README_fr.md)
\ No newline at end of file
diff --git a/README_en.md b/README_en.md
index 2b68c5c..7fae5c1 100644
--- a/README_en.md
+++ b/README_en.md
@@ -36,6 +36,7 @@ let your IDE list all your helpers natively just using PHPDoc syntax.
2. [Configuration](#configuration)
1. [View root dir](#view-root-dir)
2. [Seek option](#seek-option)
+ 3. [Detect infinite loop](#detect-infinite-loops)
3. [Parameters](#parameters)
4. [Principles and overview](#principles-and-overview)
5. [Let's start](#lets-start)
@@ -90,6 +91,20 @@ first level of the array of vars attached to any `PhpEcho` block.
More: [User values](#user-values)
+### **DETECT INFINITE LOOPS**
+By default, the engine is in production mode and does not intercept the infinite loops
+that may be caused by the mechanism of blocks inclusion. If you want the engine to detect that,
+just set the option:
+```php
+` de n'importe quel bloc enfant
-* détection d'inclusion infinie
+* détection d'inclusion infinie sur option
Vous serez également en mesure d'étendre les fonctionnalités du moteur en créant vos propres assistants
tout en laissant votre EDI les lister rien qu'en utilisant la syntaxe PHPDoc.
1. [Installation](#installation)
2. [Configuration](#configuration)
- 1. [Répertoire racine de toutes les vues](#répertoire-racine-de-toutes-les-vues)
- 2. [recherche des valeurs](#recherche-des-valeurs)
+ 1. [Répertoire racine de toutes les vues](#répertoire-racine-de-toutes-les-vues)
+ 2. [Recherche des valeurs](#recherche-des-valeurs)
+ 3. [Détection des boucles d'inclusions infinies](#détection-des-boucles-dinclusions-infinies)
3. [Paramètres](#paramètres)
4. [Principes and généralités](#principes-et-généralités)
5. [Démarrage](#démarrage)
- 1. [Exemple rapide](#exemple-rapide)
- 2. [Codage standard](#codage-standard)
- 3. [Contexte HTML](#contexte-html)
- 1. [Mise en page - Layout](#mise-en-page---layout)
- 2. [Formulaire](#formulaire)
- 3. [Page](#page)
+ 1. [Exemple rapide](#exemple-rapide)
+ 2. [Codage standard](#codage-standard)
+ 3. [Contexte HTML](#contexte-html)
+ 1. [Mise en page - Layout](#mise-en-page---layout)
+ 2. [Formulaire](#formulaire)
+ 3. [Page](#page)
6. [Blocs enfants](#blocs-enfants)
7. [Accès à la balise HEAD](#accès-à-la-balise-head)
8. [Valeurs utilisateurs](#valeurs-utilisateur)
- 1. [Recherche de clés](#recherche-de-clés)
- 2. [Clé non trouvée](#clé-non-trouvée)
+ 1. [Recherche de clés](#recherche-de-clés)
+ 2. [Clé non trouvée](#clé-non-trouvée)
9. [Échappement automatique des valeurs](#échappement-automatique-des-valeurs)
10. [Tableau d'instances de PhpEcho](#tableau-dinstances-de-phpecho)
11. [Utilisation d'une vue par défaut](#utilisation-dune-vue-par-défaut)
@@ -90,7 +91,21 @@ n'est pas trouvée, il grimpe tous les blocs parents jusqu'à la racine.
Veuillez noter que la recherche n'est limitée qu'au premier niveau de chaque
tableau de valeurs.
-Suite: [Valeurs utilisateur](#valeurs-utilisateur)
+Suite : [Valeurs utilisateur](#valeurs-utilisateur)
+
+### **DÉTECTION DES BOUCLES D'INCLUSIONS INFINIES**
+Par défaut le moteur est en mode production et n'interceptera pas les boucles infinies
+d'inclusion de blocs vues. Si vous souhaitez détecter la présence de ces boucles, il suffit
+de définir l'option ainsi :
+```php
+
+1. New option to enable the infinite loop detection `setDetectInfiniteLoop(bool $p)`, disabled by default
+
**Changelog 6.1.0**
1. New options to parameter the engine values extractor using `setSeekValueMode(string $mode)`, `$mode` among `current|parents|root`
2. If the current block is not able to provide a value to be rendered then the engine will automatically seek for it using the `seekValueMode` parameter
diff --git a/tests/README.md b/tests/README.md
index 0ed8f4f..82fad8e 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -1,6 +1,6 @@
# PhpEcho : a native PHP templating engine in one class
-`2023-09-24` `PHP 8.0+` `6.1.0`
+`2023-09-26` `PHP 8.0+` `6.1.1`
## TESTS
diff --git a/tests/global_tests_result.jpg b/tests/global_tests_result.jpg
index 968931f..126ba71 100644
Binary files a/tests/global_tests_result.jpg and b/tests/global_tests_result.jpg differ
diff --git a/tests/infinite_loop.php b/tests/infinite_loop.php
index 4d2accf..9600717 100644
--- a/tests/infinite_loop.php
+++ b/tests/infinite_loop.php
@@ -24,6 +24,8 @@
echo $layout;
$html = ob_get_clean();
+PhpEcho::setDetectInfiniteLoop(true);
+
$pilot->run(
id: 'infinite_loop_01',
test: fn() => $html,
@@ -48,6 +50,20 @@
$pilot->run(
id: 'infinite_loop_02',
test: fn() => (string)$layout,
- description: 'infinite loop, block calling each others'
+ description: 'infinite loop, block calling each others, infinite loop detection is on',
+);
+$pilot->assertException(InvalidArgumentException::class);
+
+
+/* SERVER CRASH: INFINITE LOOP IS NOT DETECTED
+PhpEcho::setDetectInfiniteLoop(false);
+$layout = new PhpEcho(file: 'layout_07.php', id: 'root');
+$layout['block'] = new PhpEcho(file: 'block/block_07.php');
+
+$pilot->run(
+ id: 'infinite_loop_03',
+ test: fn() => (string)$layout,
+ description: 'infinite loop, block calling each others, infinite loop detection is off',
);
$pilot->assertException(InvalidArgumentException::class);
+*/
diff --git a/tests/tests.php b/tests/tests.php
index 835d13f..d12a28a 100644
--- a/tests/tests.php
+++ b/tests/tests.php
@@ -14,7 +14,7 @@
use Exacodis\Pilot;
-$pilot = new Pilot('PhpEcho - A native PHP template engine - v.6.1.0');
+$pilot = new Pilot('PhpEcho - A native PHP template engine - v.6.1.1');
$pilot->injectStandardHelpers();
include 'filepath.php';