<?php
/**
 * -----------------------------------------------------------------------------
 *
 * SyL - Web Application Framework for PHP
 *
 * PHP version 4 (>= 4.3.x) or 5
 *
 * Copyright (C) 2006 k.watanabe
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * -----------------------------------------------------------------------------
 * @package   SyL
 * @author    k.watanabe <k.watanabe@syl.jp>
 * @copyright 2006 k.watanabe
 * @license   http://www.opensource.org/licenses/lgpl-license.php
 * @version   CVS: $Id: SyL_ErrorWeb.php,v 1.9 2007/01/03 11:17:37 seasonstream Exp $
 * @link      http://www.syl.jp/
 * -----------------------------------------------------------------------------
 */

/**
 * WEB画面エラー表示クラス
 *
 * エラーメッセージ表示パターン
 * ○手動エラー1
 *   共通エラー画面表示
 *   end( 'エラーメッセージ' )
 * 
 * ○手動エラー2
 *   共通エラー画面にエラーメッセージを蓄えて、一気に表示
 *   …
 *   end(エラーメッセージオブジェクト)
 * 
 * ○自動エラー
 *   エラーハンドラ
 *   共通エラー画面表示後、終了
 * 
 * @package   SyL
 * @author    k.watanabe <k.watanabe@syl.jp>
 * @copyright 2006 k.watanabe
 * @license   http://www.opensource.org/licenses/lgpl-license.php
 * @version   CVS: $Id: SyL_ErrorWeb.php,v 1.9 2007/01/03 11:17:37 seasonstream Exp $
 * @link      http://www.syl.jp/
 */
class SyL_ErrorWeb extends SyL_Error
{
    /**
     * エラーハンドラーの実体
     * 
     * @access public
     * @param object データ管理オブジェクト
     */
    function errorHandler(&$dm)
    {
        // バッファリングクリア
        // ※必須
        ob_clean();

        // エラーメッセージ取得
        $error_message = implode('<br>', $this->getErrorMessages());
        // エラータイプの取得
        $error_type  = $this->getErrorType();
        // エラートレースの取得
        $error_trace = SYL_ERROR_TRACE ? $this->getTraceHtml() : '';

        // エラー表示判定
        $error_View_type = '';
        $view_type = explode(':', SYL_ERROR_FORWARD_TYPE);
        switch (strtolower($view_type[0])) {
        case 'view':
        case 'layout':   $error_View_type = 'Template'; break;
        case 'redirect': $error_View_type = 'Redirect'; break;
        default:         $error_View_type = 'Default';  break;
        }

        // エラー表示
        $func_name = "displayError{$error_View_type}";
        // エラーメッセージ取得
        $error_string = SYL_ERROR ? "[{$error_type}] {$error_message}" : SYL_ERROR_MESSAGE;
        // エラーメッセージ表示
        $this->{$func_name}($error_string, $error_trace, $view_type);
        // ロギング
        $this->logging();
    }

    /**
     * デフォルトエラー画面生成
     *
     * @access private
     * @param string エラーメッセージ
     * @param string エラートレース
     * @param string ビュータイプ
     */
    function displayErrorDefault($error_string, $error_trace, $view_type)
    {
        echo $error_string;
        if ($error_trace) {
            echo "<br><br>";
            echo $error_trace;
        }
    }

    /**
     * テンプレートエラー画面生成
     *
     * @access private
     * @param string エラーメッセージ
     * @param string エラートレース
     * @param string ビュータイプ
     */
    function displayErrorTemplate($error_string, $error_trace, $view_type)
    {
        // データ管理クラス
        include_once SYL_INCLUDE_DIR . '/framework/SyL_DataManager.php';
        $dm =& new SyL_DataManager($this->controller);
        $dm->setViewParameter('viewtype', $view_type[1]);
        if ($view_type[0] == 'layout') {
            $dm->setViewParameter('viewlayout', 'true');
        } else {
            $dm->setViewParameter('viewlayout', 'false');
            if ($view_type[1] == 'customize') {
                $dm->setViewParameter('customizedviewclass', $view_type[2]);
                $dm->setViewParameter('customizedviewfile',  $view_type[3]);
            }
        }
        $dm->setTemplateFile(SYL_ERROR_FORWARD_FILE);
        $dm->setParameter('error_message', $error_string);
        $dm->setParameter('error_trace',   $error_trace);

        // ビュークラス
        include_once SYL_INCLUDE_DIR . '/framework/SyL_Layout.php';
        $view =& SyL_Layout::getObject($dm);
        $view->render();

        // 結果応答クラス
        include_once SYL_INCLUDE_DIR . '/framework/SyL_Response.php';
        $res =& SyL_Response::getInstance();
        $res->display($view);
    }

