Skip to content

add cache block - #357

Open
Bournwog wants to merge 2 commits into
modx-pro:masterfrom
Bournwog:patch-6
Open

add cache block#357
Bournwog wants to merge 2 commits into
modx-pro:masterfrom
Bournwog:patch-6

Conversation

@Bournwog

Copy link
Copy Markdown
Contributor

{cache 'app/block1' lifetime=60}
content to be cached for one minute
{/cache}

@Ibochkarev Ibochkarev left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Идея полезной — {cache} в Fenom закрывает реальный use case. В текущем виде мержить рано: есть расхождение с microMODXCacheManager и баг с falsy-контентом.

До merge:

  1. Убрать options из set() (в обёртке их сознательно нет из-за security).
  2. Cache miss проверять через === false / === null, не через !.
  3. Либо убрать options совсем, либо аккуратно оставить только для get() с безопасным default ('array()' как code-string).
  4. Привести стиль к остальному файлу.

На шаблоны без {cache} PR сам по себе не влияет.

$cname = $scope->tpl->parsePlainArg($tokens, $name);
$params = [
'lifetime'=>0,
'options'=>[],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

options default

Дефолт 'options' => [] — PHP-массив, а Fenom parseParams обычно ждёт code-string'и. Для пустого дефолта Compiler::toArray([]) ещё ок, но при options=$foo в toArray() попадёт строка выражения и foreach разберёт её по символам.

Лучше: убрать options совсем, либо default как 'options' => 'array()' и явно валидировать значение.

];
$params = $scope->tpl->parseParams($tokens, $params);

if (!$name) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Только static name

parsePlainArg + if (!$name) означает, что {cache $key} не скомпилируется. Ок как ограничение, но стоит явно описать в docs/PR: имя только строковый литерал.

$scope['var'] = $scope->tpl->tmpVar();

return "{$scope['var']} = \$var[\"_modx\"]->cacheManager->get({$scope['name']},".Fenom\Compiler::toArray($scope['params']['options']).");\n
if(!{$scope['var']} ) { \n

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cache miss

if (!{$scope['var']}) ломает кэш пустого/нулевого контента ('', '0' и т.п.) — каждый раз будет miss.

Нужно что-то вроде:

if ({$scope['var']} === false || {$scope['var']} === null) {

(как обычно отдаёт miss у MODX cacheManager).

function($tokens, $scope){
return "
{$scope['var']} = ob_get_clean(); \n
\$var[\"_modx\"]->cacheManager->set({$scope['name']},{$scope['var']},{$scope['params']['lifetime']},".Fenom\Compiler::toArray($scope['params']['options']).");\n

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

set() + options — blocker

microMODXCacheManager::set($key, &$var, $lifetime = 0) принимает только 3 аргумента. Четвёртый options сознательно убран:

// $options is not used due to security reasons
return $this->cacheManager->set($key, $var, $lifetime);

Здесь options снова протаскиваются в set(). Нужно:

\$var[\"_modx\"]->cacheManager->set({$scope['name']}, {$scope['var']}, {$scope['params']['lifetime']});

без 4-го аргумента.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants