<?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/>.
 */

require_once (LIB_PATH.'/common/userDB.php');
require_once (LIB_PATH.'/common/sectionuserDB.php');
require_once (LIB_PATH.'/common/categoryDB.php');
require_once (LIB_PATH.'/common/templateDB.php');
require_once (LIB_PATH.'/common/skinDB.php');
/**
 * セッション関連のメインクラス(旧blog.php)
 *
 */
class sectionIdxDB extends Model
{
/*
--セクション基本情報------------------------------------------------------------
DROP TABLE IF EXISTS tbl_section_idx CASCADE;
CREATE TABLE tbl_section_idx (
	sidx_code               serial,					--セクションコード
	sidx_extmodule_code	integer,				--拡張モジュールコード
	sidx_active             smallint default 1,			--０：非公開　１：公開
	sidx_view				smallint default 1,			-- -1:否認 ０：非公開　１：承認中（ログインユーザのみ公開）　２：承認済
	sidx_menuflg			smallint default 1,			--０：グローバルメニューには非表示　１：グローバルメニューに表示
	sidx_smapflg			smallint default 1,			--０：サイトマップユニットで非表示　1：サイトマップユニットで表示
    sidx_usr_code         	integer,					--作成者ユーザコード
    sidx_dir                text,						--ディレクトリ名
	sidx_ssl				smallint default 0,			--SSL表示フラグ 0:一般http, 1:sslエリア httpsで表示させる
    sidx_title              text,						--セクションタイトル（メニュー名）
	sidx_tpl_code			integer,					--テンプレートマスターコード
    sidx_css				text,						--オリジナルCSS
    sidx_comment_flg        smallint default 0,			--０：全てのコメントを拒否　１：全てのコメントを受信
	sidx_order             	integer,					--表示順
    sidx_c_date             timestamptz,				--登録日
    sidx_u_date             timestamptz,				--更新日
    primary key (sidx_code)
);

DROP TABLE IF EXISTS tbl_section_idx_tmp CASCADE;
CREATE TABLE tbl_section_idx_tmp (
    sidx_code               integer,						--セクションコード
	sidx_extmodule_code	integer,				--拡張モジュールコード
    sidx_active             smallint default 1,			--０：非公開　１：公開
	sidx_view				smallint default 1,			-- -1:否認 ０：非公開　１：承認中（ログインユーザのみ公開）　２：承認済
	sidx_menuflg			smallint default 1,			--０：グローバルメニューには非表示　１：グローバルメニューに表示
	sidx_smapflg			smallint default 1,			--０：サイトマップユニットで非表示　1：サイトマップユニットで表示
    sidx_usr_code         	integer,					--作成者ユーザコード
    sidx_dir                text,						--ディレクトリ名
	sidx_ssl				smallint default 0,			--SSL表示フラグ 0:一般http, 1:sslエリア httpsで表示させる
    sidx_title              text,						--セクションタイトル（メニュー名）
	sidx_tpl_code			integer,					--テンプレートマスターコード
    sidx_css				text,						--オリジナルCSS
    sidx_comment_flg        smallint default 0,			--０：全てのコメントを拒否　１：全てのコメントを受信
	sidx_order             	integer,					--表示順
    sidx_c_date             timestamptz,				--登録日
    sidx_u_date             timestamptz,				--更新日
    primary key (sidx_code)
);
INSERT INTO tbl_section_idx_tmp (sidx_code, sidx_usr_code, sidx_title, sidx_tpl_code, sidx_order,sidx_c_date, sidx_u_date)
VALUES (nextval('tbl_section_idx_sidx_code_seq'), 1, 'ホーム', 1, 0, now(), now());
*/
	var $_form = null;
	var $erchk = 'server';//quickformエラーチェックのフラグ'client'or'server;
	var $db=null;
	//KVa => 半カナを全カナ,濁点つきの文字を１文字に変換する (K、H と共に利用する）,全角英数字を半角英数字に変換する
	//KVC => 半カナを全カナ,濁点つきの文字を１文字に変換する (K、H と共に利用する）,全角ひらがなを全角カタカナに変換する
	//n   => 全角数字を半角数字に変換する
	var $columns = array(
						array("column"=>"sidx_code","conv"=>"n","tags"=>false),				//セクションコード
						array("column"=>"sidx_extmodule_code","conv"=>"n","tags"=>false),	//モジュールコード　
						array("column"=>"sidx_active","conv"=>"n","tags"=>false),			//０：非公開　１：公開
						array("column"=>"sidx_view","conv"=>"n","tags"=>false),				// -1:否認 ０：非公開　１：承認中（ログインユーザのみ公開）　２：承認済
						array("column"=>"sidx_menuflg","conv"=>"n","tags"=>false),			//０：グローバルメニューには非表示　１：グローバルメニューに表示
						array("column"=>"sidx_smapflg","conv"=>"n","tags"=>false),			//０：サイトマップユニットで非表示　1：サイトマップユニットで表示
						array("column"=>"sidx_usr_code","conv"=>"n","tags"=>false),			//作成者ユーザコード
						array("column"=>"sidx_dir","conv"=>"a","tags"=>false),				//ディレクトリ名
						array("column"=>"sidx_ssl","conv"=>"n","tags"=>false),				//ssl利用可否
						array("column"=>"sidx_title","conv"=>"KVa","tags"=>false),			//セクションタイトル（メニュー名）
						array("column"=>"sidx_tpl_code","conv"=>"n","tags"=>false),		//テンプレートコード
						array("column"=>"sidx_css","conv"=>"a","tags"=>true),				//独自css
						array("column"=>"sidx_comment_flg","conv"=>"n","tags"=>false),		//０：全てのコメントを拒否　１：全てのコメントを受信
						array("column"=>"sidx_order","conv"=>"n","tags"=>false),			//表示順
						array("column"=>"sidx_c_date","conv"=>"","tags"=>false),			//登録日
						array("column"=>"sidx_u_date","conv"=>"KVa","tags"=>false)			//更新日
						);

