<?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/extunitDB.php');
class Admin_admin_unitmodule_Index extends extunitDB
{

	function prepare($view)
	{
		$this->_form = new HTML_QuickForm('search','post',$_SERVER['PHP_SELF'],'',null,true);
		$this->_form->addElement('file', 'installfile', '');//zipアップ用ボタン
		$this->_form->addElement('submit','BTNinstall',' 登録 ',array('id'=>'BTNinstall','class'=>'bBtnReg'));
		$this->_form->addRule('installfile','・拡張ユニットの圧縮ファイルを選択してください。','uploadedfile',null,'server');	
		return null;
	}
	
	function perform($view)
	{
		//ユニット.zipアップロード
		if($this->getRequest("BTNinstall")) {
			if($this->_form->validate()) {
				$upfile_name = explode(".", $_FILES["installfile"]["name"]);
				if(isset($upfile_name[1])&&$upfile_name[1] == "zip") {
					if (is_uploaded_file($_FILES['installfile']["tmp_name"])) {
						$fl = $this->_form->getElement('installfile');
						$result = $this->installUnit($fl,"installfile");
						if($result!=null) {
							$this->_form->setElementError("",$result);
						}
					} else {
						$this->_form->setElementError("","・アップロードに失敗しました。");
					}
				} else {
					$this->_form->setElementError("","・アップロードできるファイル形式はzipファイルのみとなっております。");
				}
			}
		} else if($this->getRequest("Btndel")) {//削除
			$del_code = $this->getRequest('unit_code');
			if(is_numeric($del_code)) {
				$rtn = $this->deleteExtUnit($del_code);
				if($rtn===true) {
					require_once (LIB_PATH.'/common/unitCache.php');
					$cache = new unitCache();
					$cache->makeCache(&$view);
					$this->_form->setElementError("","・削除しました。");
				} else if($rtn===false){
					$this->_form->setElementError("","削除に失敗しました");
				} else {
					$this->_form->setElementError("",$rtn);
				}
			} else {
				$this->_form->setElementError("","コードが不明です");
			}

		} else if($this->getRequest("BtnUpdate")) {//更新
			$update_code = $this->getRequest('unit_code');
			if(is_numeric($update_code)) {
				$rtn = $this->ExtUnitVersionUpdate($update_code);
				if($rtn===true) {
					$this->_form->setElementError("","更新しました");
				} else if($rtn===false){
					$this->_form->setElementError("","更新に失敗しました");
				} else {
					$this->_form->setElementError("",$rtn);
				}
			} else {
				$this->_form->setElementError("","コードが不明です");
			}
		}
		
		//登録エラー時
		if(!empty($this->_form->_errors)) {
			$view->assign('ERROR',$this->_form->_errors);
			foreach($this->_form->_errors as $key => $val) {
				$this->_form->updateElementAttr($key, array("class"=>"err"));
			}
		}
		
		//リスト表示
		//$view->assign('designlist', $this->getList(4)); //拡張デザインユニット
		//$view->assign('functionlist', $this->getList(5)); //拡張機能ユニット
		$list = $this->getList(array(4,5));
		//使用ページ取得
		//表示されるモジュールのコードを取得
		$ext_d_unit = array();
		$ext_f_unit = array();
		if(isset($list)&&is_array($list)) {
			$extunit_code_ar = array();
			foreach($list as $key => $val) {
				$extunit_code_ar[] = $val["unit_code"];
			}
			//モジュール専用ユニットが配置されているページを取得する
			$unituseplist = $this->getExtUnitUsingPages($extunit_code_ar);
			foreach($list as $key => $val) {
				if(isset($unituseplist["tmp"][$val["unit_code"]]) && is_array($unituseplist["tmp"][$val["unit_code"]])) {
					//編集中のページリストを格納
					$list[$key]["usepagesontmp"] =$unituseplist["tmp"][$val["unit_code"]];
				}
				if(isset($unituseplist["open"][$val["unit_code"]]) && is_array($unituseplist["open"][$val["unit_code"]])) {
					//編集中のページリストを格納
					$list[$key]["usepagesonopen"] = $unituseplist["open"][$val["unit_code"]];
				}
				//バージョンアップデートの確認
				//モジュールディレクトリの設定ファイルを読み込み
				$list[$key]["update"] = 0;
				if(file_exists(EXT_UNITS_PATH."/".$val["unit_idname"]."/extunitCnf.inc")) {
					require(EXT_UNITS_PATH."/".$val["unit_idname"]."/extunitCnf.inc");
					if($VERSION>$val["unit_ver"]&&file_exists(EXT_UNITS_PATH."/".$val["unit_idname"]."/util/update.php")) {
						$list[$key]["update"] = 1;
					}
				}
				if($val["unit_type"]==4) {
					$ext_d_unit[] = $list[$key];
				} else {
					$ext_f_unit[] = $list[$key];
				}
			}
		}
		
		$view->assign('designlist', $ext_d_unit); //拡張デザインユニット
		$view->assign('functionlist', $ext_f_unit); //拡張機能ユニット

		$renderer =& new HTML_QuickForm_Renderer_ArraySmarty($view);
		$this->_form->accept($renderer);
		$view->assign('form',$renderer->toArray());
		
        return 'unit-module/index.tpl';
	}

