How to create Virtual Pages from API?

For a demo i need to show the client that i can connect to the Ninox API.

The following example works

<?php snippet( 'html-header') ?>


<?php

$response = Remote::get('https://api.ninoxdb.de/v1/teams/g2Y9XYZKvtJhTZCRW/databases/ck8hywuqzo7x/tables/A/records?page=1&perPage=15', [
  'headers' => [
    'Authorization: Bearer api-code',
    'Content-Type: application/json'
  ],
  
]);

$books = json_decode($response->content(), true)

?>
<ul class="books">
    <?php foreach ($books as $book): ?>
    <?php $b = $book['fields'] ?>
    <li>
      <?= $b['Titel'] ?>
    </li>
    <?php endforeach ?>
  </ul>
<?php snippet( 'html-footer') ?> 

Trying the Virtual Pages from API solution, but it doesn’t work.

This is the model

<?php

class ReviewsPage extends Page
{
    public function children()
    {
        $results = [];
        $pages   = [];
        $request = Remote::get('https://api.ninoxdb.de/v1/teams/g2Y9XYZKvtJhTZCRW/databases/ck8hywuqzo7x/tables/A/records?page=1&perPage=15', [
  'headers' => [
    'Authorization: Bearer api-key',
    'Content-Type: application/json'
  ],
  
]);

        if ($request->code() === 200) {
            $results = $request->json(false)->results;
        }

        foreach ($results as $key => $review) {
            $pages[] = [
                'slug'     => Str::slug($review->display_title),
                'num'      => $key+1,
                'template' => 'review',
                'model'    => 'review',
                'content'  => [
                    'title'    => $review->display_title,
                    'headline' => $review->headline,
                    'byline'   => $review->byline,
                    'summary'  => $review->summary_short,
                    'date'     => $review->publication_date,
                    'link'     => $review->link->url,
                    'linkText' => $review->link->suggested_link_text,
                    'cover'    => $review->multimedia->src
                ]
            ];
        }

        return Pages::factory($pages, $this);
    }
}

getting the following error

Trying to get property ‘results’ of non-object

if ($request->code() === 200) {
            $results = $request->json(false)->results;
        }

