<?php
/*
	Copyright(c) 2010 Shift Tech Inc. All Rights Reserved.
 	http://www.shift-tech.jp/

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program 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 General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * カテゴリ情報のDBアクセスクラス
 * @author 	yamamoto
 * @version	
 */

class categoryDB extends Model
{
	var $_form = null;
	var $erchk = 'server';//quickformエラーチェックのフラグ'client'or'server;
	var $db=null;
	//KVa => 半カナを全カナ,濁点つきの文字を１文字に変換する (K、H と共に利用する）,全角英数字を半角英数字に変換する
	//KVC => 半カナを全カナ,濁点つきの文字を１文字に変換する (K、H と共に利用する）,全角ひらがなを全角カタカナに変換する
	//n   => 全角数字を半角数字に変換する
/*
DROP TABLE IF EXISTS tbl_category CASCADE;
CREATE TABLE tbl_category (
    cat_code              	serial,						--カテゴリーコード
	cat_extmodule_code	integer,				--拡張モジュールコード
    cat_active            	smallint default 1,			--０：削除　１：有効
	cat_view				smallint default 1,			--未使用
    cat_type				smallint default 1,			--１：共通　２：オリジナル
	cat_menuflg				smallint default 1,			--ローカルナビゲーション表示 0:非表示 1:表示
	cat_smapflg			smallint default 1,			--０：サイトマップユニットで非表示　1：サイトマップユニットで表示
    cat_sidx_code         	integer,					--セクションコード
    cat_name	          	text,						--カテゴリー名
    cat_order             	integer,					--表示順
    cat_dir					text,						--ディレクトリ名(topディレクトリの場合はnull、その他は必須入力)
    cat_c_date            	timestamptz,    --登録日
    cat_u_date            	timestamptz,   --更新日
    primary key (cat_code)
);
DROP TABLE IF EXISTS tbl_category_tmp CASCADE;
CREATE TABLE tbl_category_tmp (
    cat_code              	integer,					--カテゴリーコード
	cat_extmodule_code	integer,				--拡張モジュールコード
    cat_active            	smallint default 1,			--０：削除　１：有効
	cat_view				smallint default 1,			--未使用
    cat_type				smallint default 1,			--１：共通　２：オリジナル
	cat_menuflg				smallint default 1,			--ローカルナビゲーション表示 0:非表示 1:表示
	cat_smapflg			smallint default 1,			--０：サイトマップユニットで非表示　1：サイトマップユニットで表示
    cat_sidx_code         	integer,					--セクションコード
    cat_name	          	text,						--カテゴリー名
    cat_order             	integer,					--表示順
    cat_dir					text,						--ディレクトリ名(topディレクトリの場合はnull、その他は必須入力)
    cat_c_date            	timestamptz,    --登録日
    cat_u_date            	timestamptz,   --更新日
    primary key (cat_code)
);
INSERT INTO tbl_category_tmp (cat_code, cat_view, cat_name, cat_order, cat_c_date, cat_u_date)
VALUES (nextval('tbl_category_cat_code_seq'), 2, 'TOP', 0, now(), now());
INSERT INTO tbl_category (select * from tbl_category_tmp);
*/
	var $columns = array(
						array("column"=>"cat_code","conv"=>"n","tags"=>false),		//カテゴリコード
						array("column"=>"cat_active","conv"=>"n","tags"=>false),	//削除フラグ
						array("column"=>"cat_type","conv"=>"n","tags"=>false),		//オリジナルフラグ
						array("column"=>"cat_menuflg","conv"=>"n","tags"=>false),	//メニュ表示フラグ
						array("column"=>"cat_smapflg","conv"=>"n","tags"=>false),	//サイトマップ表示フラグ
						array("column"=>"cat_sidx_code","conv"=>"n","tags"=>false),	//ブログコード
						array("column"=>"cat_name","conv"=>"KVa","tags"=>false),	//カテゴリ名
						array("column"=>"cat_order","conv"=>"n","tags"=>false),		//表示順
						array("column"=>"cat_dir","conv"=>"a","tags"=>false),		//ディレクトリ名
						array("column"=>"cat_c_date","conv"=>"a","tags"=>false),	//登録日
						array("column"=>"cat_u_date","conv"=>"a","tags"=>false)		//更新日
						);
	/**
	 * コンストラクタ php4対応・・・
	 */
	function categoryDB()
	{
		$this->__construct();
	}
	function __construct()
	{
		Model::__construct();
		$this->db = new DataBase();
	}

