source: OWR/View.php @ fa8175

Revision fa8175, 12.9 KB checked in by pierre-alain <pierre-alain@…>, 4 years ago (diff)

code cleaning

  • Property mode set to 100644
Line 
1<?php
2/**
3 * View class
4 *
5 * PHP 5
6 *
7 * OWR - OpenWebReader
8 *
9 * Copyright (c) 2009, Pierre-Alain Mignot
10 *
11 * Home page: http://openwebreader.org
12 *
13 * E-Mail: contact@openwebreader.org
14 *
15 * All Rights Reserved
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 2 of the License, or
20 * (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with this program; if not, write to the Free Software
29 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
30 *
31 * @author Pierre-Alain Mignot <contact@openwebreader.org>
32 * @copyright Copyright (c) 2009, Pierre-Alain Mignot
33 * @license http://www.gnu.org/copyleft/gpl.html
34 * @package OWR
35 */
36namespace OWR;
37use OWR\View\Utilities,
38    OWR\View\Block;
39/**
40 * This object is used to render page
41 * @uses Singleton implements the singleton pattern
42 * @uses Exception the exceptions handler
43 * @uses Cache check cache directories
44 * @uses OWR\View\Utilities templates tools
45 * @package OWR
46 */
47class View extends Singleton
48{
49    /**
50    * @var float rendering time
51    * @access protected
52    */
53    static protected $_renderingTime = 0;
54
55    /**
56     * @var array list of headers
57     * @access protected
58     */
59    protected $_headers = array();
60
61    /**
62     * @var mixed instance of OWR\View\Utilities
63     * @access protected
64     */
65    protected $_utilities;
66
67    /**
68     * @var int HTTP status code
69     * @access protected
70     */
71    protected $_statusCode = 200;
72
73    /**
74     * @var array stack of templates blocks
75     * @access protected
76     */
77    protected $_blocks = array();
78
79    /**
80     * Constructor
81     * Checks cache directories and set OWR\View\Utilities instance
82     *
83     * @access protected
84     * @author Pierre-Alain Mignot <contact@openwebreader.org>
85     */
86    protected function __construct()
87    {
88        Cache::checkDir(User::iGet()->getLang());
89        $this->_utilities = Utilities::iGet();
90    }
91
92    /**
93     * Returns the specified template with the specified datas
94     *
95     * @access public
96     * @author Pierre-Alain Mignot <contact@openwebreader.org>
97     * @param string $tpl the template name
98     * @param array $datas the datas
99     * @param int $cacheTime cache time in seconds
100     * @param array $noCacheDatas the datas that are not cached but replaced on-the-fly
101     * @return string the template rendered
102     */
103    public function get($tpl, array $datas = array(), $cacheTime = null, array $noCacheDatas = array())
104    {
105        $t = microtime(true);
106        $cacheTime = (int) (isset($cacheTime) ? $cacheTime : Config::iGet()->get('cacheTime'));
107
108        if($cacheTime > 0)
109        {
110            $cachedTpl = User::iGet()->getLang() . DIRECTORY_SEPARATOR . md5($tpl . serialize($datas));
111            $contents = Cache::get($cachedTpl, $cacheTime);
112        }
113
114        if(!isset($contents) || false === $contents)
115        { // nothing found in cache
116            $contents = $this->_execute($tpl, $datas, $noCacheDatas);
117
118            if($cacheTime > 0)
119            {
120                Cache::write($cachedTpl, $contents);
121            }
122        }
123
124        if(!empty($noCacheDatas))
125        {
126            foreach($noCacheDatas as $name => $value)
127            {
128                $contents = str_replace('<OWR:NOCACHE NAME=\''.$name.'\'/>', $value, $contents);
129            }
130        }
131
132        self::$_renderingTime += (float)microtime(true) - $t;
133
134        return $contents;
135    }
136
137    /**
138     * Executes specified template and returns generated content
139     *
140     * @access public
141     * @author Pierre-Alain Mignot <contact@openwebreader.org>
142     * @param string $tpl the template name
143     * @param array $datas the datas
144     * @param array $noCacheDatas the datas that are not cached but replaced on-the-fly
145     * @return string the template rendered
146     */
147    protected function _execute($tpl, array $datas, array $noCacheDatas)
148    {
149        extract((array) $datas, EXTR_SKIP);
150        ob_start();
151        include Theme::iGet()->getPath($tpl) . $tpl . '.html';
152        return ob_get_clean();
153    }
154
155    /**
156     * Returns the added microtime of all rendering processing
157     *
158     * @access public
159     * @author Pierre-Alain Mignot <contact@openwebreader.org>
160     * @return float $_renderingTime
161     * @static
162     */
163    static public function getTime()
164    {
165        return (float) self::$_renderingTime;
166    }
167
168    /**
169     * Adds HTTP headers
170     *
171     * @access public
172     * @author Pierre-Alain Mignot <contact@openwebreader.org>
173     * @param array $headers associated array of HTTP header
174     * @param boolean $send must-we send headers ?
175     */
176    public function addHeaders(array $headers, $send = false)
177    {
178        foreach($headers as $name=>$value)
179        {
180            $name = strtolower($name);
181            isset($this->_headers[$name]) || $this->_headers[$name] = (string) $value;
182        }
183
184        if($send) $this->sendHeaders(false);
185    }
186
187    /**
188     * Sets HTTP status code
189     *
190     * @access public
191     * @author Pierre-Alain Mignot <contact@openwebreader.org>
192     * @param int $statusCode the code to set
193     * @param boolean $send must-we send headers ?
194     */
195    public function setStatusCode($statusCode, $send = false)
196    {
197        $statusCode = (int) $statusCode;
198        if($statusCode > $this->_statusCode)
199            $this->_statusCode = $statusCode;
200
201        if($send) $this->sendHeaders();
202    }
203
204    /**
205     * Sends HTTP headers
206     *
207     * @access public
208     * @author Pierre-Alain Mignot <contact@openwebreader.org>
209     * @param boolean $sendStatus set to false to not send HTTP status code
210     */
211    public function sendHeaders($sendStatus = true)
212    {
213        if($sendStatus)
214        {
215            switch($this->_statusCode)
216            {
217                case 100: $statusCode = 'Continue'; break;
218                case 101: $statusCode = 'Switching Protocols'; break;
219                case 200: $statusCode = 'OK'; break;
220                case 201: $statusCode = 'Created'; break;
221                case 202: $statusCode = 'Accepted'; break;
222                case 203: $statusCode = 'Non-Authoritative Information'; break;
223                case 205: $statusCode = 'Reset Content'; break;
224                case 206: $statusCode = 'Partial Content'; break;
225                case 300: $statusCode = 'Multiple Choices'; break;
226                case 301: $statusCode = 'Moved Permanently'; break;
227                case 302: $statusCode = 'Found'; break;
228                case 303: $statusCode = 'See Other'; break;
229                case 304: $statusCode = 'Not Modified'; break;
230                case 305: $statusCode = 'Use Proxy'; break;
231                case 306: $statusCode = '(Unused)'; break;
232                case 307: $statusCode = 'Temporary Redirect'; break;
233                case 400: $statusCode = 'Bad Request'; break;
234                case 401: $statusCode = 'Unauthorized'; break;
235                case 402: $statusCode = 'Payment Required'; break;
236                case 403: $statusCode = 'Forbidden'; break;
237                case 404: $statusCode = 'Not Found'; break;
238                case 405: $statusCode = 'Method Not Allowed'; break;
239                case 406: $statusCode = 'Not Acceptable'; break;
240                case 407: $statusCode = 'Proxy Authentication Required'; break;
241                case 408: $statusCode = 'Request Timeout'; break;
242                case 409: $statusCode = 'Conflict'; break;
243                case 410: $statusCode = 'Gone'; break;
244                case 411: $statusCode = 'Length Required'; break;
245                case 412: $statusCode = 'Precondition Failed'; break;
246                case 413: $statusCode = 'Request Entity Too Large'; break;
247                case 414: $statusCode = 'Request-URI Too Long'; break;
248                case 415: $statusCode = 'Unsupported Media Type'; break;
249                case 416: $statusCode = 'Requested Range Not Satisfiable'; break;
250                case 417: $statusCode = 'Expectation Failed'; break;
251                case 501: $statusCode = 'Not Implemented'; break;
252                case 502: $statusCode = 'Bad Gateway'; break;
253                case 503: $statusCode = 'Service Unavailable'; break;
254                case 504: $statusCode = 'Gateway Timeout'; break;
255                case 505: $statusCode = 'HTTP Version Not Supported'; break;
256
257                case 204: // we always return something
258                    $this->_statusCode = 200;
259                    $statusCode = 'OK';
260                    break;
261
262                case 500:
263                default:
264                    $this->_statusCode = 500;
265                    $statusCode = 'Internal Server Error';
266                    break;
267            }
268
269            if(!CLI) header('HTTP/1.1 ' . $this->_statusCode . ' ' . $statusCode);
270        }
271
272        if(!CLI)
273        {
274            foreach($this->_headers as $name=>$value)
275            {
276                header($name . ': ' . $value);
277            }
278        }
279
280        $this->_headers = array();
281    }
282
283    /**
284     * Prints the page
285     * This function tries to encode the contents
286     *
287     * @access public
288     * @author Pierre-Alain Mignot <contact@openwebreader.org>
289     * @param string $page the page to display
290     */
291    public function render($page)
292    {
293        $this->sendHeaders();
294        // try to compress the page
295        $encoding = false;
296        if(extension_loaded('zlib') && !ini_get('zlib.output_compression'))
297        {
298            if(function_exists('ob_gzhandler') && @ob_start('ob_gzhandler'))
299                $encoding = 'gzhandler';
300            elseif(!headers_sent() && isset($_SERVER['HTTP_ACCEPT_ENCODING']))
301            {
302                if(mb_strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'x-gzip', 0, 'UTF-8') !== false)
303                {
304                    $encoding = 'x-gzip';
305                }
306                elseif(mb_strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip', 0, 'UTF-8') !== false)
307                {
308                    $encoding = 'gzip';
309                }
310            }
311        }
312
313        switch($encoding)
314        {
315            case 'gzhandler':
316                @ob_implicit_flush(0);
317                echo $page;
318                @ob_end_flush();
319                break;
320            case 'gzip':
321            case 'x-gzip':
322                header('Content-Encoding: ' . $encoding);
323                ob_start();
324                echo $page;
325                $page = ob_get_clean();
326                $size = mb_strlen($page, 'UTF-8');
327                $page = gzcompress($page, 6);
328                $page = mb_substr($page, 0, $size, 'UTF-8');
329                echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
330            default:
331                echo $page;
332                flush();
333                break;
334        }
335    }
336
337    /**
338     * Adds a block to the stack
339     *
340     * @param string $name name of the block
341     * @param string $layout name of the layout containing the block
342     * @param string $content content of the block
343     * @param string $type type of the block
344     * @access public
345     */
346    public function addBlock($name, $layout, $content, $type = 'html')
347    {
348        $this->_blocks[$layout][$name] = new Block($content, $type);
349    }
350
351    /**
352     * Returns all blocks from a layout
353     *
354     * @param string $layout name of the layout
355     * @access public
356     * @return string layout content or null
357     */
358    public function getBlocks($layout)
359    {
360        return isset($this->_blocks[$layout]) ? join('', $this->_blocks[$layout]) : null;
361    }
362
363    /**
364     * Returns a block from a layout
365     *
366     * @param string $name name of the block
367     * @param string $layout name of the layout containing the block
368     * @access public
369     * @return string block content from the layout or null
370     */
371    public function getBlock($name, $layout)
372    {
373        return isset($this->_blocks[$layout][$name]) ? $this->_blocks[$layout][$name] : null;
374    }
375
376    /**
377     * Renders blocks from a layout
378     *
379     * @param string $layout name of the layout containing the block
380     * @access public
381     */
382    public function renderBlocks($layout)
383    {
384        $blocks = $this->getBlocks($layout);
385        if(!empty($blocks))
386            echo $blocks;
387    }
388
389    /**
390     * Renders a block from a layout
391     *
392     * @param string $name name of the block
393     * @param string $layout name of the layout containing the block
394     * @access public
395     */
396    public function renderBlock($name, $layout)
397    {
398        $block = $this->getBlock($name, $layout);
399        if(!empty($block))
400            echo $block;
401    }
402
403    /**
404     * Returns translated text
405     *
406     * @param string $name name of the text
407     * @access public
408     * @return string translated text
409     */
410    public function _($name)
411    {
412        return $this->_utilities->_($name);
413    }
414}
Note: See TracBrowser for help on using the repository browser.