includeCache directive

This commit is contained in:
Martijn de Boer 2024-03-23 11:52:17 +01:00
parent 153d3fe0b8
commit 0e92b78d33
2 changed files with 30 additions and 5 deletions

View file

@ -1,8 +1,17 @@
<?php <?php
class Cache { class Cache {
protected static $includeCache = [];
protected static $templateCache = []; protected static $templateCache = [];
protected static $resourceCache = []; protected static $resourceCache = [];
public static function getIncludeCache(string $name) {
return isset(self::$includeCache[$name]) ? self::$includeCache[$name] : null;
}
public static function setIncludeCache(string $name, $data) {
self::$includeCache[$name] = $data;
}
public static function getTemplateFromCache(string $name) { public static function getTemplateFromCache(string $name) {
if (isset(self::$templateCache[$name])) { if (isset(self::$templateCache[$name])) {
return self::$templateCache[$name]; return self::$templateCache[$name];

View file

@ -30,16 +30,32 @@ class Template {
$class->pretransform(); $class->pretransform();
// Replace includes of templates // Replace includes of templates
$matches = array(); $matches = array();
preg_match_all("/{{include (.*\.html)(.*)}}/", $contents, $matches); preg_match_all("/{{(include|includeCached) (.*\.html)(.*)}}/", $contents, $matches);
for ($i = 0; $i < count($matches[1]); $i++) { for ($i = 0; $i < count($matches[1]); $i++) {
$matchString = $matches[0][$i]; $matchString = $matches[0][$i];
$match = $matches[1][$i]; $method = $matches[1][$i];
$options = trim($matches[2][$i]); $match = $matches[2][$i];
$options = trim($matches[3][$i]);
if ($method === "includeCached") {
$crc = hash("crc32b", $match . $options);
$include = Cache::getIncludeCache($crc);
if (!is_null($include)) {
$contents = str_replace($matchString, $include, $contents);
continue;
}
}
$include = new Template(dirname($this->template) . "/" . $match, $this->data); $include = new Template(dirname($this->template) . "/" . $match, $this->data);
$contents = str_replace($matchString, $include->render( $rendered = $include->render(
!empty($options) ? json_decode($options, false, 512, JSON_THROW_ON_ERROR) : null !empty($options) ? json_decode($options, false, 512, JSON_THROW_ON_ERROR) : null
), $contents); );
if ($method === "includeCached") {
Cache::setIncludeCache($crc, $rendered);
}
$contents = str_replace($matchString, $rendered, $contents);
} }
$class->transform(); $class->transform();