	//フォームエレメントの作成
	function setElements()
	{
		$this->_form->addElement('hidden','sidx_code', $this->getrequest("sidx_code"));
		$this->_form->addElement('hidden','cat_code', $this->getrequest("cat_code"));
		$this->_form->addElement('text','cat_name', null, array('size'=>50,'maxlength'=>50,'id'=>'cat_name'));
		$this->_form->addElement('text','cat_dir', null, array('size'=>20,'maxlength'=>'40','id'=>'cat_dir','style'=>'ime-mode:disabled'));
		$this->_form->addElement('hidden','cat_order', null);
		$item=array();
		$item[]=&HTML_QuickForm::createElement('radio', null, null, '表示', 1);
		$item[]=&HTML_QuickForm::createElement('radio', null, null, '非表示', 0);
		$this->_form->addGroup($item,'cat_menuflg');
		
		$item=array();
		$item[]=&HTML_QuickForm::createElement('radio', null, null, '表示', 1);
		$item[]=&HTML_QuickForm::createElement('radio', null, null, '非表示', 0);
		$this->_form->addGroup($item,'cat_smapflg');

	}
	//フォーム入力エラーチェックの設定
	function setRules()
	{
		$this->_form->applyFilter('__ALL__','trim');
		$this->_form->_submitValues = DataBase::ConvColumnVals($this->_form->_submitValues,$this->columns); //ルールに従った値変換、タグの除去
		$this->_form->setJsWarnings('下記の項目が不正です。','');		
		
		$this->_form->addRule('sidx_code','・「セクションコード」が不明です。コンテンツ管理よりやり直してください','required',null,$this->erchk);
		$this->_form->addRule('cat_name','・「ローカルメニュー名」を入力してください','required',null,$this->erchk);
		$this->_form->addRule('cat_name','・「ローカルメニュー名」は全角50文字以内です','maxlength',150,$this->erchk);
		
		$this->_form->addRule('cat_dir','・「ディレクトリ名」を入力してください','required',null,$this->erchk);
		$this->_form->addRule('cat_dir','・「ディレクトリ名」は半角英数40文字以内で入力してください', 'regex', '/^[a-zA-Z0-9_-]{1,40}$/', $this->erchk);
		//ユニークチェック
		$this->_form->registerRule('catdir_valid', 'callback','check_cat_dir');
		$this->_form->addRule('cat_dir','・ご入力いただきました「ディレクトリ名」は既に登録されています','catdir_valid',$_REQUEST,$this->erchk);
		
		//$this->_form->addRule('cat_order','・「表示順」は半角数字で入力してください','numeric',null,$this->erchk);

	}
	
