getgrav / getgrav/grav-plugin-shortcode-core

Shortcode classes load assets from a wrong function

Open
#124 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
PHP
Stars
47
Forks
17
PR merge metrics
No merged PRs in 30d

Description

I'm trying out `shortcodes-core` v5.2.0 and it appears that default shortcode classes load assets from the handler function, i.e. each time it is called to process the shortcode on a page. E.g. in `FontAwesomeShortcode` there is:

https://github.com/getgrav/grav-plugin-shortcode-core/blob/dc33833d77d2acf285384fcacf9d0e2e2c6787a8/classes/shortcodes/FontAwesomeShortcode.php#L11-L15

This is ineffective and also may lead to problems with processing shortcodes in certain situations. One such situation is the default error page of the Quark theme. If I add a shortcode to the default `footer.html.twig` template using this form:

```twig
{{ '[fa=grav extras=fab/]'|shortcodes|raw }}
```

then the icon won't display because `fontawesome.css` (whatever is configured in `plugins.shortcode-core.fontawesome.url`) is not loaded on the page Grav generates as a result of accessing an invalid URL on the web site (basically, a default `grav-admin-v1.7.46` installation). Please note that in order to reproduce the problem you need to remove loading Grav-supplied FontAwesome from `stylesheets` block of the default Quark's `base.html.twig` template (or the icon will come from there, of course).

It's worth mentioning that the shortcode itself is handled fine in this place using the `shortcode` Twig filter. I.e. I get

```html

```

in the resulting page's HTML. It's only that `fontawesome.css` is not there, so the browser doesn't know where to get `fab` and `fa-grav` styles from and displays nothing.

If I move the `addAssets` call out of the handler function to the `init` function like this:

```php
public function init()
{
// Load assets if required
if ($this->config->get('plugins.shortcode-core.fontawesome.load', false)) {
$this->shortcode->addAssets('css', $this->config->get('plugins.shortcode-core.fontawesome.url'));
}

$this->shortcode->getHandlers()->add('fa', function(ShortcodeInterface $sc) {
```

then all starts to work smoothly — the CSS is there and the icon "magically" appears.

I'm not a PHP/Twig/Grav expert but I guess the reason is that by the time when the handler function is executed while generating the error page, its assets are already processed by Grav so `addAssets` has no effect. It's not the case with the `init` call because it seems to be called somewhere at the very beginning, so the CSS asset is correctly added to every involved page.

And as I mentioned before, it really makes no sense to call `addAssets` each time the shortcode gets processed. It's a meaningless waste of resources.

Grepping in `/user/plugins/shortcode-core/classes/shortcodes` for `addAssets` shows that `SafeEmailShortcode.php` and `NoticeShortcode.php` suffer from exactly the same problem. Asset loading should be done once and `init` itself is a perfect place for that IMO.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.