	function installUnit($fl,$felename) {
		if (!is_dir(EXT_UNITS_WORKPATH)) {
			if (!mkdir(EXT_UNITS_WORKPATH, 0777)) {
				return "・保存先ディレクトリを作成できませんでした。";
			}
		}
		//workディレクトリにzipを保存
		if (!$fl->moveUploadedFile(EXT_UNITS_WORKPATH, $_FILES[$felename]["name"])) {
			return "・ファイルの保存に失敗しました。";
		} 
		$zipfilepath = EXT_UNITS_WORKPATH."/".$_FILES[$felename]["name"];
		require_once("Archive/Zip.php");
		$objZip = new Archive_Zip($zipfilepath);
		//workディレクトリに展開し、path,セッティングファイルがあるか確認
		$tmp_path = str_replace(".zip","",$zipfilepath);
		$p_params = array ('add_path' => EXT_UNITS_WORKPATH);
		if(!$objZip->extract($p_params)) {
			@unlink($zipfilepath);
			return "・zipファイルの解凍に失敗しました";
		}
		//moduleCnf.incの確認
		if(!is_file($tmp_path."/extunitCnf.inc")) {
			@unlink($zipfilepath);
			commonFile::AlldelDir($tmp_path);
			return "・拡張ユニット設定ファイル(extunitCnf.inc)がありません。zipファイルの内容を確認してください";
		}
		require_once($tmp_path."/extunitCnf.inc");
		/*例
$TYPE=4;
$NAME="画像ボタンユニット"; //ユニット名称
$VERSION="1.0";   //バージョン
$PATH="bxtImgBtn"; //ディレクトリ名
$CACHE = 1;	//キャッシュ機能対応　0:未対応（常に動的） 1:対応(書き出し機能可能)
		*/
		if($TYPE==""||$NAME==""||$VERSION==""||$PATH==""||($CACHE!=0&&$CACHE!=1)) {
			@unlink($zipfilepath);
			commonFile::AlldelDir($tmp_path);
			return "・拡張ユニット設定ファイル(extunitCnf.inc)の内容が正しくありません。zipファイルの内容を確認してください";
		}
		if($TYPE!=4&&$TYPE!=5) {
			@unlink($zipfilepath);
			commonFile::AlldelDir($tmp_path);
			return "・拡張ユニット用のzipファイルではありません。";
		}
		//インストール先のパス
		$inst_extunit_path = EXT_UNITS_PATH."/".$PATH;
		//同じpathがいないかチェック
		if(is_dir($inst_extunit_path)){
			@unlink($zipfilepath);
			commonFile::AlldelDir($tmp_path);
			return "・既にインストールされています";
		}
		//extunitCnf.incの読み込みから$installunitを取得する
		if(is_array($installunit)&&count($installunit)>0) {
			@unlink($zipfilepath);
			commonFile::AlldelDir($tmp_path);
			return "・拡張ユニットのマスタ情報がありません。";
		}
		$unitrecord = array("unit_code" => $this->db->getKey("tbl_unit_unit_code"),
									"unit_type" => $TYPE,
									"unit_name" => $NAME,
									"unit_tpl_path" => $PATH.".tpl",
									"unit_php_path" => $PATH.".php",
									"unit_order" => $this->getOdrMax(),
									"unit_cache" => $CACHE,
									"unit_extmodule_code" => "-1",
									"unit_cdate" => "now()",
									"unit_ver" => $VERSION
									);
		$this->db->query('BEGIN');
		if(!$this->db->insert("tbl_unit",$unitrecord)) {
			$this->db->query('ROLLBACK');
			@unlink($zipfilepath);
			commonFile::AlldelDir($tmp_path);
			return "・拡張ユニットの保存に失敗しました";
		}
		//インストール先に解凍
		$p_params = array ('add_path' => EXT_UNITS_PATH);
		$result = $objZip->extract($p_params);
		//util/install.phpの読み込み
		if(!file_exists($inst_extunit_path."/util/install.php")) {
			$this->db->query('ROLLBACK');
			@unlink($zipfilepath);
			commonFile::AlldelDir($tmp_path);
			commonFile::AlldelDir($inst_extunit_path);
			return "・取り込んだ拡張ユニットのインストール実行ファイルが見つかりません。";
		}
		//util/install.phpの実行
		//拡張ユニットが持つテーブル生成を行う
		require_once($inst_extunit_path."/util/install.php");
		if(!function_exists("extunit_install")) {
			$this->db->query('ROLLBACK');
			@unlink($zipfilepath);
			commonFile::AlldelDir($tmp_path);
			commonFile::AlldelDir($inst_extunit_path);
			return "・取り込んだ拡張ユニットのインストール実行関数が見つかりません。";
		}
		if(!extunit_install($param=$unitrecord, &$this->db)) {
			$this->db->query('ROLLBACK');
			@unlink($zipfilepath);
			commonFile::AlldelDir($tmp_path);
			commonFile::AlldelDir($inst_extunit_path);
			return "・取り込んだ拡張ユニットのテーブル生成に失敗しました。";
		}
		//すべてが正常に処理できたらコミット
		$this->db->query('COMMIT');	
		@unlink($zipfilepath);
		commonFile::AlldelDir($tmp_path);
		
		//ユニットCSSの書き出し
		require_once (LIB_PATH.'/common/pageunitDB.php');
		$pageunitDB = new pageunitDB();
		$pageunitDB->putAllUnitsCSS($pageunitDB->makeAllUnitsCSS());

		return "・新しい拡張ユニットをインストールしました。";
	}
}
?>
