e107inc/e107

View on GitHub
e107_handlers/error_page_class.php

Summary

Maintainability
A
0 mins
Test Coverage
F
43%
<?php
/**
 * e107 website system
 *
 * Copyright (C) 2008-2016 e107 Inc (e107.org)
 * Released under the terms and conditions of the
 * GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
 *
 * @file
 * Class for system error pages.
 */


// [e_LANGUAGEDIR]/[e_LANGUAGE]/lan_error.php
e107::lan('core', 'error');


/**
 * Class error_page.
 */
class error_page
{

    /**
     * @var
     */
    private $template = 'DEFAULT';

    /**
     * @var
     */
    private $title;

    /**
     * @var
     */
    private $caption;

    /**
     * @var
     */
    private $content;

    /**
     * Constructor.
     *
     * Use {@link getInstance()}, direct instantiating is not possible for
     * signleton objects.
     */
    public function __construct()
    {
    }

    /**
     * Singleton is not required, we go for factory instead.
     *
     * @return error_page
     */
    public static function getInstance()
    {
        return e107::getError();
    }

    /**
     * Change title on the error page.
     *
     * @param $title
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }

    /**
     * Change panel caption on the error page.
     *
     * @param $caption
     */
    public function setCaption($caption)
    {
        $this->caption = $caption;
    }

    /**
     * Change panel content on the error page.
     *
     * @param $content
     */
    public function setContent($content)
    {
        $this->content = $content;
    }

    /**
     * Set a "Bad Request" error page.
     */
    private function setPageBadRequest()
    {
        header('HTTP/1.1 400 Bad Request', true, 400);

        $this->template = 400;
        $this->title = LAN_ERROR_35;
        $this->caption = LAN_ERROR_45;
        $this->content = LAN_ERROR_36;
    }

    /**
     * Set a "Authentication Failed" error page.
     */
    private function setPageUnauthorized()
    {
        header('HTTP/1.1 401 Unauthorized', true, 401);

        $this->template = 401;
        $this->title = LAN_ERROR_1;
        $this->caption = LAN_ERROR_45;
        $this->content = LAN_ERROR_2 . '<br/>' . LAN_ERROR_3;
    }

    /**
     * Set a "Access forbidden" error page.
     */
    private function setPageForbidden()
    {
        header('HTTP/1.1 403 Forbidden', true, 403);

        $this->template = 403;
        $this->title = LAN_ERROR_4;
        $this->caption = LAN_ERROR_45;
        $this->content = LAN_ERROR_5 . '<br/>' . LAN_ERROR_3 . '<br/><br/>' . LAN_ERROR_2;
    }

    /**
     * Set a "Not Found" error page.
     */
    private function setPageNotFound()
    {
        header('HTTP/1.1 404 Not Found', true, 404);

        $this->template = 404;
        $this->title = LAN_ERROR_7;
        $this->caption = LAN_ERROR_45;
        $this->content = LAN_ERROR_21 . '<br/>' . LAN_ERROR_3;
    }

    /**
     * Set a "Internal server error" error page.
     */
    private function setPageInternalServerError()
    {
        header('HTTP/1.1 500 Internal Server Error', true, 500);

        $this->template = 500;
        $this->title = LAN_ERROR_10;
        $this->caption = LAN_ERROR_14;
        $this->content = LAN_ERROR_11 . '<br/>' . LAN_ERROR_3;
    }

    /**
     * Set a "Unknown" error page.
     */
    private function setPageUnknown()
    {
        header('HTTP/1.1 501 Not Implemented', true, 501);

        $errorQuery = htmlentities($_SERVER['QUERY_STRING']);

        $this->template = 'DEFAULT';
        $this->title = LAN_ERROR_13 . ' (' . $errorQuery . ')';
        $this->caption = LAN_ERROR_14;
        $this->content = LAN_ERROR_3;
    }

    /**
     * Set error page.
     *
     * @param int $status_code
     *  The HTTP status code to use for the error page, defaults to 404.
     *  Status codes are defined in RFC 2616.
     * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
     */
    public function set($status_code = 404)
    {
        switch($status_code)
        {
            case 400:
                $this->setPageBadRequest();
                break;

            case 401:
                $this->setPageUnauthorized();
                break;

            case 403:
                $this->setPageForbidden();
                break;

            case 404:
                $this->setPageNotFound();
                break;

            case 500:
                $this->setPageInternalServerError();
                break;

            default:
                $this->setPageUnknown();
                break;
        }
    }

    /**
     * Renders and delivers an error page to the browser.
     *
     * @param int $status_code
     *  The HTTP status code to use for the error page, defaults to 404.
     *  Status codes are defined in RFC 2616.
     * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
     */
    public function render($status_code = null)
    {
        if(!defined('ERR_PAGE_ACTIVE'))
        {
            define("ERR_PAGE_ACTIVE", true);
        }

        if($status_code)
        {
            $this->set($status_code);
        }

        $tp = e107::getParser();
        $tpl = e107::getCoreTemplate('error', $this->template);
        $sc = e107::getScBatch('error');

        $sc->setVars(array(
            'title'    => LAN_ERROR_TITLE, // Oops!
            'subtitle' => $this->title,
            'caption'  => $this->caption,
            'content'  => $this->content,
        ));

         $body = $tp->parseTemplate($tpl, true, $sc);

        // set title, mode and body for when SEF (index.php) is handling it.
        $front = eFront::instance();
        $front->getResponse()->setTitle(LAN_ERROR);
        $front->getResponse()->setRenderMod('error_page_'.$status_code);
        $front->getResponse()->setBody($body);



        // return $body for when error.php is handling it.
        return $body;
        // e107::getRender()->tablerender('', $body, 'error_page_'.$status_code); // caused double-render.test with e107v4a theme
    }

}