if i dump $request i`m getting the following

Kirby\Http\Remote Object
(
    [content] => [{"id":17,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Aus dem Hochland.","Auteur":"Achleitner, A.","PubJaar":1894,"ZoekJaar":1894,"Type":"boek","SISO":"SISO 830","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"16988"}},{"id":18,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Fels und Firn.","Auteur":"Achleitner, A.","Uitgever":"Bonz, A.","PubJaar":1895,"ZoekJaar":1895,"Type":"boek","SISO":"SISO 830","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"18400","Paginas":"VI, 249"}},{"id":19,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Grüne Brücke.","Auteur":"Achleitner, A.","PubJaar":1894,"ZoekJaar":1894,"Type":"boek","SISO":"SISO 830","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"16989"}},{"id":20,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Jerusalem; ein Zeitbild aus der heiligen Stadt","Auteur":"Achleitner, A.","Uitgever":"Kirchheim","PubJaar":1905,"ZoekJaar":1905,"Type":"boek","SISO":"SISO 992","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"15692","Paginas":"IV, 344"}},{"id":21,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Resche Luft!","Auteur":"Achleitner, A.","PubJaar":1894,"ZoekJaar":1894,"Type":"boek","SISO":"SISO 830","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"16003"}},{"id":22,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Garnison-Friedhof Hasenheide in Wort und Bild.","Auteur":"Borchert, W.","Uitgever":"Thormann","PubJaar":1930,"ZoekJaar":1930,"Type":"boek","SISO":"SISO 944.9","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"15709","Paginas":"80"}},{"id":23,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Der Jagdbischof.","Auteur":"Achleitner, A.","PubJaar":1898,"ZoekJaar":1898,"Type":"boek","SISO":"SISO 830","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"15715"}},{"id":24,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Die Namenlosen.","Auteur":"Dwinger, E.E.","Uitgever":"Diederichs, E.","PubJaar":1934,"ZoekJaar":1934,"Type":"boek","SISO":"SISO 830","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"18459","Paginas":"87"}},{"id":25,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"The Monroe-doctrine; a complete history.","Auteur":"Köhler, Ch.","Uitgever":"Little","PubJaar":1925,"ZoekJaar":1925,"Type":"boek","SISO":"SISO 944.9","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"17152","Paginas":"65"}},{"id":26,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Novellen.","Auteur":"Hense, P.","Uitgever":"Hertz","PubJaar":1874,"ZoekJaar":1874,"Type":"boek","SISO":"SISO 830","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"15502"}},{"id":27,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Lautes und Leises.","Auteur":"Dreijer, M.","Uitgever":"Meijer & Feffen","PubJaar":1912,"ZoekJaar":1912,"Type":"boek","SISO":"SISO 830","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"15772","Paginas":"198"}},{"id":28,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Briefe.","Auteur":"Hilty, G.","Uitgever":"Hinrich","PubJaar":1903,"ZoekJaar":1903,"Type":"boek","SISO":"SISO 830","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"40004","Paginas":"317"}},{"id":29,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Muscheln.","Auteur":"Kinau, R.","Uitgever":"Quickborn-Verlag","PubJaar":1927,"ZoekJaar":1927,"Type":"boek","SISO":"SISO 830","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"18481","Paginas":"126"}},{"id":30,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Die Meldung.","Auteur":"Jungnickel, M.","Uitgever":"Voigtländer","PubJaar":1933,"ZoekJaar":1933,"Type":"boek","SISO":"SISO 830","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"18343","Paginas":"64"}},{"id":31,"sequence":6,"createdAt":"2019-10-22T00:48:35","createdBy":"4qbkemj4CoBN4qXbo","modifiedAt":"2019-10-22T00:48:35","modifiedBy":"4qbkemj4CoBN4qXbo","fields":{"Titel":"Caesaren.","Auteur":"Wulle, R.","Uitgever":"Koenig","PubJaar":1934,"ZoekJaar":1934,"Type":"boek","SISO":"SISO 331.35","Herkomst":"boeken uit het bezit van keizer Wilhelm II","boeknr":"13949","Paginas":"100"}}]
    [curl] => Resource id #231
    [curlopt] => Array
        (
            [10002] => https://api.ninoxdb.de/v1/teams/g2Y9XYZKvtJhTZCRW/databases/ck8hywuqzo7x/tables/A/records?page=1&perPage=15
            [10102] => utf-8
            [78] => 10
            [13] => 10
            [58] => 1
            [19913] => 1
            [52] => 1
            [68] => 10
            [64] => 
            [42] => 
            [20079] => Closure Object
                (
                    [this] => Kirby\Http\Remote Object
 *RECURSION*
                    [parameter] => Array
                        (
                            [$curl] => 
                            [$header] => 
                        )

                )

            [10023] => Array
                (
                    [0] => Authorization: Bearer ...
                    [1] => Content-Type: application/json
                )

        )

    [errorCode] => 0
    [errorMessage] => 
    [headers] => Array
        (
            [Access-Control-Allow-Origin] => *
            [Access-Control-Allow-Methods] => POST, GET, PUT, DELETE, OPTIONS, HEAD
            [Access-Control-Max-Age] => 3600
            [Access-Control-Allow-Credentials] => true
            [Content-Type] => application/json; charset=utf-8
            [Content-Length] => 5804
            [ETag] => W/"16ac-/vmhNRqL74lq6U+NQZBzhTHdc70"
            [Date] => Sat, 02 Nov 2019 11:16:06 GMT
            [Strict-Transport-Security] => max-age=16000000; preload
        )

    [info] => Array
        (
            [url] => https://api.ninoxdb.de/v1/teams/g2Y9XYZKvtJhTZCRW/databases/ck8hywuqzo7x/tables/A/records?page=1&perPage=15
            [content_type] => application/json; charset=utf-8
            [http_code] => 200
            [header_size] => 394
            [request_size] => 253
            [filetime] => -1
            [ssl_verify_result] => 0
            [redirect_count] => 0
            [total_time] => 0.278303
            [namelookup_time] => 0.01807
            [connect_time] => 0.036171
            [pretransfer_time] => 0.091801
            [size_upload] => 0
            [size_download] => 5804
            [speed_download] => 20877
            [speed_upload] => 0
            [download_content_length] => 5804
            [upload_content_length] => -1
            [starttransfer_time] => 0.278163
            [redirect_time] => 0
            [redirect_url] => 
            [primary_ip] => 188.166.192.44
            [certinfo] => Array
                (
                )

            [primary_port] => 443
            [local_ip] => 192.168.1.6
            [local_port] => 63629
            [http_version] => 2
            [protocol] => 2
            [ssl_verifyresult] => 0
            [scheme] => HTTPS
        )

    [options] => Array
        (
            [agent] => 
            [body] => 1
            [data] => Array
                (
                )

            [encoding] => utf-8
            [file] => 
            [headers] => Array
                (
                    [0] => Authorization: Bearer ....
                    [1] => Content-Type: application/json
                )

            [method] => GET
            [progress] => 
            [test] => 
            [timeout] => 10
            [url] => https://api.ninoxdb.de/v1/teams/g2Y9XYZKvtJhTZCRW/databases/ck8hywuqzo7x/tables/A/records?page=1&perPage=15
        )

)

with

dump( json_decode($response->content(), true));

im getting the following

Array
(
    [0] => Array
        (
            [id] => 17
            [sequence] => 6
            [createdAt] => 2019-10-22T00:48:35
            [createdBy] => 4qbkemj4CoBN4qXbo
            [modifiedAt] => 2019-10-22T00:48:35
            [modifiedBy] => 4qbkemj4CoBN4qXbo
            [fields] => Array
                (
                    [Titel] => Aus dem Hochland.
                    [Auteur] => Achleitner, A.
                    [PubJaar] => 1894
                    [ZoekJaar] => 1894
                    [Type] => boek
                    [SISO] => SISO 830
                    [Herkomst] => boeken uit het bezit van keizer Wilhelm II
                    [boeknr] => 16988
                )

        )

    [1] => Array
        (
            [id] => 18
            [sequence] => 6
            [createdAt] => 2019-10-22T00:48:35
            [createdBy] => 4qbkemj4CoBN4qXbo
            [modifiedAt] => 2019-10-22T00:48:35
            [modifiedBy] => 4qbkemj4CoBN4qXbo
            [fields] => Array
                (
                    [Titel] => Fels und Firn.
                    [Auteur] => Achleitner, A.
                    [Uitgever] => Bonz, A.
                    [PubJaar] => 1895
                    [ZoekJaar] => 1895
                    [Type] => boek
                    [SISO] => SISO 830
                    [Herkomst] => boeken uit het bezit van keizer Wilhelm II
                    [boeknr] => 18400
                    [Paginas] => VI, 249
                )

        )

    [2] => Array
        (
            [id] => 19
            [sequence] => 6
            [createdAt] => 2019-10-22T00:48:35
            [createdBy] => 4qbkemj4CoBN4qXbo
            [modifiedAt] => 2019-10-22T00:48:35
            [modifiedBy] => 4qbkemj4CoBN4qXbo
            [fields] => Array
                (
                    [Titel] => Grüne Brücke.
                    [Auteur] => Achleitner, A.
                    [PubJaar] => 1894
                    [ZoekJaar] => 1894
                    [Type] => boek
                    [SISO] => SISO 830
                    [Herkomst] => boeken uit het bezit van keizer Wilhelm II
                    [boeknr] => 16989
                )

        )

    [3] => Array
        (
            [id] => 20
            [sequence] => 6
            [createdAt] => 2019-10-22T00:48:35
            [createdBy] => 4qbkemj4CoBN4qXbo
            [modifiedAt] => 2019-10-22T00:48:35
            [modifiedBy] => 4qbkemj4CoBN4qXbo
            [fields] => Array
                (
                    [Titel] => Jerusalem; ein Zeitbild aus der heiligen Stadt
                    [Auteur] => Achleitner, A.
                    [Uitgever] => Kirchheim
                    [PubJaar] => 1905
                    [ZoekJaar] => 1905
                    [Type] => boek
                    [SISO] => SISO 992
                    [Herkomst] => boeken uit het bezit van keizer Wilhelm II
                    [boeknr] => 15692
                    [Paginas] => IV, 344
                )

        )

    [4] => Array
        (
            [id] => 21
            [sequence] => 6
            [createdAt] => 2019-10-22T00:48:35
            [createdBy] => 4qbkemj4CoBN4qXbo
            [modifiedAt] => 2019-10-22T00:48:35
            [modifiedBy] => 4qbkemj4CoBN4qXbo
            [fields] => Array
                (
                    [Titel] => Resche Luft!
                    [Auteur] => Achleitner, A.
                    [PubJaar] => 1894
                    [ZoekJaar] => 1894
                    [Type] => boek
                    [SISO] => SISO 830
                    [Herkomst] => boeken uit het bezit van keizer Wilhelm II
                    [boeknr] => 16003
                )

        )

Since you are dealing with an array, you have to use array syntax:

 foreach ($results as $key => $review) {
            $pages[] = [
                'slug'     => Str::slug($review['display_title']),
                'num'      => $key+1,
                'template' => 'review',
                'model'    => 'review',
                'content'  => [
                    'title'    => $review['display_title'],
                     // etc
                   
                ]
            ];
        }

Hello Pixelijn, Thanks! it works now. But its extremely slow. Any ideas?


        if ($request->code() === 200) {
            $results = json_decode($request->content(), true);
        }

        foreach ($results as $book) {
            $b = $book['fields'];
            $pages[] = [
                'slug'     => Str::slug($b['boeknr']),
                'num'      => 0,
                'template' => 'review',
                'model'    => 'review',
                'content'  => [
                    'title'       => $b['Titel'],
                    'author'    => $b['Auteur'],
                    'year' => $b['ZoekJaar']

      
                ]
            ];
        }

        return Pages::factory($pages, $this);
    }
}