"tmx",
HTML_DOC_TYPE_TSV => "tsv",
HTML_DOC_TYPE_XLF => "xlf",
);
$G_HTML_DOC_TYPE_ONELINE_TABLE = array(
HTML_DOC_TYPE_TXT => "txt",
HTML_DOC_TYPE_HTML => "html",
HTML_DOC_TYPE_DOCX => "docx",
HTML_DOC_TYPE_XLSX => "xlsx",
HTML_DOC_TYPE_PPTX => "pptx",
HTML_DOC_TYPE_PDF => "pdf",
);
$G_HTML_DOC_TYPE_TABLE = array_merge($G_HTML_DOC_TYPE_ONELINE_TABLE, $G_HTML_DOC_TYPE_TWOLINE_TABLE);
define("MODE_NEW", 0);
define("MODE_EDIT", 1);
define("MODE_COPY", 2);
$G_MODE_TABLE = array(
MODE_NEW,
MODE_EDIT,
MODE_COPY,
);
//----------------------------
// variable
//----------------------------
// word key
$wk = "WORD_P_CONTENT_DOCUMENT_EDIT";
// result
$result = RES_OK;
// data
$tmx = "";
$mode = MODE_EDIT;
$isPostRetry = FALSE;
$arrTabRight = array();
// html
$arrHtml = array(
"menu" => "",
"result" => "",
"form" => "",
);
//----------------------------
// request parameter
//----------------------------
$qProjectID = isset($_SESSION["project_id"]) ? $_SESSION["project_id"] : REQ_NON;
$qToken = isset($_REQUEST["q_token"]) ? $_REQUEST["q_token"] : REQ_NON;
$qID = isset($_REQUEST["q_id"]) ? $_REQUEST["q_id"] : REQ_NON;
$qTitle = isset($_REQUEST["q_title"]) ? $_REQUEST["q_title"] : REQ_NON;
$qLangS = isset($_REQUEST["q_lang_s"]) ? $_REQUEST["q_lang_s"] : REQ_NON;
$qLangT = isset($_REQUEST["q_lang_t"]) ? $_REQUEST["q_lang_t"] : REQ_NON;
$qType = isset($_REQUEST["q_type"]) ? $_REQUEST["q_type"] : REQ_NON;
$qComment = isset($_REQUEST["q_comment"]) ? $_REQUEST["q_comment"] : REQ_NON;
$qCopyID = isset($_REQUEST["q_copy_id"]) ? $_REQUEST["q_copy_id"] : REQ_NON;
$qFileTmpName = isset($_FILES["q_file"]["tmp_name"]) ? $_FILES["q_file"]["tmp_name"] : REQ_NON;
$qFileError = isset($_FILES["q_file"]["error"]) ? $_FILES["q_file"]["error"] : REQ_NON;
$qFileSize = isset($_FILES["q_file"]["size"]) ? $_FILES["q_file"]["size"] : REQ_NON;
//----------------------------
// judge post
//----------------------------
$isPost = ($qToken !== REQ_NON);
//----------------------------
// set types
//----------------------------
Util::setType($qProjectID, "int");
Util::setType($qToken, "string");
Util::setType($qID, "int");
Util::setType($qTitle, "string");
Util::setType($qLangS, "string");
Util::setType($qLangT, "string");
Util::setType($qType, "string");
Util::setType($qComment, "string");
Util::setType($qCopyID, "int");
Util::setType($qFileTmpName, "string");
Util::setType($qFileError, "int");
Util::setType($qFileSize, "int");
//----------------------------
// Auth-Before validate
//----------------------------
if ( $result === RES_OK ){
if ( $isPost ){
if ( ! Validate::isToken($qToken, "q_token") ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 1)}");
}
if ( ! Validate::isNumeric($qID) ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 2)}");
}
} else {
if ( ! Validate::isNumeric($qID) ){
$qID = INIT_ID;
}
}
}
if ( $result === RES_OK ){
if ( Validate::isNumeric($qCopyID) ){
$mode = MODE_COPY;
$qID = INIT_ID;
} else if ( $qID === INIT_ID ){
$mode = MODE_NEW;
} else {
$mode = MODE_EDIT;
}
}
//----------------------------
// Auth
//----------------------------
if ( $result === RES_OK ){
$auth = Auth::instance("document");
if( ! $auth->write($qID, $qProjectID) ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 3)}");
}
// コピー元が読み込み可能か確認する
if ( $mode === MODE_COPY && ! $auth->read($qCopyID, NULL) ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 4)}");
}
}
//----------------------------
// Auth-After validate
//----------------------------
if ( $result === RES_OK ){
if ( $isPost ){
if ( ! Validate::isString($qTitle) ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 5)}");
}
if ( ! Validate::isLang($qLangS) ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 6)}");
}
if ( ! Validate::isLang($qLangT) ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 7)}");
}
if ( $mode === MODE_COPY ){
// コピーする時は初期値を入れておく
$qType = HTML_DOC_TYPE_TXT;
$qFileSize =0;
} else {
if ( ! Validate::inKeyArray($qType, $G_HTML_DOC_TYPE_TABLE) ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 8)}");
}
if ( $qFileSize > 0 ){
if ( $result === RES_OK ){
if ( $qFileError !== UPLOAD_ERR_OK ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 9)} (Code:{$qFileError})");
}
}
// ファイル確認
if ( $result === RES_OK ){
if ( ! file_exists($qFileTmpName) ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 10)}");
}
}
}
}
}
}
//----------------------------
// function
//----------------------------
//----------------------------
// process
//----------------------------
if ( $result === RES_OK ){
DAO::begin();
$objDAODocument = DAO::instance("document");
$objViewDocument = View::instance("document");
$objDAOProjectLang = DAO::instance("project_lang");
$objDocTmx = new DocTmx();
// 更新 --------------------
if ( $isPost ){
// TMXファイル取得
if ( $result === RES_OK ){
// ファイルが指定されている場合
if ( $qFileSize > 0 ){
$file = Setting::get("PATH_DATA_TMP") . "/" . User::get("id") . "." . $qType;
if ( $qType === HTML_DOC_TYPE_TXT ){
// UTF-8以外の文字コードのファイルでもコンバートさせ、登録させる
if ( $result === RES_OK ){
if ( ($fp = fopen($qFileTmpName, "r")) === FALSE ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 11)}");
}
}
if ( $result === RES_OK ){
$arrLine = array();
while ( ($line = fgets($fp)) !== FALSE ){
// UTF-8エンコード
$line = mb_convert_encoding($line, "UTF-8", "UTF-8,EUC-JP,SJIS,JIS,ASCII");
// 文字コードチェック
if ( strcmp(mb_detect_encoding($line, "UTF-8,EUC-JP,SJIS,JIS,ASCII"), "UTF-8") !== 0 ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 12)}");
break;
}
$arrLine[] = $line;
}
fclose($fp);
}
if ( $result === RES_OK ){
if ( file_put_contents($file, $arrLine) === FALSE ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 13)}");
}
}
} else {
if ( $result === RES_OK ){
if ( move_uploaded_file($qFileTmpName, $file) === FALSE ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 14)}");
}
}
}
if ( $result === RES_OK ){
if ( $qType === HTML_DOC_TYPE_TMX ){
if ( ($tmx = Util::file_get_contents($file)) === FALSE ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 15)}");
} else {
$objDocTmx->load($tmx);
if ( $objDocTmx->validate($arrError) === FALSE ){
$result = RES_NG;
foreach ( $arrError as $error ){
$gResult->push($error);
}
}
}
} else {
if ( ($tmx = ToolDocConverter::convertTMX($file, $qType, $qLangS, $qLangT, HTML_DOC_TYPE_TMX)) === FALSE ){
$result = RES_NG;
$gResult->push("{$WORD($wk, 16)}");
}
}
}
if ( file_exists($file) ){
unlink($file);
}
} else {
$tmx = NULL;
}
}
// TMXの更新
if ( $result === RES_OK ){
if ( is_null($tmx) ){
switch ( $mode ){
case MODE_EDIT:
$resDAODocument = $objDAODocument->get($qID, array_keys(DAO::T_DOCUMENT_STATE_VALID_TABLE()));
if ( ($result = $resDAODocument["result"]) === RES_OK ){
$tmx = $resDAODocument["data"][0]["t_document_text"];
}
break;
case MODE_COPY:
$resDAODocument = $objDAODocument->get($qCopyID, array_keys(DAO::T_DOCUMENT_STATE_VALID_TABLE()));
if ( ($result = $resDAODocument["result"]) === RES_OK ){
$tmx = $resDAODocument["data"][0]["t_document_text"];
}
break;
}
}
if ( ! is_null($tmx) && strlen($tmx) > 0){
$objDocTmx->load($tmx);
$arrSentence = $objDocTmx->getSentence(TRUE);
foreach ( $arrSentence as &$sentence ){
$sentence["source_lang"] = $qLangS;
$sentence["target_lang"] = $qLangT;
}
unset($sentence);
if ( Validate::inKeyArray($qType, $G_HTML_DOC_TYPE_ONELINE_TABLE) ){
// などのタグを削除する
foreach ( $arrSentence as &$sentence ){
$sText = $sentence["source_text"];
//$sText = preg_replace('/(.*?)<\/bpt>(.*?)(.*?)<\/ept>/', "\\3", $sText);
$sText = preg_replace('/(.*?)<\/bpt>/', "", $sText);
$sText = preg_replace('/(.*?)<\/ept>/', "", $sText);
$sText = preg_replace("/]*>(.*?)<\/ph>/", "", $sText);
$sText = preg_replace("/<(\/)?it[^>]*>/", "", $sText);
$sText = preg_replace("/<(\/)?w:r[^>]*>/", "", $sText);
$sText = preg_replace("/<(\/)?w:t>/", "", $sText);
$sText = preg_replace("/<(\/)?w:([^>]+)(\/)?>/", "", $sText);
$sentence["source_text"] = $sText;
}
unset($sentence);
}
$objDocTmx->setSentence($arrSentence);
$objDocTmx->setHeaderPropValue("source_lang", $qLangS, FALSE);
$objDocTmx->setHeaderPropValue("target_lang", $qLangT, FALSE);
$objDocTmx->setHeaderPropValue("comment", $qComment, TRUE);
$objDocTmx->setHeaderPropValue("date", date("Y/m/d H:i:s"), FALSE);
$objDocTmx->setQreditHeaderAttr("source_language", $qLangS);
$objDocTmx->setQreditHeaderAttr("target_language", $qLangT);
$objDocTmx->setQreditHeaderAttr("original_format", "plain_text");
$objDocTmx->removeLineNumber();
$tmx = $objDocTmx->saveXML();
}
}
// 更新 --------------------
if ( $result === RES_OK ){
$resDAODocument = $objDAODocument->register($qID, NULL, $qLangS, $qLangT, $qTitle, $tmx, $qComment, $qProjectID, User::get("id"));
$result = $resDAODocument["result"];
if ( $result === RES_OK ){
switch ( $mode ){
case MODE_NEW:
$gResult->push("{$WORD($wk, 17)}");
break;
case MODE_EDIT:
$gResult->push("{$WORD($wk, 18)}");
break;
case MODE_COPY:
$gResult->push("{$WORD($wk, 19)}");
break;
}
} else {
if ( isset($resDAODocument["error"]) && $resDAODocument["error"] === DAO_Document::ERROR_TITLE_DUPLICATE ){
$isPostRetry = TRUE;
$gResult->push("{$WORD($wk, 20)}");
} else {
$gResult->push("{$WORD($wk, 21)}");
}
}
}
} else {
if ( $result === RES_OK ){
switch ( $mode ){
// 新規登録 --------------------
case MODE_NEW:
$qTitle = $objDAODocument->getInit("t_document_title");
$qLangS = $objDAODocument->getInit("t_document_lang_s");
$qLangT = $objDAODocument->getInit("t_document_lang_t");
$qComment = $objDAODocument->getInit("t_document_comment");
// 言語はプロジェクトから取得する
$resDAOProjectLang = $objDAOProjectLang->get($qProjectID, NULL, 1);
if ( $resDAOProjectLang["result"] === RES_OK ){
$qLangS = $resDAOProjectLang["data"][0]["t_project_lang_s"];
$qLangT = $resDAOProjectLang["data"][0]["t_project_lang_t"];
}
break;
// 編集 --------------------
case MODE_EDIT:
$objDAODocument->setAuth($auth);
$resDAODocument = $objDAODocument->get($qID, array_keys(DAO::T_DOCUMENT_STATE_VALID_TABLE()));
$result = $resDAODocument["result"];
if ( $result === RES_OK ){
$dataDocument = $resDAODocument["data"][0];
$qTitle = $dataDocument["t_document_title"];
$qLangS = $dataDocument["t_document_lang_s"];
$qLangT = $dataDocument["t_document_lang_t"];
$qComment = $dataDocument["t_document_comment"];
$arrTabRight[] = $objViewDocument->title($dataDocument);
} else {
$result = RES_NG;
$gResult->push("{$WORD($wk, 22)}");
}
break;
// コピー --------------------
case MODE_COPY:
$objDAODocument->setAuth($auth);
$resDAODocument = $objDAODocument->get($qCopyID, array_keys(DAO::T_DOCUMENT_STATE_VALID_TABLE()));
$result = $resDAODocument["result"];
if ( $result === RES_OK ){
$dataDocument = $resDAODocument["data"][0];
$qTitle = $dataDocument["t_document_title"];
$qLangS = $dataDocument["t_document_lang_s"];
$qLangT = $dataDocument["t_document_lang_t"];
$qComment = $dataDocument["t_document_comment"];
} else {
$result = RES_NG;
$gResult->push("{$WORD($wk, 23)}");
}
break;
}
}
}
DAO::end($result);
}
//----------------------------
// data
//----------------------------
//----------------------------
// html
//----------------------------
{
if ( $isPost && $result !== RES_OK && $isPostRetry ){
$isPost = FALSE;
$result = RES_OK;
}
// menu ----------------------------------------------------------------
if ( $result !== RES_NG ){
$arrMenu = array();
//-----
$arrMenu[0] = $objViewDocument->tab(View_document::TAB_LIST, $auth, $qProjectID);
switch ( $mode ){
case MODE_NEW:
case MODE_COPY:
$arrMenu[1] = $objViewDocument->tab(View_document::TAB_NEW, $auth, $qProjectID);
break;
case MODE_EDIT:
$arrMenu[2] = $objViewDocument->tab(View_document::TAB_DETAIL, $auth, $qProjectID, $qID);
$arrMenu[3] = $objViewDocument->tab(View_document::TAB_WORKFLOW, $auth, $qProjectID, $qID);
$arrMenu[1] = $objViewDocument->tab(View_document::TAB_EDIT, $auth, $qProjectID, $qID);
break;
}
//-----
$arrHtml["menu"] = Printer::menuTab($arrMenu, 1, $arrTabRight);
}
// title ---------------------------------------------------------------
switch ( $mode ){
case MODE_NEW:
case MODE_COPY:
$title = "{$WORD($wk, 24)}";
break;
case MODE_EDIT:
$title = "{$WORD($wk, 25)}";
break;
}
// form ----------------------------------------------------------------
if ( $result === RES_OK ){
if ( $isPost ){
// アクション(OK)
$arrHtml["form"] = Printer::link("{$WORD($wk, 26)}", "btn btn-default", NULL, NULL, "./");
header("Location: ./");
} else {
$arrControl = array();
$arrAction = array();
// フォーム(タイトル)
$arrControl[] = array(
"id" => "q_title",
"name" => "{$WORD($wk, 27)}",
"form" => array(
Printer::input("text", "q_title", "q_title", $qTitle, NULL, array("placeholder" => "{$WORD($wk, 28)}")),
),
"validate" => array(
"required" => TRUE,
"remote" => array( // Ajax
"type" => "post",
"url" => "/app/checkNameController.php",
"data" => array(
"q_kind" => APP_CHECK_NAME_CONTROLLER_KIND_DOCUMENT,
"q_id" => $qID,
// "q_title" は自動で入る
),
),
),
"required" => TRUE,
);
// フォーム(言語)
$arrControl[] = array(
"id" => "q_lang_s",
"name" => "{$WORD($wk, 29)}",
"form" => array(
Printer::select("q_lang_s", "q_lang_s", $G_LANG_TABLE, $qLangS),
Printer::icon("icon-arrow-right"),
Printer::select("q_lang_t", "q_lang_t", $G_LANG_TABLE, $qLangT),
),
);
if ( $mode !== MODE_COPY ){
// フォーム(ファイル)
$arrControl[] = array(
"id" => "q_file",
"name" => "{$WORD($wk, 30)}",
"form" => Printer::input("file", "q_file", "q_file"),
"validate" => array(
"required" => ($mode === MODE_NEW) ? TRUE : FALSE,
),
"required" => ($mode === MODE_NEW) ? TRUE : FALSE,
);
// フォーム(ファイルタイプ)
$arrFileType = array();
foreach ( $G_HTML_DOC_TYPE_ONELINE_TABLE as $key => $value ){
$arrFileType[$key] = Printer::popover($value, NULL, "{$WORD($wk, 31)}");
//$arrFileType[$key] = Util::esc($value);
}
foreach ( $G_HTML_DOC_TYPE_TWOLINE_TABLE as $key => $value ){
$arrFileType[$key] = Printer::popover($value, NULL, "{$WORD($wk, 32)}", array("style" => "font-weight: bold"));
//$arrFileType[$key] = "".Util::esc($value)."";
}
$arrControl[] = array(
"id" => "q_type",
"name" => "{$WORD($wk, 33)}",
"form" => Printer::radio("q_type", "q_type", $arrFileType, HTML_DOC_TYPE_TXT, NULL, TRUE, FALSE),
"validate" => array(
"required" => ($mode === MODE_NEW) ? TRUE : FALSE,
),
"required" => ($mode === MODE_NEW) ? TRUE : FALSE,
);
}
// フォーム(コメント)
$arrControl[] = array(
"id" => "q_comment",
"name" => "{$WORD($wk, 34)}",
"form" => Printer::textarea("q_comment", "q_comment", $qComment),
"fullsize" => TRUE,
);
// フォーム(id)
$arrControl[] = array(
"id" => NULL,
"name" => NULL,
"form" => Printer::input("hidden", "q_id", "q_id", $qID),
);
if ( $mode === MODE_COPY ){
// フォーム(copy_id)
$arrControl[] = array(
"id" => NULL,
"name" => NULL,
"form" => Printer::input("hidden", "q_copy_id", "q_copy_id", $qCopyID),
);
}
// フォーム(token)
$arrControl[] = array(
"id" => NULL,
"name" => NULL,
"form" => Printer::input("hidden", "q_token", "q_token", Util::token()),
);
// アクション(OK)
$arrAction[] = Printer::input("submit", NULL, NULL, "OK", "btn btn-primary");
// アクション(キャンセル)
$arrAction[] = Printer::link("Cancel", "btn btn-default", NULL, NULL, "./");
$arrHtml["form"] = Printer::form("form_user", "form_user", "./edit.html", "post", $arrControl, $arrAction, array("enctype" => "multipart/form-data"));
}
} else {
// アクション(OK)
$arrHtml["form"] = Printer::link("OK", "btn btn-default", NULL, NULL, "./");
}
// result --------------------------------------------------------------
$arrHtml["result"] = $gResult->string(TRUE, $result);
}
?>