1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
<?php
/**
* Class that takes care of displaying menu items
*
* This file is part of Zoph.
*
* Zoph is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Zoph is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Zoph; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* @author Jeroen Roos
* @package Zoph
*/
namespace template\menu;
use app;
use conf\conf;
use Closure;
use template\block;
use user;
/**
* This class takes care of displaying menu items
*
* @author Jeroen Roos
* @package Zoph
*/
class item {
private bool $selected = false;
public function __construct(
private string $linkText,
private string $link,
private ?string $displayFunction = null,
private ?bool $negate = false,
private ?string $config = null,
private ?array $parameter = null
) {
}
public function __toString() : string {
return (string) $this->display();
}
public function display() : string {
if ($this->shouldBeDisplayed()) {
$link = app::getBasePath() . $this->link;
if (isset($this->parameter)) {
$user = user::getCurrent();
foreach ($this->parameter as $label => $value) {
$obj = call_user_func(array($user, $value));
$this->parameter[$label] = $obj->getId();
}
$link .= "?" . http_build_query($this->parameter);
}
return new block("menuitem", array(
"title" => translate($this->linkText),
"link" => $link,
"selected" => $this->selected
));
} else {
return "";
}
}
public function setSelected(?string $page = null) : void {
$link = $this->link;
if (!strpos($link, "/") && strpos($page, "/")) {
$page = substr($page, 0, strpos($page, "/"));
} else if (strpos($this->link, "/") && !strpos($page, "/")) {
$link = substr($link, 0, strpos($link, "/"));
}
if (is_null($page) || $page == $link) {
$this->selected = true;
}
}
public function shouldBeDisplayed() : bool {
if (!empty($this->config)) {
$conf = conf::get($this->config);
$display = $this->negate ? !$conf : $conf;
if (!$display) {
return false;
}
}
$user = user::getCurrent();
if (is_null($this->displayFunction)) {
return true;
} else {
$f = $this->displayFunction;
$display = $this->negate ? fn() => !call_user_func(array($user, $f)) : fn() => call_user_func(array($user,$f));
return (bool) $display();
}
}
}
|