Create pages from a database and edit, add or delete entries in the Panel
Content can also come from a database. This is particularly useful if you already have a large set of data stored in a MySQL or other relational database, like a huge database of products or articles. In only a few steps you can transform data from those databases into Kirby pages that behave like any Kirby page in the frontend, i.e. you can use Kirby's API to access, filter or search content, and edit it in the Panel together with all your file based content.
This guide is a short intro into how to create pages from entries in a database table. It is intended as an outline, not a final solution. With lots of entries it would also become necessary to work on a custom collection for the result set that would only fetch the rows it really needs, but this would be more complex.
The example assumes a database table called comments with the following columns:
Create a parent page called
comments in the content folder.
config.php, connect to the database:
<?php return [ 'db' => [ 'host' => '127.0.0', 'database' => 'kirby', 'user' => 'root', 'password' => 'root', ] ];
Assuming that your database contains a table called comments, you can now query the database table in your templates like this:
We can now convert these database entries to children of the comments parent. To do so, let's create a page model for the parent page:
Here we re-define the
children() method of the
Page class to return the commments from the database as children pages.
With this page model in place, we can now access our comments as children of the
comments page in our template:
We can now access these database-based pages in the Panel. To do this properly, we should create blueprints for the parent and its children first:
While these comments are now automatically available in the Panel, we cannot yet edit them. To make sure that they can be edited and deleted, we have to create a
CommentPage model and modify the code of the parent model:
CommentPage model would need to overwrite the
readContent() methods to get the comment details from the table instead of the text file.
If we want to access each comment on its own page, we can add an additional template for the comment: