Search code examples
twiggrav

Grav - Pass JSON data from Plugin to Twig


I want to retrieve a JSON from a webservice and incorporate it into a Twig template.

I went through the docs and I found that I could use this option.

I have followed the steps from the doc and I have prepared this plugin:

/var/www/html/grav/user/plugins/category# ls
category.php  category.yaml  twig
/var/www/html/grav/user/plugins/category# cat category.yaml
enabled: true
/var/www/html/grav/user/plugins/category# cat category.php
<?php
namespace Grav\Plugin;
use \Grav\Common\Plugin;
class CategoryPlugin extends Plugin
{
    public static function getSubscribedEvents()
    {
        return [
            'onTwigExtensions' => ['onTwigExtensions', 0]
        ];
    }
    public function onTwigExtensions()
    {
        require_once(__DIR__ . '/twig/CategoryTwigExtension.php');
        $this->grav['twig']->twig->addExtension(new CategoryTwigExtension());
    }
}
/var/www/html/grav/user/plugins/category# cat twig/CategoryTwigExtension.php
<?php
namespace Grav\Plugin;
class CategoryTwigExtension extends \Twig_Extension
{
        public function getName()
        {
                return 'CategoryTwigExtension';
        }
        public function getFunctions()
        {
                return [
                        new \Twig_SimpleFunction('get_child_category', [$this, 'getChildCategoryFunction'])
                ];
        }
        public function getChildCategoryFunction()
        {
                $json = file_get_contents('http://localhost:8888/get_child_category/2/es_ES');
                $obj = json_decode($json);
                return $json;
        }
}

I then incorporate the following function invocation in the Twig template:

{{ get_child_category() }}

But:

  • I can get $json string, but how can I pass the whole JSON data and retrieve individually the fields?

In my case if I use:

<span>{{ get_child_category() }}</span>

in Twig I get the following string:

[{"id": 11, "name": "Racoons"}, {"id": 10, "name": "Cats"}]

How would I access individual records in Twig, including iteration over the JSON array and individual field extraction (id, name) for each record?


Solution

  • Your function is returning an array. You need to iterate through it. Here is an example from the Grav docs.

    <ul>
        {% for cookie in cookies %}
        <li>{{ cookie.flavor }}</li>
        {% endfor %}
    </ul>
    

    A simple list of names from your example is a simple edit.

    <ul>
        {% for child in get_child_category() %}
        <li>{{ child.name }}</li>
        {% endfor %}
    </ul>