xref: /webtrees/app/View.php (revision bc241c54273892142cd7cd386c7e97823e1415df)
1f3281ad6SGreg Roach<?php
2f3281ad6SGreg Roach/**
3f3281ad6SGreg Roach * webtrees: online genealogy
41062a142SGreg Roach * Copyright (C) 2018 webtrees development team
5f3281ad6SGreg Roach * This program is free software: you can redistribute it and/or modify
6f3281ad6SGreg Roach * it under the terms of the GNU General Public License as published by
7f3281ad6SGreg Roach * the Free Software Foundation, either version 3 of the License, or
8f3281ad6SGreg Roach * (at your option) any later version.
9f3281ad6SGreg Roach * This program is distributed in the hope that it will be useful,
10f3281ad6SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
11f3281ad6SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12f3281ad6SGreg Roach * GNU General Public License for more details.
13f3281ad6SGreg Roach * You should have received a copy of the GNU General Public License
14f3281ad6SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>.
15f3281ad6SGreg Roach */
16f3281ad6SGreg Roachnamespace Fisharebest\Webtrees;
17f3281ad6SGreg Roach
18f3281ad6SGreg Roach/**
19f3281ad6SGreg Roach * Simple view/template class.
20f3281ad6SGreg Roach */
21f3281ad6SGreg Roachclass View {
22f3281ad6SGreg Roach	/**
23f3281ad6SGreg Roach	 * @var string The (file) name of the view.
24f3281ad6SGreg Roach	 */
25f3281ad6SGreg Roach	private $name;
26f3281ad6SGreg Roach
27f3281ad6SGreg Roach	/**
28f3281ad6SGreg Roach	 * @var mixed[] Data to be inserted into the view.
29f3281ad6SGreg Roach	 */
30f3281ad6SGreg Roach	private $data;
31f3281ad6SGreg Roach
32f3281ad6SGreg Roach	/**
3308d24c7aSGreg Roach	 * @var mixed[] Data to be inserted into all views.
3408d24c7aSGreg Roach	 */
3508d24c7aSGreg Roach	private static $shared_data = [];
3608d24c7aSGreg Roach
3708d24c7aSGreg Roach	/**
38ecf66805SGreg Roach	 * @var string Implementation of Blade "stacks".
39ecf66805SGreg Roach	 */
40ecf66805SGreg Roach	private static $stack;
41ecf66805SGreg Roach
42ecf66805SGreg Roach	/**
43ecf66805SGreg Roach	 * @var array[] Implementation of Blade "stacks".
44ecf66805SGreg Roach	 */
45ecf66805SGreg Roach	private static $stacks = [];
46ecf66805SGreg Roach
47ecf66805SGreg Roach	/**
48f3281ad6SGreg Roach	 * Createa view from a template name and optional data.
49f3281ad6SGreg Roach	 *
50f3281ad6SGreg Roach	 * @param       $name
51f3281ad6SGreg Roach	 * @param array $data
52f3281ad6SGreg Roach	 */
53f3281ad6SGreg Roach	public function __construct($name, $data = []) {
54f3281ad6SGreg Roach		$this->name = $name;
55f3281ad6SGreg Roach		$this->data = $data;
56f3281ad6SGreg Roach	}
57f3281ad6SGreg Roach
58f3281ad6SGreg Roach	/**
5908d24c7aSGreg Roach	 * Shared data that is available to all views.
6008d24c7aSGreg Roach	 */
6108d24c7aSGreg Roach	public static function share($key, $value) {
6208d24c7aSGreg Roach		self::$shared_data[$key] = $value;
6308d24c7aSGreg Roach	}
6408d24c7aSGreg Roach
6508d24c7aSGreg Roach	/**
66ecf66805SGreg Roach	 * Implementation of Blade "stacks".
67ecf66805SGreg Roach	 *
68ecf66805SGreg Roach	 * @see https://laravel.com/docs/5.5/blade#stacks
69ecf66805SGreg Roach	 */
70ecf66805SGreg Roach	public static function push(string $stack) {
71ecf66805SGreg Roach		self::$stack = $stack;
72ecf66805SGreg Roach		ob_start();
73ecf66805SGreg Roach	}
74ecf66805SGreg Roach
75ecf66805SGreg Roach	/**
76ecf66805SGreg Roach	 * Implementation of Blade "stacks".
77ecf66805SGreg Roach	 */
78ecf66805SGreg Roach	public static function endpush() {
79ecf66805SGreg Roach		self::$stacks[self::$stack][] = ob_get_clean();
80ecf66805SGreg Roach	}
81ecf66805SGreg Roach
82ecf66805SGreg Roach	/**
83ecf66805SGreg Roach	 * Implementation of Blade "stacks".
84ecf66805SGreg Roach	 *
85ecf66805SGreg Roach	 * @return string
86ecf66805SGreg Roach	 */
87ecf66805SGreg Roach	public static function stack(string $stack): string {
88ecf66805SGreg Roach		$content = implode('', self::$stacks[$stack] ?? []);
89ecf66805SGreg Roach
90ecf66805SGreg Roach		self::$stacks[$stack] = [];
91ecf66805SGreg Roach
92ecf66805SGreg Roach		return $content;
93ecf66805SGreg Roach	}
94ecf66805SGreg Roach
95ecf66805SGreg Roach	/**
96f3281ad6SGreg Roach	 * Render a view.
97f3281ad6SGreg Roach	 *
98f3281ad6SGreg Roach	 * @return string
99f3281ad6SGreg Roach	 */
100f3281ad6SGreg Roach	public function render() {
10108d24c7aSGreg Roach		extract($this->data + self::$shared_data);
102f3281ad6SGreg Roach
103f3281ad6SGreg Roach		ob_start();
104*bc241c54SGreg Roach		// Do not use require, so we can catch errors for missing files
105*bc241c54SGreg Roach		include $this->getFilenameForView($this->name);
10675d70144SGreg Roach
107f3281ad6SGreg Roach		return ob_get_clean();
108f3281ad6SGreg Roach	}
109f3281ad6SGreg Roach
110f3281ad6SGreg Roach	/**
11175d70144SGreg Roach	 * Allow a theme to override the default views.
112f3281ad6SGreg Roach	 *
113f3281ad6SGreg Roach	 * @param string $view_name
114f3281ad6SGreg Roach	 *
11575d70144SGreg Roach	 * @return string
116f3281ad6SGreg Roach	 */
11775d70144SGreg Roach	public static function getFilenameForView($view_name) {
118f21917b2SGreg Roach		$view_file  = '/resources/views/' . $view_name . '.php';
119f21917b2SGreg Roach		$theme_view = WT_ROOT . WT_THEMES_DIR . Theme::theme()->themeId() . $view_file;
12075d70144SGreg Roach
121f21917b2SGreg Roach		if (is_file($theme_view)) {
122f21917b2SGreg Roach			return $theme_view;
123f21917b2SGreg Roach		} else {
124f21917b2SGreg Roach			return WT_ROOT . $view_file;
125f21917b2SGreg Roach		}
126f3281ad6SGreg Roach	}
127f3281ad6SGreg Roach
128f3281ad6SGreg Roach	/**
129f3281ad6SGreg Roach	 * Cerate and render a view in a single operation.
130f3281ad6SGreg Roach	 *
131f3281ad6SGreg Roach	 * @param string  $name
132f3281ad6SGreg Roach	 * @param mixed[] $data
133f3281ad6SGreg Roach	 *
134f3281ad6SGreg Roach	 * @return string
135f3281ad6SGreg Roach	 */
136f3281ad6SGreg Roach	public static function make($name, $data = []) {
137f3281ad6SGreg Roach		$view = new static($name, $data);
138f3281ad6SGreg Roach
13944116e73SGreg Roach		DebugBar::addView($name, $data);
14044116e73SGreg Roach
141f3281ad6SGreg Roach		return $view->render();
142f3281ad6SGreg Roach	}
143f3281ad6SGreg Roach}
144