1
0
mirror of https://github.com/flextype/flextype.git synced 2025-08-08 14:16:46 +02:00

feat(shortcodes): add ability to parse nested shortcodes for entries shortcode

This commit is contained in:
Awilum
2022-05-25 19:31:21 +03:00
parent 39ff94f8a1
commit 66616bfa56
2 changed files with 14 additions and 3 deletions

View File

@@ -23,13 +23,14 @@ use function entries;
use function parsers;
use function registry;
// Shortcode: [entries]
// Shortcode: entries
// Usage: (entries fetch:'blog/post-1' field:'title')
parsers()->shortcodes()->addHandler('entries', static function (ShortcodeInterface $s) {
if (! registry()->get('flextype.settings.parsers.shortcodes.shortcodes.entries.enabled')) {
return '';
}
$varsDelimeter = $s->getParameter('varsDelimeter') ?: ',';
$varsDelimeter = ($s->getParameter('varsDelimeter') != null) ? parsers()->shortcodes()->parse($s->getParameter('varsDelimeter')) : ',';
$result = '';
foreach($s->getParameters() as $key => $value) {
@@ -38,6 +39,9 @@ parsers()->shortcodes()->addHandler('entries', static function (ShortcodeInterfa
$vars = $value !== null ? strings($value)->contains($varsDelimeter) ? explode($varsDelimeter, $value) : [$value] : [];
// Parse shortcodes for each var.
$vars = array_map(fn($v) => parsers()->shortcodes()->parse(is_string($v) ? $v : ''), $vars);
// Set options
if (isset($vars[1])) {
parse_str($vars[1], $options);
@@ -79,6 +83,9 @@ parsers()->shortcodes()->addHandler('entries', static function (ShortcodeInterfa
$vars = $value !== null ? strings($value)->contains($varsDelimeter) ? explode($varsDelimeter, $value) : [$value] : [''];
// Parse shortcodes for each var.
$vars = array_map(fn($v) => parsers()->shortcodes()->parse(is_string($v) ? $v : ''), $vars);
$result = collectionFromJson($result)->get($vars[0], $vars[1] ?? '');
}
}

View File

@@ -10,7 +10,7 @@ afterEach(function () {
filesystem()->directory(PATH['project'] . '/entries')->delete();
});
test('(entries-fetch] shortcode', function () {
test('entries shortcode', function () {
$this->assertTrue(entries()->create('blog', ['title' => 'Blog', 'categories' => "@type[array] (entries fetch:'blog,collection=true&filter[sort_by][key]=date&filter[sort_by][direction]=ASC' /)"]));
$this->assertTrue(entries()->create('blog/post-1', ['title' => 'Post 1']));
$this->assertTrue(entries()->create('blog/post-2', ['title' => 'Post 2']));
@@ -26,4 +26,8 @@ test('(entries-fetch] shortcode', function () {
$this->assertTrue(entries()->create('blog-3', ['title' => 'Blog', 'category-cat' => "(entries fetch:'categories/cat' field:'title2,Foo' /)"]));
expect(entries()->fetch('blog-3')['category-cat'])->toBe('Foo');
$this->assertTrue(entries()->create('shop', ['vars' => ['id' => 'shop', 'options' => 'collection=true', 'field' => 'title'], 'title' => 'Shop', 'products' => "@type[array] (entries fetch:'(var:id),(var:options)' field:'(var:field)' /)"]));
$this->assertTrue(entries()->create('shop/product-1', ['title' => 'Product 1']));
expect(count(entries()->fetch('shop')['products']))->toBe(1);
});