	function sectionIdxDB()
	{
		$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','sidx_usr_code', $this->getrequest("sidx_usr_code"));
		$this->_form->addElement('hidden','sidx_active', $this->getrequest("sidx_active"));
		//$this->_form->addElement('hidden','sidx_tpl_code', $this->getrequest("sidx_tpl_code"));
		$this->_form->addElement('hidden','sidx_view', null);

		if(!is_numeric($this->getRequest("sidx_code"))) {
			//モジュール専用メニュー選択項目作成
			$sql = "select extmodule_code,extmodule_name from tbl_extmodule 
				inner join tbl_extsection_idx on extmodule_code = sidx_extmodule_code 
				where extmodule_active = 1
				order by extmodule_code desc";
			$result = $this->db->query($sql);
			$rtn=null;
			if($result != null) {
				while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){
					$rtn[$row["extmodule_code"]] = $row["extmodule_name"];
				}
			}
			if(is_array($rtn) && count($rtn)>0) {
				$rtn = array(""=>"-- モジュール選択 --")+$rtn;
				$this->_form->addElement('select', 'sidx_extmodule_code', null, $rtn);
			}
		} else {
			$this->_form->addElement('hidden', 'sidx_extmodule_code', null);
		}


		$this->_form->addElement('text','sidx_title', null, array('size'=>50,'maxlength'=>'50','id'=>'sidx_title'));

		$item=array();
		$item[]=&HTML_QuickForm::createElement('radio', null, null, '表示', 1);
		//$item[]=&HTML_QuickForm::createElement('radio', null, null, 'プレビュー時のみ表示', 2);
		$item[]=&HTML_QuickForm::createElement('radio', null, null, '非表示', 0);

		if($this->getRequest("sidx_code")!=1) { //topセクションの場合は変更不可とする
			$this->_form->addGroup($item,'sidx_menuflg');
		} else {
			$this->_form->addElement('hidden','sidx_menuflg', 1);
		}
		$item=array();
		$item[]=&HTML_QuickForm::createElement('radio', null, null, '表示', 1);
		$item[]=&HTML_QuickForm::createElement('radio', null, null, '非表示', 0);
		if($this->getRequest("sidx_code")!=1) { //topセクションの場合は変更不可とする
			$this->_form->addGroup($item,'sidx_smapflg');
		} else {
			$this->_form->addElement('hidden','sidx_smapflg', 1);
		}
		
		if($this->getRequest("sidx_code")!=1) { //topセクションの場合は変更不可とする
			$this->_form->addElement('text','sidx_dir', null, array('size'=>20,'maxlength'=>'40','id'=>'sidx_dir','style'=>'ime-mode:disabled'));
		} else {
			$this->_form->addElement('hidden','sidx_dir', null);
		}
		
