Content from a spreadsheet
Sometimes Excel or Numbers are fantastic content management systems. In this example we will create pages from a simple CSV file that could come from any spreadsheet.
In this example we are going to read a list of (dummy) animals from a CSV file and create virtual pages for each animal.
Note: For this example we are using a .csv
file where fields are separated by a semi-colon. If you are using other separators in your own file, change the separator parameter when calling the csv()
method below accordingly.
The parent content folder
Let's create an animals folder for our site, which is used as the parent for all animal subpages.
We can put the animals.csv directly inside this folder to make it nice and clean to read data from that file. You could even provide an uploader for this in the panel later, so your content editors can update the csv file whenever they have a fresh export with updated data.
Reading from the CSV
To convert the CSV from the file to a PHP array we are going to use a little csv()
helper function. This function is stored in a small plugin. It takes the absolute path to the csv file and returns a nice and clean array.
Creating the virtual subpages
We are using a new page model for the animals page, which will read from the csv and create a virtual child page for each animal on the fly.
Unless you have disabled UUIDs in your config, you have to pass a uuid
field in the content array to prevent Kirby from generating the page in the file system when the $page->uuid()
method is called.
If you generate the UUIDs automatically like in the example above, they will change at every load. However, if you want to reference your virtual pages anywhere with their UUID, make sure to use a unique string that does not change.
The template
With the new page model, we can now render all animals in our animals.php
template as if they were regular Kirby pages.
Subpages
Each animal will automatically get its own subpage. Routing will work out of the box and you can create an animal.php
template to render each individual animal.