    /**
     * レイアウトエラー画面生成
     *
     * @access private
     * @param string エラーメッセージ
     * @param string エラートレース
     * @param string ビュータイプ
     */
    function displayErrorView($error_string, $error_trace, $view_type)
    {
        // データ管理クラス
        include_once SYL_INCLUDE_DIR . '/framework/SyL_DataManager.php';
        $dm =& new SyL_DataManager($this->controller);
        $dm->setViewParameter('defaultView', $view_type);
        $dm->setViewParameter('defaultView', $view_type);
        $dm->setTemplateFile(SYL_ERROR_FORWARD_FILE);
        $dm->setParameter('error_message', $error_string);
        $dm->setParameter('error_trace',   $error_trace);

        // ビュークラス
        include_once SYL_INCLUDE_DIR . '/framework/SyL_Layout.php';
        $view =& SyL_Layout::getObject($dm);
        $view->render();

        // 結果応答クラス
        include_once SYL_INCLUDE_DIR . '/framework/SyL_Response.php';
        $res =& SyL_Response::getInstance();
        $res->display($view);
    }

    /**
     * エラーページにリダイレクト
     *
     * @access private
     * @param string エラーメッセージ
     * @param string エラートレース
     * @param string ビュータイプ
     */
    function displayErrorRedirect($error_string, $error_trace, $view_type)
    {
        // 結果応答クラス
        include_once SYL_INCLUDE_DIR . '/framework/SyL_Response.php';
        SyL_Response::redirect(SYL_ERROR_FORWARD_FILE);
    }

    /**
     * エラートレースを取得
     *
     * @access public
     * @return string エラートレース
     */
    function getTraceHtml()
    {
        $error_trace = $this->getTrace();
        $i = count($error_trace);
        $error_trace_result = '';
        if ($i > 0) {
            // エラートレース表示の作成
            $error_trace_result .= '<table border="1" cellspacing="0" cellpadding="3" bgcolor="#FFFFFF">' . $this->eof;
            $error_trace_result .= '<tr>' . $this->eof;
            $error_trace_result .= '<td colspan="4">Debug Trace</td>' . $this->eof;
            $error_trace_result .= '</tr>' . $this->eof;
            $error_trace_result .= '<tr>'  . $this->eof;
            $error_trace_result .= '<td bgcolor="#CCCCCC">#</td>';
            $error_trace_result .= '<td bgcolor="#CCCCCC">file</td>';
            $error_trace_result .= '<td bgcolor="#CCCCCC">line</td>';
            $error_trace_result .= '<td bgcolor="#CCCCCC">function or method</td>' . $this->eof;
            $error_trace_result .= '</tr>' . $this->eof;
            foreach ($error_trace as $value) {
                if (($value['function'] == '') || ($value['function'] == 'unknown')) {
                    $value['function'] = '&nbsp;';
                }
                if ($value['file'] == '') {
                    $value['file'] = '-';
                }
                if ($value['line'] == '') {
                    $value['line'] = '-';
                }
                $error_trace_result .= '<tr>' . $this->eof;
                $error_trace_result .= '<td>' . $i-- . '</td>';
                $error_trace_result .= '<td>' . $value['file'] . '</td>';
                $error_trace_result .= '<td align="right">' . $value['line'] . '</td>';
                $error_trace_result .= '<td>' . $value['function'] . '</td>' . $this->eof;
                $error_trace_result .= '</tr>' . $this->eof;
            }
            $error_trace_result .= '</table>' . $this->eof;
        }

        return $error_trace_result;
    }
}

?>
