From 9863f5a91908b1fa156a458d7db2c15435ed8eb1 Mon Sep 17 00:00:00 2001 From: Edoardo Cavazza Date: Wed, 6 Nov 2024 09:29:29 +0100 Subject: [PATCH] Use PlaceholdersBehavior to extract placeholders from translated fields (#104) * Use placeholders regex instead of its offest for translated fields * Update placeholders test * Update placeholders tests * Fix placeholder test (again) * Fix placeholder test (again again) * Use PlaceholdersBehavior extractPlaceholders method * Sort dependencies * Update placeholders mock data --- composer.json | 4 +++- src/View/Helper/PlaceholdersHelper.php | 19 ++++++++++++++----- .../View/Helper/PlaceholdersHelperTest.php | 14 ++++++-------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index 8d5223b..5405937 100644 --- a/composer.json +++ b/composer.json @@ -7,7 +7,7 @@ "php": ">=8.1", "ext-intl": "*", "ext-json": "*", - "bedita/core": "^5.0.0", + "bedita/core": "^5.14.0", "bedita/i18n": "^4.0", "cakephp/cakephp": "^4.0", "cakephp/authentication": "^2.0", @@ -15,11 +15,13 @@ "chialab/ip": "^1.0" }, "require-dev": { + "bedita/placeholders": "^2.0", "cakephp/cakephp-codesniffer": "^5.0", "cakephp/plugin-installer": "^1.0", "phpunit/phpunit": "~8.5.0 || ^9.3" }, "suggest": { + "bedita/placeholders": "To manage placeholders in templates", "chialab/rna-cakephp": "To manage JavaScript and CSS bundles with RNA" }, "autoload": { diff --git a/src/View/Helper/PlaceholdersHelper.php b/src/View/Helper/PlaceholdersHelper.php index 996821c..0adeb80 100644 --- a/src/View/Helper/PlaceholdersHelper.php +++ b/src/View/Helper/PlaceholdersHelper.php @@ -4,9 +4,9 @@ namespace Chialab\FrontendKit\View\Helper; use BEdita\Core\Model\Table\ObjectTypesTable; +use BEdita\Placeholders\Model\Behavior\PlaceholdersBehavior; use Cake\Datasource\EntityInterface; use Cake\ORM\Locator\LocatorAwareTrait; -use Cake\Utility\Hash; use Cake\View\Helper; use InvalidArgumentException; use Iterator; @@ -103,15 +103,24 @@ public static function defaultTemplater(EntityInterface $entity, string $field, } $deltas = []; + $extracted = PlaceholdersBehavior::extractPlaceholders($entity, [$field]); + $getInfo = function (array $extracted, int $id, string $field): array { + foreach ($extracted as $it) { + if ($it['id'] === $id) { + return $it['params'][$field] ?? []; + } + } + + return []; + }; + foreach ($placeholders as $placeholder) { - $info = Hash::get($placeholder, ['relation', 'params', $field], []); + $info = $getInfo($extracted, $placeholder['id'], $field); foreach ($info as $i) { $offset = $i['offset']; $delta = array_sum(array_filter( $deltas, - function (int $pos) use ($offset): bool { - return $pos < $offset; - }, + fn (int $pos): bool => $pos < $offset, ARRAY_FILTER_USE_KEY )); $length = $i['length']; diff --git a/tests/TestCase/View/Helper/PlaceholdersHelperTest.php b/tests/TestCase/View/Helper/PlaceholdersHelperTest.php index 1c6a497..8720a6e 100644 --- a/tests/TestCase/View/Helper/PlaceholdersHelperTest.php +++ b/tests/TestCase/View/Helper/PlaceholdersHelperTest.php @@ -75,7 +75,7 @@ public function setUp(): void 'params' => [ 'body' => [[ 'offset' => 15, - 'length' => 18, + 'length' => 25, ]], ], ], @@ -88,11 +88,9 @@ public function setUp(): void 'relation' => [ 'params' => [ 'body' => [[ - 'offset' => 37, - 'length' => 18, - 'params' => [ - 'class' => 'test', - ], + 'offset' => 44, + 'length' => 25, + 'params' => '{"class":"test"}', ]], ], ], @@ -101,7 +99,7 @@ public function setUp(): void $this->object = new ObjectEntity([ 'id' => 1, 'type' => 'objects', - 'body' => '

Hello World

', + 'body' => '

Hello World

', 'placeholder' => [$this->image1, $this->image2], ]); } @@ -152,7 +150,7 @@ public function testGetTemplate() */ public function testDefaultTemplater() { - $contents = $this->Placeholders::defaultTemplater($this->object, 'body', [$this->image1, $this->image2], fn ($entity, $params) => sprintf('%s %s', $entity->title, $params ? json_encode($params) : '')); + $contents = $this->Placeholders::defaultTemplater($this->object, 'body', [$this->image1, $this->image2], fn ($entity, $params) => sprintf('%s %s', $entity->title, $params ? $params : '')); $this->assertSame('

Hello World image1

image2 {"class":"test"}', $contents); }