xref: /webtrees/app/View.php (revision 962e29c940cdd655a7b3eb3820043674ccfe6852)
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.
60*962e29c9SGreg Roach	 *
61*962e29c9SGreg Roach	 * @param string $key
62*962e29c9SGreg Roach	 * @param mixed  $value
6308d24c7aSGreg Roach	 */
64*962e29c9SGreg Roach	public static function share(string $key, $value) {
6508d24c7aSGreg Roach		self::$shared_data[$key] = $value;
6608d24c7aSGreg Roach	}
6708d24c7aSGreg Roach
6808d24c7aSGreg Roach	/**
69ecf66805SGreg Roach	 * Implementation of Blade "stacks".
70ecf66805SGreg Roach	 *
71ecf66805SGreg Roach	 * @see https://laravel.com/docs/5.5/blade#stacks
72*962e29c9SGreg Roach	 *
73*962e29c9SGreg Roach	 * @param string $stack
74ecf66805SGreg Roach	 */
75ecf66805SGreg Roach	public static function push(string $stack) {
76ecf66805SGreg Roach		self::$stack = $stack;
77ecf66805SGreg Roach		ob_start();
78ecf66805SGreg Roach	}
79ecf66805SGreg Roach
80ecf66805SGreg Roach	/**
81ecf66805SGreg Roach	 * Implementation of Blade "stacks".
82ecf66805SGreg Roach	 */
83ecf66805SGreg Roach	public static function endpush() {
84ecf66805SGreg Roach		self::$stacks[self::$stack][] = ob_get_clean();
85ecf66805SGreg Roach	}
86ecf66805SGreg Roach
87ecf66805SGreg Roach	/**
88ecf66805SGreg Roach	 * Implementation of Blade "stacks".
89ecf66805SGreg Roach	 *
90*962e29c9SGreg Roach	 * @param string $stack
91*962e29c9SGreg Roach	 *
92ecf66805SGreg Roach	 * @return string
93ecf66805SGreg Roach	 */
94ecf66805SGreg Roach	public static function stack(string $stack): string {
95ecf66805SGreg Roach		$content = implode('', self::$stacks[$stack] ?? []);
96ecf66805SGreg Roach
97ecf66805SGreg Roach		self::$stacks[$stack] = [];
98ecf66805SGreg Roach
99ecf66805SGreg Roach		return $content;
100ecf66805SGreg Roach	}
101ecf66805SGreg Roach
102ecf66805SGreg Roach	/**
103f3281ad6SGreg Roach	 * Render a view.
104f3281ad6SGreg Roach	 *
105f3281ad6SGreg Roach	 * @return string
106f3281ad6SGreg Roach	 */
107f3281ad6SGreg Roach	public function render() {
10808d24c7aSGreg Roach		extract($this->data + self::$shared_data);
109f3281ad6SGreg Roach
110f3281ad6SGreg Roach		ob_start();
111bc241c54SGreg Roach		// Do not use require, so we can catch errors for missing files
112bc241c54SGreg Roach		include $this->getFilenameForView($this->name);
11375d70144SGreg Roach
114f3281ad6SGreg Roach		return ob_get_clean();
115f3281ad6SGreg Roach	}
116f3281ad6SGreg Roach
117f3281ad6SGreg Roach	/**
11875d70144SGreg Roach	 * Allow a theme to override the default views.
119f3281ad6SGreg Roach	 *
120f3281ad6SGreg Roach	 * @param string $view_name
121f3281ad6SGreg Roach	 *
12275d70144SGreg Roach	 * @return string
123f3281ad6SGreg Roach	 */
12475d70144SGreg Roach	public static function getFilenameForView($view_name) {
125f21917b2SGreg Roach		$view_file  = '/resources/views/' . $view_name . '.php';
126f21917b2SGreg Roach		$theme_view = WT_ROOT . WT_THEMES_DIR . Theme::theme()->themeId() . $view_file;
12775d70144SGreg Roach
128f21917b2SGreg Roach		if (is_file($theme_view)) {
129f21917b2SGreg Roach			return $theme_view;
130f21917b2SGreg Roach		} else {
131f21917b2SGreg Roach			return WT_ROOT . $view_file;
132f21917b2SGreg Roach		}
133f3281ad6SGreg Roach	}
134f3281ad6SGreg Roach
135f3281ad6SGreg Roach	/**
136f3281ad6SGreg Roach	 * Cerate and render a view in a single operation.
137f3281ad6SGreg Roach	 *
138f3281ad6SGreg Roach	 * @param string  $name
139f3281ad6SGreg Roach	 * @param mixed[] $data
140f3281ad6SGreg Roach	 *
141f3281ad6SGreg Roach	 * @return string
142f3281ad6SGreg Roach	 */
143f3281ad6SGreg Roach	public static function make($name, $data = []) {
144f3281ad6SGreg Roach		$view = new static($name, $data);
145f3281ad6SGreg Roach
14644116e73SGreg Roach		DebugBar::addView($name, $data);
14744116e73SGreg Roach
148f3281ad6SGreg Roach		return $view->render();
149f3281ad6SGreg Roach	}
150f3281ad6SGreg Roach}
151