Get data from field (json)

Hello, I am very new to Kirby and I am a frontend dev, PHP is not my strong suit.

What am I doing wrong here? How do I get the input content for ‘carousel0’ field?

My template has this:
fields: carousel0: label: Carousel 1 title type: textarea width: 2/4

My homeapi.php:
$json = array( 'title' => (string)$page->title(), 'carousel0' => (string)$page->get('carousel0') );

It outputs:
{"title":"Kirby Starterkit","carousel0":null}

Should be:

$json = array(
'title' => (string)$page->title(),
'carousel0' => (string)$page->carousel0()
);

The $page->get() method does not exist.

Tried that before, but it returns:
{"title":"Kirby Starterkit","carousel0":""}

and I am sure the field has content:

Could you please post the content of the content/home/home.txt file?

Maybe your field is called differently, it should work if the field exists and if it has content.

I guess it’s getting there, this is what I have and I guess this is the worng part:

content/home/home.txt (is the one updated by the cms)
content/home/api/homeapi.txt (does not reflect the changes to home.txt)

Ok, so you are on the homepage and want to fetch the contents of the homeapi page?

$json = array(
'title' => (string)page('home/api')->title(),
'carousel0' => (string)page('home/api')->carousel0()
);

Or

$page->find('api')->title();

I think it’s the other way around, calling the /home/api URL (so the page data will be from content/home/api/homeapi.txt) and trying to show data from the home page (content/home/home.txt).

You could write a route config entry + function:
https://getkirby.com/docs/developer-guide/advanced/routing

Or even a generic JSON route:

// Pattern: ([a-z0-9\/]).json
function($uri) {
  $page = page($uri);
  if (!$page) return false;
  // or make a Response object using fields from $page,
  // converted to JSON
};

@fvsch, yes, you are right, I completely overlooked that; it’s about the homeapi.php.

So in the homeapi.php you would then fetch the content from the home page like this:

$json = array(
'title' => (string)page('home')->title(),
'carousel0' => (string)page('home')->carousel0()
);

If you use a route as @fvsch suggested is more versatile and you don’t even need the api folder.

For instance with this you can return the raw field data for any page in the site as a JSON response:

c::set('routes', [
   // Return a page's full content as JSON, for any page.
   // (Would need a bit more work for a multilingual site.)
   [
      'pattern' => '([a-z0-9\\/]+).json',
      'action'  => function($uri) {
         $page = page($uri);
         if (!$page) {
            $content = '{}';
            if ($errorPage = page(c::get('error', 'error'))) {
               $content = ['title' => $errorPage->title()->value];
            }
            return new Response($content, 'json', 404);
         }
         return new Response($page->content()->toArray(), 'json', 200);
      }
   ]
]);

Calling /home.json, /some/other/page.json etc.

Of course you will probably want to be more specific. Eg. only returning a JSON response for some pages or only returning some of the fields (perhaps even with some transformations, like returning HTML content instead of Markdown/Kirbytext).

this made me realise I don’t need: /content/home/api/…

I am only using kirby to export the json, all I needed was to write the json output on /templates/home.php, now everything works well.

Thanks a lot you all!