		//設定済みテンプレート選択ラジオ
		//テンプレートマスタより「利用する」となっているテンプレート一覧を取得
		$tpllist = templateDB::getList();
		$item=array();
		if(is_array($tpllist)) {
			foreach($tpllist as $key=>$val) {
				$tpllist[$key]["thum"] = TEMPLATE_DIR."/".$val["skin_path"]."/thum.jpg";
				$item[]=&HTML_QuickForm::createElement('radio', null, null, $val["tpl_name"], $val["tpl_code"]);
			}
			$this->_form->addGroup($item,'sidx_tpl_code', null, '<br>');
		} else {
			$this->_form->addElement('hidden','sidx_tpl_code', null);
		}
		$this->_view->assign("tpllist",$tpllist);
		$this->_view->assign('TEMPLATE_DIR',TEMPLATE_DIR);
		
		$this->_form->addElement('advcheckbox', "sidx_ssl", null, 'SSLで表示する', 1);

		$this->_form->addElement('hidden','sidx_comment_flg', 0);
		$this->_form->addElement('hidden','sidx_order', null);

		//編集担当者リスト作成
		$ulist = userDB::getList($name=null,$kanri=0);
		$item=array();
		if(is_array($ulist)) {
			foreach($ulist as $key=>$val) {
				$item[] =& $this->_form->addElement('advcheckbox', $val["usr_code"], null,$val["usr_sei"]." ".$val["usr_mei"],$val["usr_code"],$val["usr_code"]);//画像削除チェックボックス
			}
		}
		$secusr_usr_codes =& $this->_form->addGroup($item, "secusr_usr_codes", null, '&nbsp;');
		if($_SESSION["usr_info"]["usr_kanri"]==0) { //担当者の割り当てを編集できるのは管理権限のみ
			$secusr_usr_codes->freeze();
		}

		$usr_sei=&$this->_form->addElement('text','usr_sei', null);
		$usr_mei=&$this->_form->addElement('text','usr_mei', null);
		$usr_sei->freeze();
		$usr_mei->freeze();
		
