In my ongoing blogpost series about the Icinga PHP library, I am briefly explaining what the individual components of this library do and how easily you can use them in your project. In my previous blog post, i already covered the ipl-html
and explained how easy it is to create your own HTML elements and widgets.
Today we are going to talk about the ipl-web. It is a collection of very useful HTML elements/Widgets created with ipl-html
. It also offers CSS and Javascript for the widgets.
The icingadb-web module makes the most use of this library. The controls such as the search bar, pagination and lists such as the hosts/services list etc. are all basic elements/widgets of this library. If you are working on Icinga Web modules, now is the time to use this library.
How to start?
This library provides a CompatController
for Icinga Web compatibilities. Just extend this in your Contollers
.
The Contoller:
namespace Icinga\Module\Test\Controllers; use Icinga\Module\Test\Widget\MyList; use ipl\Web\Compat\CompatController; class TestController extends CompatController { public function indexAction(): void { $this->addControl($this->createPaginationControl($paginatableQuery)); $this->addControl($this->createLimitControl()); $list = new MyList(["first", "second", "third", "etc"]); $this->addContent($list); // Accepts Ipl/Html/ValidHtml element/widget }
The MyList
class creates a list from the given elements. Let’s create the class.
<?php namespace Icinga\Module\Test\Widget; use ipl\Web\Common\BaseItemList; class MyList extends BaseItemList { protected $defaultAttributes = ['class' => 'my-list']; // you can change or add extra style using this css class protected function getItemClass(): string { return MyListItem::class; } }
Let’s create the class MyListItem
, which describes how the individual list items should look.
<?php namespace Icinga\Module\Test\Widget; use Icinga\Module\Notifications\Common\BaseListItem; use ipl\Html\BaseHtmlElement; use ipl\Web\Url; use ipl\Web\Widget\Link; use ipl\Web\Widget\Icon; class MyListItem extends BaseListItem { /** @var string */ protected $item; /** @var array */ protected $list; protected function init(): void { $this->getAttributes()->set('data-action-item', true); // make the list item clickable } protected function assembleVisual(BaseHtmlElement $visual): void { $visual->addHtml(new Icon('hamburger')); // font-awesome icon } protected function assembleTitle(BaseHtmlElement $title): void { // Add a link to title $title->addHtml(new Link( $this->item, Url::fromPath('test/get', ['id' => $this->item]), ['class' => 'subject'] )); } protected function assembleHeader(BaseHtmlElement $header): void { $header->add($this->createTitle()); } protected function assembleMain(BaseHtmlElement $main): void { $main->add($this->createHeader()); } }
With this little code we have created a nice looking list of clickable items as shown below.
Ipl-web offers many more ready-to-use widgets, give it a try.