diff --git a/src/flextype/core/Entries/Directives/FieldsDirective.php b/src/flextype/core/Entries/Directives/FieldsDirective.php new file mode 100644 index 00000000..a1936d18 --- /dev/null +++ b/src/flextype/core/Entries/Directives/FieldsDirective.php @@ -0,0 +1,35 @@ +addListener('onEntriesFetchSingleDirectives', static function (): void { + + if (! registry()->get('flextype.settings.entries.directives.fields.enabled')) { + return; + } + + $field = entries()->registry()->get('methods.fetch.field'); + $entry = entries()->registry()->get('methods.fetch.result'); + + if (is_string($field)) { + $field = preg_replace_callback('/@field\((.*?)\)/', function($matches) use ($entry) { + return $entry[$matches[1]] ?? ''; + }, $field); + } + + entries()->registry()->set('methods.fetch.field', $field); +}); \ No newline at end of file diff --git a/src/flextype/settings.yaml b/src/flextype/settings.yaml index 09a55b29..f31736c4 100644 --- a/src/flextype/settings.yaml +++ b/src/flextype/settings.yaml @@ -90,6 +90,9 @@ entries: constants: enabled: true path: "/src/flextype/core/Entries/Directives/ConstantsDirective.php" + fields: + enabled: true + path: "/src/flextype/core/Entries/Directives/FieldsDirective.php" macros: debug: false php: diff --git a/tests/fixtures/settings/settings.yaml b/tests/fixtures/settings/settings.yaml index a79bdaa2..4805188c 100644 --- a/tests/fixtures/settings/settings.yaml +++ b/tests/fixtures/settings/settings.yaml @@ -86,6 +86,9 @@ entries: constants: enabled: true path: "/src/flextype/core/Entries/Directives/ConstantsDirective.php" + fields: + enabled: true + path: "/src/flextype/core/Entries/Directives/FieldsDirective.php" macros: debug: false php: diff --git a/tests/src/flextype/core/Entries/Directives/FieldsDirectiveTest.php b/tests/src/flextype/core/Entries/Directives/FieldsDirectiveTest.php new file mode 100644 index 00000000..5bbbdde4 --- /dev/null +++ b/tests/src/flextype/core/Entries/Directives/FieldsDirectiveTest.php @@ -0,0 +1,16 @@ +directory(PATH['project'] . '/entries')->create(); +}); + +afterEach(function (): void { + filesystem()->directory(PATH['project'] . '/entries')->delete(); +}); + +test('fields directive', function () { + entries()->create('field', ['foo' => '@field(id)']); + $this->assertEquals('field', entries()->fetch('field')['foo']); +}); \ No newline at end of file