<?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_ValidationManager.php,v 1.7 2006/12/23 11:13:09 seasonstream Exp $
 * @link      http://www.syl.jp/
 * -----------------------------------------------------------------------------
 */

/**
 * 検証クラス
 */
require_once 'SyL_Validation.php'

/**
 * 検証プロセス管理クラス
 * 
 * @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_ValidationManager.php,v 1.7 2006/12/23 11:13:09 seasonstream Exp $
 * @link      http://www.syl.jp/
 */
class SyL_ValidationManager
{
    /**
     * 検証クラスをまとめた配列
     *
     * @access private
     * @var array
     */
    var $validators = array();

    /**
     * 検証グループオブジェクトを作成する
     *
     * @access public
     * @return object 検証グループオブジェクト
     */
    function &createValidators()
    {
        $validators =& new SyL_Validators();
        return $validators;
    }

    /**
     * 検証オブジェクトを追加する
     *
     * @access public
     * @param object 検証オブジェクト
     * @param string 検証項目値
     * @param string 検証要素名
     * @param string 検証項目名
     */
    function add(&$validator, $value, $element_name='', $name='')
    {
        if ($element_name == '') {
            $element_name = $this->getDefaultElementName();
        }
        $this->validators[$element_name] = array(
          'name'          => $name,
          'value'         => $value,
          'validator'     => &$validator,
          'error_massage' => ''
        );
    }

    /**
     * 検証外エラーをセットする
     *
     * @access public
     * @param string エラーメッセージ
     * @param string 検証要素名
     */
    function addError($error_massage, $element_name='')
    {
        if ($element_name == '') {
            $element_name = $this->getDefaultElementName();
        }
        $this->validators[$element_name] = array(
          'name'          => '',
          'value'         => '',
          'validator'     => null,
          'error_massage' => $error_massage
        );
    }

    /**
     * デフォルトの要素名を取得する
     *
     * @access public
     * @return string 要素名
     */
    function getDefaultElementName()
    {
        static $i = 1;
        $element_name = __CLASS__ . $i++;
        return $element_name;
    }

    /**
     * 検証処理を実行する
     *
     * @access public
     * @return bool true: エラー無し, false: エラーあり
     */
    function execute()
    {
        $valid = true;
        foreach (array_keys($this->validators) as $key) {
            if ($this->validators[$key]['validator'] != null) {
                if (!$this->validators[$key]['validator']->execute($this->validators[$key]['value'])) {
                    $this->validators[$key]['error_massage'] = $this->replaceName($this->validators[$key]['name'], $this->validators[$key]['validator']->getErrorMessage());
                    $valid = false;
                }
            }
        }
        return $valid;
    }

    /**
     * エラーメッセージの項目名を変換する
     *
     * @access public
     * @param string 項目名
     * @param string 変換前エラーメッセージ
     * @return string 変換後エラーメッセージ
     */
    function replaceName($name, $error_message)
    {
        return (($name != '') ? str_replace('{name}', $name, $error_message) : $error_message);
    }

    /**
     * 全体または項目ごとにエラーがあるか判定する
     *
     * @access public
     * @param string 検証要素名
     * @return bool true: エラーあり、false: エラーなし
     */
    function isError($element_name='')
    {
        if ($element_name != '') {
            return (isset($this->validators[$element_name]) && ($this->validators[$element_name]['error_massage'] != ''));
        } else {
            foreach (array_keys($this->validators) as $key) {
                if ($this->validators[$key]['error_massage'] != '') {
                    return true;
                }
            }
            return false;
        }
    }

    /**
     * 全体または項目ごとにエラーメッセージを取得する
     *
     * @access public
     * @param string 検証要素名
     * @return string エラーメッセージ
     */
    function getErrorMessage($element_name)
    {
        return (isset($this->validators[$element_name]) ? $this->validators[$element_name]['error_massage'] : null);
    }

    /**
     * 全エラーメッセージを取得する
     *
     * @access public
     * @return array エラーメッセージ配列
     */
    function getErrorMessageAll()
    {
        $error_message = array();
        foreach (array_keys($this->validators) as $key) {
            if ($this->validators[$key]['error_massage'] != '') {
                $error_message[] = $this->validators[$key]['error_massage'];
            }
        }
        return $error_message;
    }
}

?>
