"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); } ?>