		$udate=&$this->_form->addElement('text','sidx_u_date', null);
		//$udate->freeze();
		
	}
	//フォーム入力エラーチェックの設定
	function setRules()
	{
		$this->_form->applyFilter('__ALL__','trim');
		$this->_form->_submitValues = DataBase::ConvColumnVals($this->_form->_submitValues,$this->columns); //ルールに従った値変換、タグの除去
		$this->_form->setJsWarnings('下記の項目が不正です。','');
		$this->_form->registerRule('check_kana_valid', 'callback','check_kana');

		$this->_form->addRule('sidx_title','・「グローバルメニュータイトル」を入力してください','required',null,$this->erchk);
		$this->_form->addRule('sidx_title','・「グローバルメニュータイトル」は全角50文字以内です','maxlength',150,$this->erchk);

		$this->_form->addRule('sidx_menuflg','・「メニュー表示」を選択してください','required',null,$this->erchk);
		$this->_form->addRule('sidx_smapflg','・「サイトマップユニットでの表示」を選択してください','required',null,$this->erchk);
		if($this->getRequest("sidx_code")!=1) { //topセクションの場合は変更不可とする
			$this->_form->addRule('sidx_dir','・「ディレクトリ名」を入力してください','required',null,$this->erchk);
			$this->_form->addRule('sidx_dir','・「ディレクトリ名」は半角英数40文字以内で入力してください', 'regex', '/^[a-zA-Z0-9_-]{1,40}$/', $this->erchk);
			//ユニークチェック
			$this->_form->registerRule('secdir_valid', 'callback','check_section_dir');
			$this->_form->addRule('sidx_dir','・ご入力いただきました「ディレクトリ名」は既に登録されています','secdir_valid',$_REQUEST,$this->erchk);
			//adminチェック
			$this->_form->registerRule('secdir_admin_valid', 'callback','check_section_admindir');
			$this->_form->addRule('sidx_dir','・ご入力いただきました「ディレクトリ名」はシステムで利用しているため登録できません','secdir_admin_valid',$_REQUEST,$this->erchk);
		}
		$this->_form->addRule('sidx_comment_flg','・「コメント設定」を選択してください','required',null,$this->erchk);


		$this->_form->addRule('sidx_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("sidx_code")>0 && $this->getRequest("sidx_code")!=1) { //sidx_code =1 (ホームセクション)は削除不可
				$buttons[] = $this->_form->createElement('submit','BTNdelete',' 削除 ',array('id'=>'BTNdelete','class'=>'bBtnDelete','onClick'=>'return confirm(\'グローバルメニュー以下に登録されているローカルメニューやページも削除されます。\n本当に削除してよろしいですか？\')'));
			}
		}
		$this->_form->addGroup($buttons,"buttons", null, '&nbsp;&nbsp;');
	}

	/**
	* 登録セッション検索 グローバルメニュー一覧
	* @param    $usr_code  登録ユーザコード、nullの場合は全件、指定された場合は可能セクションのみ
	* @return　bool
	*/
	function getList($usr_code=null,$prev=0)
	{
		$whrsql = null;
		$tbl = "tbl_section_idx";
		if(is_numeric($prev)&&$prev>0) {
			$tbl .= "_tmp";
		}
		$sql = "select * from ".$tbl." 
				inner join tbl_user on sidx_usr_code = usr_code
				where sidx_active = 1";
		if (is_numeric($usr_code)) {
			$result0 = $this->db->prepare("select secusr_sidx_code from tbl_section_user where secusr_usr_code = ?", $usr_code);
			if($result0 != null) {
				while($row0 = $result0->fetchRow(DB_FETCHMODE_ASSOC)) {
					$usrwhr[] = $row0["secusr_sidx_code"];
				}
			}
			$whrsql = " and tbl_section_idx_tmp.sidx_code in (".implode(',',$usrwhr).")";
		}
		$sql .= " ORDER BY sidx_order,sidx_c_date";
		$result = $this->db->query($sql.$whrsql);
		$rtn=null;
		if($result != null) {
			while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){
				$rtn[$row["sidx_code"]] = $row;
			}
		}
		return $rtn;
	}

	//管理画面ページ一覧取得
	//tmp と本番outerでつないで全部とります
	function getlistAll($usr_code=null) {
		$whrsql = null;
		$order = null;
		if (is_numeric($usr_code)) {
			$result0 = $this->db->prepare("select secusr_sidx_code from tbl_section_user where secusr_usr_code = ?", $usr_code);
			if($result0 != null) {
				while($row0 = $result0->fetchRow(DB_FETCHMODE_ASSOC)) {
					$usrwhr[] = $row0["secusr_sidx_code"];
				}
			}
			if(isset($usrwhr) && is_array($usrwhr)) {
				$whrsql = " and tbl_section_idx_tmp.sidx_code in (".implode(',',$usrwhr).")";
			}
		}
		$order .= " order by tbl_section_idx_tmp.sidx_order, tbl_section_idx_tmp.sidx_c_date";
		$sql = "select
				tbl_section_idx_tmp.sidx_code 			as sidx_code_tmp,
				tbl_section_idx_tmp.sidx_active 		as sidx_active_tmp,
				tbl_section_idx_tmp.sidx_view 			as sidx_view_tmp,
				tbl_section_idx_tmp.sidx_menuflg		as sidx_menuflg_tmp,
				tbl_section_idx_tmp.sidx_smapflg		as sidx_smapflg_tmp,
				tbl_section_idx_tmp.sidx_usr_code		as sidx_usr_code_tmp,
				tbl_section_idx_tmp.sidx_dir			as sidx_dir_tmp,
				tbl_section_idx_tmp.sidx_ssl			as sidx_ssl_tmp,
				tbl_section_idx_tmp.sidx_title			as sidx_title_tmp,
				tbl_section_idx_tmp.sidx_tpl_code		as sidx_tpl_code_tmp,
				tbl_section_idx_tmp.sidx_css			as sidx_css_tmp,
				tbl_section_idx_tmp.sidx_comment_flg	as sidx_comment_flg_tmp,
				tbl_section_idx_tmp.sidx_order			as sidx_order_tmp,
				tbl_section_idx_tmp.sidx_c_date			as sidx_c_date_tmp,
				tbl_section_idx_tmp.sidx_u_date			as sidx_u_date_tmp,
				tbl_section_idx.sidx_code,
				tbl_section_idx.sidx_active,
				tbl_section_idx.sidx_view,
				tbl_section_idx.sidx_menuflg,
				tbl_section_idx.sidx_usr_code,
				tbl_section_idx.sidx_dir,
				tbl_section_idx.sidx_ssl,
				tbl_section_idx.sidx_title,
				tbl_section_idx.sidx_tpl_code,
				tbl_section_idx.sidx_css,
				tbl_section_idx.sidx_comment_flg,
				tbl_section_idx.sidx_order,
				tbl_section_idx.sidx_c_date,
				tbl_section_idx.sidx_u_date
				FROM tbl_section_idx_tmp
				left outer join tbl_section_idx on tbl_section_idx_tmp.sidx_code = tbl_section_idx.sidx_code
				where tbl_section_idx_tmp.sidx_active = 1 ";
		$result = $this->db->query($sql.$whrsql.$order);
		$rtn=array();
		if($result != null) {
			while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){
				$rtn[$row["sidx_code_tmp"]] = $row;
			}
		}
		return $rtn;
	}
	
	/**
	 * コードから情報取得
	 * @param sidx_code
	 * @return	array
	 */
	function getData($sidx_code,$prev=false)
	{
		$tbl = $prev ? "tbl_section_idx_tmp": "tbl_section_idx";
		if(isset($sidx_code)&&is_numeric($sidx_code)) {
			$sql = "select *
					from ".$tbl."
					inner join tbl_user on sidx_usr_code = usr_code
					where sidx_code = ? and sidx_active = 1";
			$result = $this->db->prepare($sql,$sidx_code);
			if($result != null) {
				return $result->fetchRow(DB_FETCHMODE_ASSOC);
			}
		}
		return null;
	}

	/*
	 * ディレクトリ名からセッションデータ取得
	 */
	function getSidxFromDir($dir,$prev=0) {
		$tbl = "tbl_section_idx";
		if(is_numeric($prev)&&$prev>0) {
			$tbl .= "_tmp";
		}
		$sql = "select * from ".$tbl." where sidx_active = 1 ";
		$order = " order by sidx_order";
		if(isset($dir)) {
			$sql .= " and sidx_dir like ?";
			$result = $this->db->prepare($sql.$order,$dir);
		} else {
			$sql .= " and (sidx_dir is null or sidx_dir like '')";
			$result = $this->db->query($sql.$order);
		}
		$row = $result->fetchRow(DB_FETCHMODE_ASSOC);
		return $row;
	}


	//データ保存
	function doSave($post)
	{
		if(isset($post["sidx_code"])&&is_numeric($post["sidx_code"])) {
			return $this->update($post);
		} else {
			return $this->insert($post);
		}
	}
	/**
	 * 新規登録
	 * @return	null or err_str
	 */
	function insert( $post )
	{
		foreach($this->columns as $val) {
			if($post[$val["column"]]!=null){
				$record[$val["column"]] = $post[$val["column"]];
			} else {
				$record[$val["column"]] = null; //timestampがあるのでnullを入れてます
			}
		}
		$record["sidx_c_date"] = "now()";
		$record["sidx_u_date"] = "now()";
		$record["sidx_active"] = 1;
		$record["sidx_usr_code"] = $_SESSION["usr_info"]["usr_code"];
		$this->db->query('BEGIN');
		$record["sidx_code"] = $this->db->getKey("tbl_section_idx_sidx_code");//登録ID
		if($this->db->insert("tbl_section_idx_tmp",$record)) {
			//担当者の登録
			if (isset($post["secusr_usr_codes"])) {
				foreach($post["secusr_usr_codes"] as $key=>$val) {
					if(is_numeric($record["sidx_code"]) && is_numeric($val)) {
						if(!sectionuserDB::insert($record["sidx_code"],$val)) {
							$this->db->query('ROLLBACK');
							return "・担当者の保存に失敗しました";
						}
					}
				}
			}

			//モジュールメニューの場合はカテゴリとページを作成する
			if(isset($record["sidx_extmodule_code"]) && is_numeric($record["sidx_extmodule_code"])) {
				//カテゴリの登録を行う
				//tbl_extcategoryから登録するカテゴリをmodule_codeをもとに配列で取得
				$category_records = array();
				$sql = "select * from tbl_extcategory where cat_extmodule_code = ? order by cat_order";
				$result = $this->db->prepare($sql,$record["sidx_extmodule_code"]);
				while($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
					$row["cat_sidx_code"] = $record["sidx_code"];
					$row["cat_u_date"] = "now()";
					$row["cat_c_date"] = "now()";
					$category_records[$row["cat_code"]] = $row;
				}
				//tbl_category_tmpに登録
				foreach($category_records as $key => $val) {
					$category_records[$key]["cat_code"] = $this->db->getKey("tbl_category_cat_code");
					if(!$this->db->insert("tbl_category_tmp",$category_records[$key])) {
						$this->db->query('ROLLBACK');
						return "サブメニューの生成に失敗しました";
					}

				}
				//ページの登録
				//tbl_extpage_idxから登録するページをmodule_codeをもとに配列で取得
				$page_idx_records = array();
				$sql = "select * from tbl_extpage_idx where pidx_extmodule_code = ? order by pidx_code";
				$result = $this->db->prepare($sql,$record["sidx_extmodule_code"]);
				while($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
					$row["pidx_sidx_code"] = $record["sidx_code"];
					if($row["pidx_cat_code"]!=1) {
						$row["pidx_cat_code"] = $category_records[$row["pidx_cat_code"]]["cat_code"];
					}
					$row["pidx_date"] = "now()";
					unset($row["pidx_edate"]);
					$row["pidx_c_date"] = "now()";
					$row["pidx_u_date"] = "now()";
					$row["pidx_cusr_code"] = $_SESSION["usr_info"]["usr_code"];
					$row["pidx_uusr_code"] = $_SESSION["usr_info"]["usr_code"];
					if(is_numeric($row["pidx_cat_code"])) {
						$page_idx_records[$row["pidx_code"]] = $row;
					}
				}
				//tbl_page_idx_tmpに登録
				foreach($page_idx_records as $key => $val) {
					$page_idx_records[$key]["pidx_code"] = $this->db->getKey("tbl_page_idx_pidx_code");
					if(!$this->db->insert("tbl_page_idx_tmp",$page_idx_records[$key])) {
						$this->db->query('ROLLBACK');
						return "ページの生成に失敗しました";
					}

				}
				//コンテナの登録
				//上記で保存した各ページに対して1カラムのレイアウトコンテナを一点追加する				
				//登録しなくてはならないコンテナをmodule_codeをもとに取得
				$page_container_records = array();
				$sql = "select * from tbl_extpage_container where pagec_extmodule_code = ? order by pagec_pidx_code, pagec_order";
				$result = $this->db->prepare($sql,$record["sidx_extmodule_code"]);
				while($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
					$row["pagec_pidx_code"] = $page_idx_records[$row["pagec_pidx_code"]]["pidx_code"];
					$page_container_records[$row["pagec_code"]] = $row;
				}
				//登録
				foreach($page_container_records as $key => $val) {
					$page_container_records[$key]["pagec_code"] = $this->db->getKey("tbl_page_container_pagec_code");
					if(!$this->db->insert("tbl_page_container_tmp",$page_container_records[$key])) {
						$this->db->query('ROLLBACK');
						return "コンテナの登録に失敗しました";
					}

				}
				
				//専用ユニットの登録 (モジュールで生成されるページ毎にユニットを取得し登録）
				$page_unit_records = array();
				if(isset($page_idx_records) && is_array($page_idx_records)) {
					foreach($page_idx_records as $pagekey => $pageval) {
						$sql = "select * from tbl_extpage_unit where pageu_pidx_code = ? order by pageu_pidx_code, pageu_column, pageu_order";
						$result = $this->db->prepare($sql,$pagekey);
						while($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
							$row["pageu_pidx_code"] = $page_idx_records[$row["pageu_pidx_code"]]["pidx_code"]; //新しいページidの取得
							$row["pageu_pagec_code"] = $page_container_records[$row["pageu_pagec_code"]]["pagec_code"];
							$page_unit_records[$row["pageu_code"]] = $row;
						}
					}
				}
				//登録
				if(is_array($page_unit_records) && count($page_unit_records)>0) {
					foreach($page_unit_records as $key => $val) {
						$page_unit_records[$key]["pageu_code"] = $this->db->getKey("tbl_page_unit_pageu_code");
						if(!$this->db->insert("tbl_page_unit_tmp",$page_unit_records[$key])) {
							$this->db->query('ROLLBACK');
							return "ユニットの登録に失敗しました";
						}
	
					}
				}
			}
			$this->db->query('COMMIT');
			return null;
		}
		$this->db->query('ROLLBACK');
		return "保存に失敗しました";
	}

	/**
	 * 更新内容の登録
	 * @return	null or err_str
	 */
	function update($post)
	{
		foreach($this->columns as $val) {
			if($post[$val["column"]]!=null){
				$record[$val["column"]] = $post[$val["column"]];
			} else {
				$record[$val["column"]] = null; //timestampがあるのでnullを入れてます
			}
		}
		if(isset($record["sidx_code"]) && is_numeric($record["sidx_code"])) {
			//カラム除外
			unset($record["sidx_c_date"]);
			$record["sidx_u_date"] = "now()";
			$this->db->query('BEGIN');
			if($this->db->update("tbl_section_idx_tmp", $record,"sidx_code=".$record["sidx_code"])) {
				//登録者の削除
				if(!sectionuserDB::delete($record["sidx_code"])) {
					$this->db->query('ROLLBACK');
					return "・担当者の削除に失敗しました";
				}
				//担当者の登録
				if(is_array($post["secusr_usr_codes"])) {
					foreach($post["secusr_usr_codes"] as $key=>$val) {
						if(is_numeric($record["sidx_code"]) && is_numeric($val)) {
							if(!sectionuserDB::insert($record["sidx_code"],$val)) {
								$this->db->query('ROLLBACK');
								return "・担当者の保存に失敗しました";
							}
						}
					}
				}
				$this->db->query('COMMIT');
				return null;
			}
			$this->db->query('ROLLBACK');
			return "・保存に失敗しました";
		}
		return "・コードが不明です";
	}

	/**
	 * セクション削除
	 * @return	null or err_str
	 */
	function delete($post) {
		if(isset($post["sidx_code"]) && is_numeric($post["sidx_code"])) {
			$this->db->query('BEGIN');
			//グローバル情報削除
			if(!$this->db->update("tbl_section_idx", array("sidx_active"=>0,"sidx_u_date"=>"now()"),"sidx_code=".$post["sidx_code"])) {
				$this->db->query('ROLLBACK');
				return "・削除に失敗しました";
			}
			if(!$this->db->update("tbl_section_idx_tmp", array("sidx_active"=>0,"sidx_u_date"=>"now()"),"sidx_code=".$post["sidx_code"])) {
				$this->db->query('ROLLBACK');
				return "・削除に失敗しました";
			}
			//サブカテゴリ削除
			if(!$this->db->update("tbl_category", array("cat_active"=>0,"cat_u_date"=>"now()"),"cat_sidx_code=".$post["sidx_code"])) {
				$this->db->query('ROLLBACK');
				return "・削除に失敗しました";
			}
			if(!$this->db->update("tbl_category_tmp", array("cat_active"=>0,"cat_u_date"=>"now()"),"cat_sidx_code=".$post["sidx_code"])) {
				$this->db->query('ROLLBACK');
				return "・削除に失敗しました";
			}
			//ページ削除
			if(!$this->db->update("tbl_page_idx", array("pidx_active"=>0,"pidx_u_date"=>"now()"),"pidx_sidx_code=".$post["sidx_code"])) {
				$this->db->query('ROLLBACK');
				return "・削除に失敗しました";
			}
			if(!$this->db->update("tbl_page_idx_tmp", array("pidx_active"=>0,"pidx_u_date"=>"now()"),"pidx_sidx_code=".$post["sidx_code"])) {
				$this->db->query('ROLLBACK');
				return "・削除に失敗しました";
			}
			$this->db->query('COMMIT');
			return null;
		}
		return "・セクションコードが不明です";
	}

	/*
	 * セクション表示順変更
	 * @param array($sidx_code=>$sidx_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_section_idx", array("sidx_order"=>$val),"sidx_code=".$key)) {
						$this->db->query('ROLLBACK');
						return false;
					}
					if(!$this->db->update("tbl_section_idx_tmp", array("sidx_order"=>$val),"sidx_code=".$key)) {
						$this->db->query('ROLLBACK');
						return false;
					}
				}
			}
			$this->db->query('COMMIT');
			return true;
		}
		return false;
	}

	function setTplCode($tpl_code, $sidx_code_ar) {
		if(is_numeric($tpl_code)&&is_array($sidx_code_ar)) {
			$this->db->query('BEGIN');
			foreach($sidx_code_ar as $key => $val) {
				if(is_numeric($val)&&$val>0) {
					if(!$this->db->update("tbl_section_idx_tmp", array("sidx_view"=>1,"sidx_tpl_code"=>$tpl_code,"sidx_u_date"=>'now()'),"sidx_code=".$val)) {
						$this->db->query('ROLLBACK');
						return false;
					}
				}
			}
			$this->db->query('COMMIT');
			return true;
		} else {
			return false;
		}

	}
	
	function setPublicToEditData($sidx_code=null) {
		if(is_numeric($sidx_code)&&$sidx_code>0) {
			$this->db->query('BEGIN');
			//承認フラグアップデート
			if(!$this->db->update("tbl_section_idx_tmp", array("sidx_view"=>1),"sidx_code=".$sidx_code)) {
				$this->db->query('ROLLBACK');
				return false;
			} else {
				$this->db->query('COMMIT');
				return true;
			}
		}
		return false;
	}
	
	
	//下書きテーブルから本番用テーブルへのコピー処理
	// @param $sidx_code integer : ページ番号
	// @return boolean
	function setPublicData($sidx_code=null) {
		if(is_numeric($sidx_code)&&$sidx_code>0) {
			$this->db->query('BEGIN');
			if(!$this->db->delete("tbl_section_idx", "sidx_code=".$sidx_code)) {
				$this->db->query('ROLLBACK');
				return false;
			}
			//承認フラグアップデート
			if(!$this->db->update("tbl_section_idx_tmp", array("sidx_view"=>2),"sidx_code=".$sidx_code)) {
				$this->db->query('ROLLBACK');
				return false;
			}

			$sql = "insert into tbl_section_idx (select * from tbl_section_idx_tmp where sidx_code = ".$sidx_code.")";
			if(!$this->db->query($sql)) {
				$this->db->query('ROLLBACK');
				return false;
			}
			if(!$this->db->delete("tbl_category", "cat_sidx_code=".$sidx_code)) {
				$this->db->query('ROLLBACK');
				return false;
			}
			$sql = "insert into tbl_category (select * from tbl_category_tmp where cat_sidx_code = ".$sidx_code.")";
			if(!$this->db->query($sql)) {
				$this->db->query('ROLLBACK');
				return false;
			}
			$this->db->query('COMMIT');
			return true;
		} else { //sidx_codeの指定が無い場合は全て公開処理
			$this->db->query('BEGIN');
			if(!$this->db->delete("tbl_section_idx")) {
				$this->db->query('ROLLBACK');
				return false;
			}
			//承認フラグアップデート
			if(!$this->db->update("tbl_section_idx_tmp", array("sidx_view"=>2),"sidx_active=1")) {
				$this->db->query('ROLLBACK');
				return false;
			}
			$sql = "insert into tbl_section_idx (select * from tbl_section_idx_tmp where sidx_active = 1)";
			if(!$this->db->query($sql)) {
				$this->db->query('ROLLBACK');
				return false;
			}
			if(!$this->db->delete("tbl_category")) {
				$this->db->query('ROLLBACK');
				return false;
			}
			$sql = "insert into tbl_category (select * from tbl_category_tmp where cat_active=1)";
			if(!$this->db->query($sql)) {
				$this->db->query('ROLLBACK');
				return false;
			}
			
			$this->db->query('COMMIT');
			return true;
		}
		return false;
	}

}
/*
 * ディレクトリユニークチェック
 * @param $value
 */
