modules-lists-katina/module.php

109 lines
3.1 KiB
PHP
Raw Normal View History

2019-08-11 16:03:28 +02:00
<?php
use Lewp\Resolve;
use Lewp\Config;
return new class extends Lewp\Module
{
const KEY_ORDERED_LIST = "is_ordered";
const KEY_HEADING = "heading";
const KEY_HEADING_ELEMENT = "heading_element";
const KEY_LIST = "list";
2019-08-20 19:43:17 +02:00
const KEY_LIST_ITEM_TEXT = "text";
2019-08-11 16:03:28 +02:00
const KEY_JSON_FILE = "json_file";
const DEFAULT_IS_ORDERED = true;
const DEFAULT_HEADING_ELEMENT = "div";
private function loadData(string $filename)
{
return $this->loadJsonFile(Resolve::arrayToId([$this->getPageId(), $filename]));
}
private function createHeading(string $heading_element, string $heading)
{
return $this->createAndSetupElement(
$heading_element,
$heading,
[
"class" => "heading"
]
);
}
private function createList(
array $list_items,
bool $is_ordered = self::DEFAULT_IS_ORDERED
) {
if ($is_ordered) {
$list = $this->createElement("ol");
} else {
$list = $this->createElement("ul");
}
$list->setAttribute("class", "list");
$this->appendListItems($list, $list_items);
return $list;
}
private function appendListItems(&$list, array $list_items)
{
foreach ($list_items as $item) {
2019-08-20 19:43:17 +02:00
$text = ($item[self::KEY_LIST_ITEM_TEXT])
? $item[self::KEY_LIST_ITEM_TEXT]
: '';
unset($item[self::KEY_LIST_ITEM_TEXT]);
2019-08-11 16:03:28 +02:00
$a = $this->createAndSetupElement(
'a',
2019-08-20 19:43:17 +02:00
$text,
$item
2019-08-11 16:03:28 +02:00
);
$li = $this->createAndSetupElement(
'li',
'',
[
"class" => "list-item"
]
);
$li->appendChild($a);
$list->appendChild($li);
}
}
public function run(array $options = []) : bool
{
$filename = $options[self::KEY_JSON_FILE];
if (isset($filename)) {
$options = array_merge($options, $this->loadData($options[self::KEY_JSON_FILE]));
}
if (!isset($options)) {
trigger_error(
'Module: '.$this->getModuleId().": ".
'The specified JSON file "'.$filename.'"seems to be invalid. Please check it!',
E_USER_WARNING
);
}
// add default configuration
$options += [
self::KEY_ORDERED_LIST => self::DEFAULT_IS_ORDERED,
self::KEY_HEADING_ELEMENT => self::DEFAULT_HEADING_ELEMENT
];
// add heading if defined
if (isset($options[self::KEY_HEADING])) {
$this->appendChild(
$this->createHeading($options[self::KEY_HEADING_ELEMENT],
$options[self::KEY_HEADING])
);
}
// add list
if (!empty($options[self::KEY_LIST])) {
$this->appendChild(
$this->createList($options[self::KEY_LIST], $options[self::KEY_ORDERED_LIST])
);
}
return true;
}
};