1 | <?php |
||
2 | /** |
||
3 | * @package WPEmerge |
||
4 | * @author Atanas Angelov <[email protected]> |
||
5 | * @copyright 2018 Atanas Angelov |
||
6 | * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0 |
||
7 | * @link https://wpemerge.com/ |
||
8 | */ |
||
9 | |||
10 | namespace WPEmerge\View; |
||
11 | |||
12 | use GuzzleHttp\Psr7; |
||
13 | use GuzzleHttp\Psr7\Response; |
||
14 | use WPEmerge\Facades\View; |
||
15 | |||
16 | /** |
||
17 | * Render a view file with php. |
||
18 | */ |
||
19 | class PhpView implements ViewInterface { |
||
20 | use HasNameTrait, HasContextTrait; |
||
21 | |||
22 | /** |
||
23 | * Stack of views ready to be rendered. |
||
24 | * |
||
25 | * @var array<ViewInterface> |
||
26 | */ |
||
27 | protected static $layout_content_stack = []; |
||
28 | |||
29 | /** |
||
30 | * Filepath to view. |
||
31 | * |
||
32 | * @var string |
||
33 | */ |
||
34 | protected $filepath = ''; |
||
35 | |||
36 | /** |
||
37 | * Layout to use. |
||
38 | * |
||
39 | * @var ViewInterface|null |
||
40 | */ |
||
41 | protected $layout = null; |
||
42 | |||
43 | /** |
||
44 | * Get the top-most layout content from the stack. |
||
45 | * |
||
46 | * @codeCoverageIgnore |
||
47 | * @return string |
||
48 | */ |
||
49 | public static function getLayoutContent() { |
||
50 | $view = array_pop( static::$layout_content_stack ); |
||
51 | |||
52 | return $view->render(); |
||
53 | } |
||
54 | |||
55 | /** |
||
56 | * Get filepath. |
||
57 | * |
||
58 | * @return string |
||
59 | */ |
||
60 | 1 | public function getFilepath() { |
|
61 | 1 | return $this->filepath; |
|
62 | } |
||
63 | |||
64 | /** |
||
65 | * Set filepath. |
||
66 | * |
||
67 | * @param string $filepath |
||
68 | * @return static $this |
||
69 | */ |
||
70 | 1 | public function setFilepath( $filepath ) { |
|
71 | 1 | $this->filepath = $filepath; |
|
72 | 1 | return $this; |
|
73 | } |
||
74 | |||
75 | /** |
||
76 | * Get layout. |
||
77 | * |
||
78 | * @return ViewInterface|null |
||
79 | */ |
||
80 | 1 | public function getLayout() { |
|
81 | 1 | return $this->layout; |
|
82 | } |
||
83 | |||
84 | /** |
||
85 | * Set layout. |
||
86 | * |
||
87 | * @param ViewInterface|null $layout |
||
88 | * @return static $this |
||
89 | */ |
||
90 | 1 | public function setLayout( ViewInterface $layout ) { |
|
91 | 1 | $this->layout = $layout; |
|
92 | 1 | return $this; |
|
93 | } |
||
94 | |||
95 | /** |
||
96 | * {@inheritDoc} |
||
97 | * @throws ViewException |
||
98 | */ |
||
99 | 4 | public function toString() { |
|
100 | 4 | if ( empty( $this->getName() ) ) { |
|
101 | 1 | throw new ViewException( 'View must have a name.' ); |
|
102 | } |
||
103 | |||
104 | 3 | if ( empty( $this->getFilepath() ) ) { |
|
105 | 1 | throw new ViewException( 'View must have a filepath.' ); |
|
106 | } |
||
107 | |||
108 | 2 | $clone = clone $this; |
|
109 | 2 | static::$layout_content_stack[] = $clone->compose(); |
|
110 | |||
111 | 2 | if ( $this->getLayout() !== null ) { |
|
112 | 1 | return $this->getLayout()->toString(); |
|
113 | } |
||
114 | |||
115 | 2 | return static::getLayoutContent(); |
|
116 | } |
||
117 | |||
118 | /** |
||
119 | * Compose the context. |
||
120 | * |
||
121 | * @return static $this |
||
122 | */ |
||
123 | 4 | protected function compose() { |
|
124 | 4 | $context = $this->getContext(); |
|
125 | 4 | $this->with( ['global' => View::getGlobals()] ); |
|
126 | 4 | View::compose( $this ); |
|
127 | 4 | $this->with( $context ); |
|
128 | 4 | return $this; |
|
129 | } |
||
130 | |||
131 | /** |
||
132 | * Render the view to a string. |
||
133 | * |
||
134 | * @return string |
||
135 | */ |
||
136 | 1 | protected function render() { |
|
137 | 1 | $__context = $this->getContext(); |
|
138 | 1 | ob_start(); |
|
139 | 1 | extract( $__context, EXTR_OVERWRITE ); |
|
140 | 1 | include $this->getFilepath(); |
|
141 | 1 | return ob_get_clean(); |
|
142 | } |
||
143 | |||
144 | /** |
||
145 | * {@inheritDoc} |
||
146 | * @throws ViewException |
||
147 | */ |
||
148 | 1 | public function toResponse() { |
|
149 | 1 | return (new Response()) |
|
150 | 1 | ->withHeader( 'Content-Type', 'text/html' ) |
|
151 | 1 | ->withBody( Psr7\stream_for( $this->toString() ) ); |
|
1 ignored issue
–
show
Bug
introduced
by
![]() |
|||
152 | } |
||
153 | } |
||
154 |