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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314
|
<?php
/*
** Zabbix
** Copyright (C) 2001-2019 Zabbix SIA
**
** This program 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.
**
** This program 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 this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
class CView {
/**
* Name of the template file without extension, for example 'configuration.item.edit'.
*
* @var string
*/
private $filePath;
/**
* Hash of 'variable_name'=>'variable_value' to be used inside template.
*
* @var array
*/
private $data;
/**
* Actual template object being shown.
*
* @var CTag
*/
private $template;
/**
* Scripts on page.
*
* @var string
*
* @deprecated
*/
private $scripts;
/**
* Java code for inclusions on page.
*
* @var array
*/
private $jsIncludePost = [];
/**
* Java Script files for inclusions on page, pre-processed by PHP.
*
* @var array
*/
private $jsIncludeFiles = [];
/**
* Java Script files for inclusions on page, included as <script src="..."></script>.
*
* @var array
*/
private $jsFiles = [];
/**
* Directories where views are stored, ordered by priority include/views should be removed once fully move to MVC.
*
* @static
*
* @var array
*/
static $viewsDir = ['local/app/views', 'app/views', 'include/views'];
/**
* Web layout mode enabled flag.
*
* @static
*
* @var boolean
*/
static $has_web_layout_mode = false;
/**
* Creates a new view based on provided template file.
*
* @param string $view Name of a view, located under include/views.
* @param array $data Deprecated parameter, use set() and get() methods for passing variables to views.
*
* @throws Exception if file does not exist.
*
* @example $scriptForm = new CView('administration.script.edit');
*/
public function __construct($view, $data = []) {
$this->assign($view);
$this->data = $data;
}
/**
* Search file and assigns path to the view file.
*
* @param string $view Name of the template file without extension.
*
* @throws Exception if invalid filename or file does not exist.
*/
public function assign($view) {
if (!preg_match("/[a-z\.]+/", $view)) {
throw new Exception(_s('Invalid view name given "%s". Allowed chars: "a-z" and ".".', $view));
}
$found = false;
foreach (self::$viewsDir as $dir) {
$this->filePath = $dir.'/'.$view.'.php';
if (file_exists($this->filePath)) {
$found = true;
break;
}
}
if ($found == false) {
throw new Exception(_s('File provided to a view does not exist. Tried to find "%s".', $this->filePath));
}
}
/**
* Assign value to a named variable.
*
* @param string $var
* @param mixed $value
*
* @example set('hostName','Host ABC')
*/
public function set($var, $value) {
$this->data[$var] = $value;
}
/**
* Get value by variable name.
*
* @param string $var
*
* @return mixed|string Variable value. Returns empty string if the variable is not defined.
*
* @example get('hostName')
*
* @deprecated use $data instead
*/
public function get($var) {
return isset($this->data[$var]) ? $this->data[$var] : '';
}
/**
* Get variable of type array by variable name.
*
* @param string $var
*
* @return array Variable value. Returns empty array if the variable is not defined or not an array.
*
* @example getArray('hosts')
*
* @deprecated use $data instead
*/
public function getArray($var) {
return isset($this->data[$var]) && is_array($this->data[$var]) ? $this->data[$var] : [];
}
/**
* Load and execute view.
* TODO It outputs JavaScript code immediately, should be done in show() or processed separately.
*
* @deprecated Will not be supported when we fully move to MVC.
*
* @throws Exception if cannot include view file.
*
* @return object GUI object.
*/
public function render() {
// $data this variable will be used in included file
$data = $this->data;
ob_start();
$this->template = include($this->filePath);
if ($this->template === false) {
throw new Exception(_s('Cannot include view file "%s".', $this->filePath));
}
$this->scripts = ob_get_clean();
/* TODO It is for output of JS code. Should be moved to show() method. */
echo $this->scripts;
return $this->template;
}
/**
* The method outputs HTML code based on rendered template. It calls render() if not called already.
*
* @deprecated Will not be supported when we fully move to MVC.
*
* @throws Exception if view is not rendered.
*/
public function show() {
if (!isset($this->template)) {
throw new Exception(_('View is not rendered.'));
}
$this->template->show();
}
/**
* The method returns HTML/JSON/CVS/etc text based on rendered template.
* show() and render() should be made deprecated. View should only output text, no objects, nothing.
*/
public function getOutput() {
$data = $this->data;
ob_start();
include($this->filePath);
return ob_get_clean();
}
/**
* Include Java Script code to be executed after page load.
*
* @param string $js Java Script code.
*/
public function addPostJS($js) {
$this->jsIncludePost[] = $js;
}
/**
* Include Java Script file required for the view into HTML.
*
* @param string $filename Name of java Script file, will be pre-processed by PHP.
*/
public function includeJSfile($filename) {
$this->jsIncludeFiles[] = $filename;
}
/**
* Add Java Script file required for the view as <script src="..."></script>.
*
* @param string $filename Name of java Script file.
*/
public function addJsFile($filename) {
$this->jsFiles[] = $filename;
}
/**
* Get content of all Java Script code.
*
* @return string Java Script code.
*/
public function getPostJS() {
if ($this->jsIncludePost) {
return get_js(implode("\n", $this->jsIncludePost));
}
return '';
}
/**
* Get content of all included Java Script files.
*
* @throws Exception if cannot include JS file.
*
* @return string Empty string or content of included JS files.
*/
public function getIncludedJS() {
ob_start();
foreach ($this->jsIncludeFiles as $filename) {
if((include $filename) === false) {
throw new Exception(_s('Cannot include JS file "%s".', $filename));
}
}
return ob_get_clean();
}
/**
* Get content of all included Java Script files.
*
* @return array|string Empty string or array of path of included JS files.
*/
public function getAddedJS() {
return $this->jsFiles;
}
/**
* Return layout mode setting.
*
* @return int
*/
public static function getLayoutMode() {
if (self::$has_web_layout_mode) {
return (int) CProfile::get('web.layout.mode', ZBX_LAYOUT_NORMAL);
}
else {
return ZBX_LAYOUT_NORMAL;
}
}
/**
* Update layout mode setting
*
* @param int $layout_mode Possible values ZBX_LAYOUT_NORMAL|ZBX_LAYOUT_FULLSCREEN|ZBX_LAYOUT_KIOSKMODE.
*/
public static function setLayoutMode($layout_mode) {
CProfile::update('web.layout.mode', $layout_mode, PROFILE_TYPE_INT);
}
}
|