Country Select Field from Database in Panels - Approach and Debugging

I want to create a country select field in the backend and populate it with entries from my database.
After hours of trial and error I made it work, but I’d like to document it here and ask a few questions.


I went through the select field docs and tried to query a method from my corresponding page model in site/models/partner.php

class PartnerPage extends Kirby\Cms\Page
	public function getCountryList()
		$result = Db::table('phpwcms_country')->select('*');
		return $result->all();

This worked, but in case I need the method somewhere else I decided to create a plugin as recommended.

		'pageMethods' => [
			'getCountryList' => function () {
				$result = Db::table('phpwcms_country')->select('*');
				return $result->all();


  1. Is that the right approach?
  2. Is there a database request every time a page loads or only when the method is finally called in the panels (or in a controller)?

Then the configuration of the field in the panel (partner.yml) looks like this:

title: Partner

  changeTitle: false
  changeStatus: true
  changeSlug: false

  - width: 1/3
        label: Country
        type: select
        options: query
        # fetch the getCountryList method in mo/country-list plugin
          fetch: page.getCountryList
          # these are `arrayItem`
          value: "{{arrayItem.country_iso}}"
          text: "{{arrayItem.country_name_de}}"

What I found hard in the process of coming to this solution was mainly my inability to debug, what came back from the fetch: page.getCountryList. I finally tried arrayItem which, in hindsight makes sense, but on my way to that, I tried to convert the result set to an array, which was harder then I thought it would be.

I know I still miss a lot of knowledge of Kirby’s internals, but how do others debug panels and the ajax response? At the end I dumped $page->getCountryList() in a controller to inspect the output in the frontend just to see what comes back.

I might go ahead and try to get running, which I can highly recommend - it will output var dumps into a Chrome/Firefox panel and keeps the ajax requests intact.