1

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?

M.E.
  • 4,955
  • 4
  • 49
  • 128
  • Possible duplicate of [Decoding JSON in Twig](https://stackoverflow.com/questions/14500698/decoding-json-in-twig) – goto Feb 28 '18 at 12:13

1 Answers1

1

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>
Jacobm001
  • 4,431
  • 4
  • 30
  • 51