	//ボタン作成
	function setButtons($frozen = false) {
		$buttons = array();
		if($frozen) {
			$buttons[] = $this->_form->createElement('submit','BTNback',' 編集に戻る ',array('id'=>'BTNback','class'=>'bBtnBack'));
			$buttons[] = $this->_form->createElement('submit','BTNsave',' 保存 ',array('id'=>'BTNsave','class'=>'bBtnSave'));
		} else {
			$buttons[] = $this->_form->createElement('submit','BTNList',' 一覧に戻る ',array('id'=>'BTNList','class'=>'bBtnListBack'));
			$buttons[] = $this->_form->createElement('submit','BTNnext',' 次へ進む ',array('id'=>'BTNnext','class'=>'bBtnNext'));
			if($this->getRequest("cat_code")>0) {
				$buttons[] = $this->_form->createElement('submit','BTNdelete',' 削除 ',array('id'=>'BTNdelete','class'=>'bBtnDelete','onClick'=>'return confirm(\'ローカルメニューに登録されているページも削除されます。\n本当に削除してよろしいですか？\')'));
			}
		}
		$this->_form->addGroup($buttons,"buttons", null, '&nbsp;&nbsp;');
	}

	
	/* セクションコードからカテゴリ一覧を取得
	 * @param secusr_sidx_code;
	 */
	function getlist($cat_sidx_code=null,$prev=0)
	{
		$tbl = "tbl_category";
		if(is_numeric($prev)&&$prev>0) {
			$tbl .= "_tmp";
		}
		$sql = "select * from ".$tbl."  where cat_type = 2 and cat_active = 1 ";
		if(is_numeric($cat_sidx_code)){
			 $sql .= " and cat_sidx_code = ?";
			 $whrdata[] = $cat_sidx_code;
		}
		$sql .= " order by cat_order";
		if(count($whrdata) > 0) {
			$result = $this->db->prepare($sql,$whrdata);
		} else {
			$result = $this->db->query($sql);
		}
		$rtn=$this->getcommonlist();
		if($result != null) {
			while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){
				$rtn[] = $row;
			}
		}
		return $rtn;
	}
	
	/* セクションコードからカテゴリ一覧を取得（管理画面用）,下書き、本番テーブルから全部取得
	 * @param secusr_sidx_code;
	 */
	function getlistAll($cat_sidx_code=null) {
		$sql = "select 
				tbl_category_tmp.cat_code 			as cat_code_tmp,
				tbl_category_tmp.cat_view 			as cat_view_tmp,
				tbl_category_tmp.cat_menuflg 		as cat_menuflg_tmp,
				tbl_category_tmp.cat_smapflg 		as cat_smapflg_tmp,
				tbl_category_tmp.cat_sidx_code 		as cat_sidx_code_tmp,
				tbl_category_tmp.cat_name 			as cat_name_tmp,
				tbl_category_tmp.cat_order 			as cat_order_tmp,
				tbl_category_tmp.cat_dir 			as cat_dir_tmp,
				tbl_category_tmp.cat_c_date 		as cat_c_date_tmp,
				tbl_category_tmp.cat_u_date 		as cat_u_date_tmp,
				tbl_category.cat_code,
				tbl_category.cat_view,
				tbl_category.cat_menuflg,
				tbl_category.cat_sidx_code,
				tbl_category.cat_name,
				tbl_category.cat_order,
				tbl_category.cat_dir,
				tbl_category.cat_c_date,
				tbl_category.cat_u_date
				from tbl_category_tmp 
				left outer join tbl_category on tbl_category_tmp.cat_code = tbl_category.cat_code
				where tbl_category_tmp.cat_type = 2 and tbl_category_tmp.cat_active = 1 ";
		if(is_numeric($cat_sidx_code)){
			 $sql .= " and tbl_category_tmp.cat_sidx_code = ?";
			 $whrdata[] = $cat_sidx_code;
		}
		$sql .= " order by tbl_category_tmp.cat_order";
		if(count($whrdata) > 0) {
			$result = $this->db->prepare($sql,$whrdata);
		} else {
			$result = $this->db->query($sql);
		}
		$rtn=$this->getcommonlist();
		if($result != null) {
			while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){
				$rtn[$row["cat_code_tmp"]] = $row;
			}
		}
		return $rtn;
	}
	
	/*
	 * 共通カテゴリの取得
	 */
	function getcommonlist() {
		$sql = "select * from tbl_category where cat_sidx_code is null and cat_type = 1 and cat_active = 1 order by cat_order";
		$result = $this->db->query($sql);
		$rtn=null;
		if($result != null) {
			while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){
				$rtn[$row["cat_code"]] = $row;
			}
		}
		return $rtn;
	}
	
	/**
	 * コードからセッション情報取得
	 * @param sidx_code
	 * @return	array
	 */
	function getData($cat_code,$prev=false)
	{
		$tbl = $prev ? "tbl_category_tmp": "tbl_category";
		if(isset($cat_code)&&is_numeric($cat_code)) {
			$sql = "select * 
					from ".$tbl." 
					where cat_code = ?";
			$result = $this->db->prepare($sql,$cat_code);
			if($result != null) {
				return $result->fetchRow(DB_FETCHMODE_ASSOC);
			}
		}
		return null;
	}
	
	/*
	 * カテゴリディレクトリからカテゴリ情報取得
	 */
	function getCatFromDir($sidx_code,$dir,$prev=0) {
		$tbl = "tbl_category";
		if(is_numeric($prev)&&$prev>0) {
			$tbl .= "_tmp";
		}
		$sql = "select * from ".$tbl." where cat_active = 1 ";
		$order = " order by cat_order";
		if(isset($dir)) {
			$sql .= " and cat_dir like ?";
			if(is_numeric($sidx_code)&&$sidx_code != null) {
				$sql .= " and cat_sidx_code = ".$sidx_code;
			} else {
				return null;
			}
			$result = $this->db->prepare($sql.$order,$dir);
		} else {
			$sql .= " and (cat_dir is null or cat_dir like '')";
			$result = $this->db->query($sql.$order);
		}
		$row = $result->fetchRow(DB_FETCHMODE_ASSOC);
		return $row;
	}

	//データ保存
	function doSave($post)
	{
		if(isset($post["cat_code"])&&is_numeric($post["cat_code"])) {
			return $this->update($post);
		} else {
			return $this->insert($post);
		}
	}
	
	/**
	 * 新規登録
	 * @return	null or err_str
	 */
	function insert( $post )
	{
		foreach($this->columns as $val) {
			$record[$val["column"]] = $post[$val["column"]];
		}
		$record["cat_c_date"] = "now()";
		$record["cat_u_date"] = "now()";
		$record["cat_active"] = 1;
		$record["cat_type"] = 2;
		$record["cat_sidx_code"] = $post["sidx_code"];
		
		$this->db->query('BEGIN');
		$record["cat_code"] = $this->db->getKey("tbl_category_cat_code");//登録ID
		if($this->db->insert("tbl_category_tmp",$record)) {
			$this->db->query('COMMIT');
			return null;
		}
		$this->db->query('ROLLBACK');
		return "保存に失敗しました";
	}
	
	/**
	 * 更新内容の登録
	 * @return	null or err_str
	 */
	function update($post)
	{
		foreach($this->columns as $val) {
			$record[$val["column"]] = $post[$val["column"]];
		}
		if(isset($record["cat_code"]) && is_numeric($record["cat_code"])) {
			//カラム除外
			unset($record["cat_sidx_code"]);
			unset($record["cat_c_date"]);
			unset($record["cat_active"]);
			unset($record["cat_type"]);
			$record["cat_u_date"] = "now()";
			$this->db->query('BEGIN');
			if($this->db->update("tbl_category_tmp", $record,"cat_code=".$record["cat_code"])) {
				$this->db->query('COMMIT');
				return null;
			}
			$this->db->query('ROLLBACK');
			return "・保存に失敗しました";
		}
		return "・コードが不明です";
	}
	
	/**
	 * カテゴリ削除
	 * @return	null or err_str
	 */
	function delete($post) {
		if(isset($post["cat_code"]) && is_numeric($post["cat_code"])) {
			$this->db->query('BEGIN');
			if(!$this->db->update("tbl_category", array("cat_active"=>0,"cat_u_date"=>"now()"),"cat_code=".$post["cat_code"])) {
				$this->db->query('ROLLBACK');
				return "・削除に失敗しました";
			}
			if(!$this->db->update("tbl_category_tmp", array("cat_active"=>0,"cat_u_date"=>"now()"),"cat_code=".$post["cat_code"])) {
				$this->db->query('ROLLBACK');
				return "・削除に失敗しました";
			}
			//ページ削除
			if(!$this->db->update("tbl_page_idx", array("pidx_active"=>0,"pidx_u_date"=>"now()"),"pidx_cat_code=".$post["cat_code"])) {
				$this->db->query('ROLLBACK');
				return "・削除に失敗しました";
			}
			if(!$this->db->update("tbl_page_idx_tmp", array("pidx_active"=>0,"pidx_u_date"=>"now()"),"pidx_cat_code=".$post["cat_code"])) {
				$this->db->query('ROLLBACK');
				return "・削除に失敗しました";
			}
			$this->db->query('COMMIT');
			return null;
		}
		return "・カテゴリコードが不明です";
	}
	
	/*
	 * 表示順変更
	 * @param array($cat_code=>$cat_order)
	 * @return boolean
	 */
	function setOrder($orderlist) {
		if(is_array($orderlist)) {
			$this->db->query('BEGIN');
			foreach($orderlist as $key => $val) {
				if(is_numeric($key)&&is_numeric($val)&&$val>=0) {
					if(!$this->db->update("tbl_category_tmp", array("cat_order"=>$val),"cat_code=".$key)) {
						$this->db->query('ROLLBACK');
						return false;
					}
				}
			}
			$this->db->query('COMMIT');
			return true;
		}
		return false;
	}
	
	
}
/*
 * ディレクトリユニークチェック
 * @param $value
 */