function check_section_dir($value,$sub_ar=null) {
	$dir = isset($sub_ar["sidx_dir"]) ? $sub_ar["sidx_dir"] : "";
	$sidx_code = isset($sub_ar["sidx_code"]) ? $sub_ar["sidx_code"] : "";
	$db = null;
	$db = DB::connect(DSN);
	if(PEAR::isError($db)) {
		die($db->getMessage());
	}
	$sql = "select count(*) from tbl_section_idx where sidx_dir like '{$dir}' and sidx_active = 1";
	if($sidx_code != null && is_numeric($sidx_code)) {
		$sql .= " and sidx_code != '{$sidx_code}'";
	}
	$cnt = $db->getOne($sql);
	$sql = "select count(*) from tbl_section_idx_tmp where sidx_dir like '{$dir}' and sidx_active = 1";
	if($sidx_code != null && is_numeric($sidx_code)) {
		$sql .= " and sidx_code != '{$sidx_code}'";
	}
	$cnt += $db->getOne($sql);
	if($cnt == 0) {
		return true;
	} else {
		return false;
	}
}

/*
 * adminディレクトリチェック
 */
function check_section_admindir($value,$sub_ar=null) {
	$dir = isset($sub_ar["sidx_dir"]) ? $sub_ar["sidx_dir"] : "";
	if($dir != "admin"){
		return true;
	} else {
		return false;
	}
}
?>