xref: /webtrees/app/View.php (revision f21917b27521dbd8f569caf3f12c5b27b776cf76)
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	/**
33ecf66805SGreg Roach	 * @var string Implementation of Blade "stacks".
34ecf66805SGreg Roach	 */
35ecf66805SGreg Roach	private static $stack;
36ecf66805SGreg Roach
37ecf66805SGreg Roach	/**
38ecf66805SGreg Roach	 * @var array[] Implementation of Blade "stacks".
39ecf66805SGreg Roach	 */
40ecf66805SGreg Roach	private static $stacks = [];
41ecf66805SGreg Roach
42ecf66805SGreg Roach	/**
43f3281ad6SGreg Roach	 * Createa view from a template name and optional data.
44f3281ad6SGreg Roach	 *
45f3281ad6SGreg Roach	 * @param       $name
46f3281ad6SGreg Roach	 * @param array $data
47f3281ad6SGreg Roach	 */
48f3281ad6SGreg Roach	public function __construct($name, $data = []) {
49f3281ad6SGreg Roach		$this->name = $name;
50f3281ad6SGreg Roach		$this->data = $data;
51f3281ad6SGreg Roach	}
52f3281ad6SGreg Roach
53f3281ad6SGreg Roach	/**
54ecf66805SGreg Roach	 * Implementation of Blade "stacks".
55ecf66805SGreg Roach	 *
56ecf66805SGreg Roach	 * @see https://laravel.com/docs/5.5/blade#stacks
57ecf66805SGreg Roach	 */
58ecf66805SGreg Roach	public static function push(string $stack) {
59ecf66805SGreg Roach		self::$stack = $stack;
60ecf66805SGreg Roach		ob_start();
61ecf66805SGreg Roach	}
62ecf66805SGreg Roach
63ecf66805SGreg Roach	/**
64ecf66805SGreg Roach	 * Implementation of Blade "stacks".
65ecf66805SGreg Roach	 */
66ecf66805SGreg Roach	public static function endpush() {
67ecf66805SGreg Roach		self::$stacks[self::$stack][] = ob_get_clean();
68ecf66805SGreg Roach	}
69ecf66805SGreg Roach
70ecf66805SGreg Roach	/**
71ecf66805SGreg Roach	 * Implementation of Blade "stacks".
72ecf66805SGreg Roach	 *
73ecf66805SGreg Roach	 * @return string
74ecf66805SGreg Roach	 */
75ecf66805SGreg Roach	public static function stack(string $stack): string {
76ecf66805SGreg Roach		$content = implode('', self::$stacks[$stack] ?? []);
77ecf66805SGreg Roach
78ecf66805SGreg Roach		self::$stacks[$stack] = [];
79ecf66805SGreg Roach
80ecf66805SGreg Roach		return $content;
81ecf66805SGreg Roach	}
82ecf66805SGreg Roach
83ecf66805SGreg Roach	/**
84f3281ad6SGreg Roach	 * Render a view.
85f3281ad6SGreg Roach	 *
86f3281ad6SGreg Roach	 * @return string
87f3281ad6SGreg Roach	 */
88f3281ad6SGreg Roach	public function render() {
89f3281ad6SGreg Roach		extract($this->data);
90f3281ad6SGreg Roach
91f3281ad6SGreg Roach		ob_start();
9275d70144SGreg Roach		require $this->getFilenameForView($this->name);
9375d70144SGreg Roach
94f3281ad6SGreg Roach		return ob_get_clean();
95f3281ad6SGreg Roach	}
96f3281ad6SGreg Roach
97f3281ad6SGreg Roach	/**
9875d70144SGreg Roach	 * Allow a theme to override the default views.
99f3281ad6SGreg Roach	 *
100f3281ad6SGreg Roach	 * @param string $view_name
101f3281ad6SGreg Roach	 *
10275d70144SGreg Roach	 * @return string
103f3281ad6SGreg Roach	 */
10475d70144SGreg Roach	public static function getFilenameForView($view_name) {
105*f21917b2SGreg Roach		$view_file  = '/resources/views/' . $view_name . '.php';
106*f21917b2SGreg Roach		$theme_view = WT_ROOT . WT_THEMES_DIR . Theme::theme()->themeId() . $view_file;
10775d70144SGreg Roach
108*f21917b2SGreg Roach		if (is_file($theme_view)) {
109*f21917b2SGreg Roach			return $theme_view;
110*f21917b2SGreg Roach		} else {
111*f21917b2SGreg Roach			return WT_ROOT . $view_file;
112*f21917b2SGreg Roach		}
113f3281ad6SGreg Roach	}
114f3281ad6SGreg Roach
115f3281ad6SGreg Roach	/**
116f3281ad6SGreg Roach	 * Cerate and render a view in a single operation.
117f3281ad6SGreg Roach	 *
118f3281ad6SGreg Roach	 * @param string  $name
119f3281ad6SGreg Roach	 * @param mixed[] $data
120f3281ad6SGreg Roach	 *
121f3281ad6SGreg Roach	 * @return string
122f3281ad6SGreg Roach	 */
123f3281ad6SGreg Roach	public static function make($name, $data = []) {
124f3281ad6SGreg Roach		$view = new static($name, $data);
125f3281ad6SGreg Roach
12644116e73SGreg Roach		DebugBar::addView($name, $data);
12744116e73SGreg Roach
128f3281ad6SGreg Roach		return $view->render();
129f3281ad6SGreg Roach	}
130f3281ad6SGreg Roach}
131