function check_cat_dir($value,$sub_ar=null) {
	$dir = isset($sub_ar["cat_dir"]) ? $sub_ar["cat_dir"] : "";
	$cat_sidx_code = isset($sub_ar["sidx_code"]) ? $sub_ar["sidx_code"] : "";
	$cat_code = isset($sub_ar["cat_code"]) ? $sub_ar["cat_code"] : "";
	$db = null;
	$db = DB::connect(DSN);
	if(PEAR::isError($db)) {
		die($db->getMessage());
	}
	
	$sql = "select count(*) from tbl_category where cat_dir like '{$dir}' and cat_active = 1 ";
	if($cat_sidx_code != null && is_numeric($cat_sidx_code)) {
		$sql .= " and cat_sidx_code = '{$cat_sidx_code}'";
	}
	if($cat_code != null && is_numeric($cat_code)) {
		$sql .= " and cat_code != '{$cat_code}'";
	}
	$cnt = $db->getOne($sql);
	$sql = "select count(*) from tbl_category_tmp where cat_dir like '{$dir}' and cat_active = 1 ";
	if($cat_sidx_code != null && is_numeric($cat_sidx_code)) {
		$sql .= " and cat_sidx_code = '{$cat_sidx_code}'";
	}
	if($cat_code != null && is_numeric($cat_code)) {
		$sql .= " and cat_code != '{$cat_code}'";
	}
	$cnt += $db->getOne($sql);
	if($cnt == 0) {
		return true;
	} else {
		return false;
	}
}
?>