wordsonline_connector-1.0.x-dev/src/Controller/OrderController.php
src/Controller/OrderController.php
<?php
namespace Drupal\wordsonline_connector\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Drupal\wordsonline_connector\WordsOnlineConst;
use Drupal\tmgmt\Entity\Job;
use Drupal\tmgmt\JobInterface;
use Drupal\wordsonline_connector\Entity\WOFile;
use Drupal\wordsonline_connector\Common\ZipHandle;
use Drupal\wordsonline_connector\WordsOnlineState;
use Drupal\wordsonline_connector\WordsOnlineStatus;
use Symfony\Component\DependencyInjection\ContainerInterface;
use GuzzleHttp\ClientInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Messenger\Messenger;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Archiver\ArchiverManager;
use Drupal\Core\File\FileSystemInterface;
use Drupal\tmgmt_file\Format\FormatManager;
use Drupal\Core\Entity\Query\QueryInterface;
use Drupal\wordsonline_connector\Plugin\tmgmt\Translator\WordsOnlineTranslator;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Drupal\Core\Extension\ModuleExtensionList;
use Drupal\Core\Url;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\tmgmt\Entity\JobItem;
use Drupal\wordsonline_connector\WordsOnlineConnectorManager;
/**
* Controller for handle order.
*/
class OrderController extends ControllerBase {
use StringTranslationTrait;
/**
* Guzzle HTTP client.
*
* @var \GuzzleHttp\ClientInterface
*/
protected $client;
/**
* Database.
*
* @var \Drupal\Core\Database\Connection
*/
protected $database;
/**
* ModuleExtensionList.
*
* @var Drupal\Core\Extension\ModuleExtensionList
*/
protected $moduleExtensionList;
/**
* Messenger.
*
* @var \Drupal\Core\Messenger\Messenger
*/
protected $messenger;
/**
* Archiver.
*
* @var Drupal\Core\Archiver\ArchiverManager
*/
protected $archiver;
/**
* The file system service.
*
* @var \Drupal\Core\File\FileSystemInterface
*/
protected $fileSystem;
/**
* The file format manager.
*
* @var \Drupal\tmgmt_file\Format\FormatManager
*/
protected $formatManager;
/**
* WordsOnline Connector Manager.
*
* @var \Drupal\wordsonline_connector\WordsOnlineConnectorManager
*/
protected $wo_manager;
/**
* Constructor.
*
* @param \GuzzleHttp\ClientInterface $client
* Http client.
* @param \Drupal\Core\Database\Connection $database
* Database connection.
* @param \Drupal\Core\Messenger\Messenger $messenger
* Messenger.
* @param \Drupal\Core\Archiver\ArchiverManager $archiver
* Archiver manager.
* @param \Drupal\Core\File\FileSystemInterface $fileSystem
* File System.
* @param \Drupal\tmgmt_file\Format\FormatManager $formatManager
* The file format manager.
* @param \Drupal\Core\Extension\ModuleExtensionList
* The list module extension list.
*/
public function __construct(ClientInterface $client, Connection $database, Messenger $messenger, ArchiverManager $archiver, FileSystemInterface $fileSystem, FormatManager $formatManager, ModuleExtensionList $moduleExtensionList, WordsOnlineConnectorManager $wo_manager) {
$this->client = $client;
$this->database = $database;
$this->messenger = $messenger;
$this->archiver = $archiver;
$this->fileSystem = $fileSystem;
$this->formatManager = $formatManager;
$this->moduleExtensionList = $moduleExtensionList;
$this->wo_manager = $wo_manager;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
$client = $container->get('http_client');
$database = $container->get('database');
$messenger = $container->get('messenger');
$archiver = $container->get('plugin.manager.archiver');
$fileSystem = $container->get('file_system');
$manager = $container->get('plugin.manager.tmgmt_file.format');
$moduleExtensionList = $container->get('extension.list.module');
$wo_manager = $container->get('plugin.manager.tmgmt.wordsonline');
return new static(
$client,
$database,
$messenger,
$archiver,
$fileSystem,
$manager,
$moduleExtensionList,
$wo_manager
);
}
/**
* Open confirm form.
*
* @param Symfony\Component\HttpFoundation\Request $request
* The request from client.
*/
public function openMyModal(Request $request) {
$request_guid = $request->query->get("request_guid");
$job_id = $request->query->get("job_id");
$allowSubmmit = "true";
if ($request->query->get("allowSubmmit")) {
$allowSubmmit = $request->query->get("allowSubmmit");
}
$modal_form = $this->formBuilder()->getForm(
'\Drupal\wordsonline_connector\Form\OrderConfirmForm',
$allowSubmmit,
$job_id,
$request_guid
);
$render["form"] = $modal_form;
return $render;
}
/**
* Check quote status.
*
* @param Symfony\Component\HttpFoundation\Request $request
* The request from client.
*
* @return Symfony\Component\HttpFoundation\JsonResponse
* A json response.
*/
public function checkQuoted(Request $request) {
$has_change = FALSE;
$key = NULL;
if ($request->query->get("key")) {
$key = $request->query->get("key");
}
$top = "10";
$skip = 0;
if ($request->query->get("page")) {
$skip = $request->query->get("page");
}
if ($request->query->get("top")) {
$top = $request->query->get("top");
}
$list = $this->getDataList($key, $skip, $top);
if ($list != NULL) {
$data = $list->list;
$count = $list->count;
if ($count > 0) {
$has_change = $this->wo_manager->isChangeQuoteStatus($data);
}
}
return new JsonResponse(
[
"status" => "success",
"changed" => $has_change
]
);
}
/**
* Get WordsOnline job by job id.
*
* @param int $job_id
* Job id.
*/
public function getWordsOnlineConnectorJobRecordByJobId($job_id){
$f_ret = $this->database
->query(WordsOnlineConst::GET_WORDSONLINE_JOB_BY_JOB_ID_QUERY,
[
':job_id' => $job_id
]
)
->fetchAssoc();
return $f_ret;
}
/**
* Display list wordsonline job.
*
* @param Symfony\Component\HttpFoundation\Request $request
* The request from client.
*/
public function jobList(Request $request) {
$key = NULL;
if ($request->query->get("key")) {
$key = $request->query->get("key");
}
$top = "10";
$skip = 0;
if ($request->query->get("page")) {
$skip = $request->query->get("page");
}
if ($request->query->get("top")) {
$top = $request->query->get("top");
}
$job_filter_id = "0";
if ($request->query->get("job_id")) {
$job_filter_id = $request->query->get("job_id");
}
$header = [
"id" => $this->t("Id"),
"label" => $this->t("Label"),
"project_name" => $this->t("Project Name"),
"request_id" => $this->t("Request Id"),
"request_name" => $this->t("Request Name"),
"lang_name" => $this->t("Language"),
"due_date" => $this->t("Due Date"),
"status" => $this->t("Status"),
"opt" => $this->t("Operations"),
];
$refresh_link = base_path().'admin/tmgmt/wordsonline/jobs?top='.$top ."&page=".$skip ;
if($key != NULL){
$refresh_link = $refresh_link ."&key=".$key;
}
if($job_filter_id != "0"){
$refresh_link = $refresh_link ."&job_id=".$job_filter_id;
}
$form['grant_type'] = [
'#type' => 'hidden',
'#default_value' => $refresh_link,
'#value' => $refresh_link,
"#attributes" => [
"id" => "wo_request_url",
],
];
$form["#prefix"] =
"<div> <a id='btnRefresh' href='#'
class='wol-btn btn-layout'>Refresh Page</a>
</div> <div id='wol-loader'></div>";
$token = $this->wo_manager->getToken();
$list = $this->getDataList($key, $skip, $top, $job_filter_id, $token);
$rows = [];
$count = 0;
$pageCount = 0;
if ($list != NULL) {
$data = $list->list;
$count = $list->count;
$numOfPage = is_numeric($top) ? (int) $top : 10;
if ($count % $numOfPage > 0) {
$pageCount = $count / $numOfPage + 1;
}
else {
$pageCount = $count / $numOfPage;
}
$configs = $this->getConfig();
$prj_guid ='';
if ($configs != NULL) {
$prj_guid = $configs["project_key"];
}
$results = $this->database
->query(WordsOnlineConst::ALL_JOB_QUERY)
->fetchAll();
foreach ($data as $row) {
$job_id = "";
$operation = "";
$due_date = "";
$label = "";
$status = WordsOnlineConst::NOT_AVAILABLE;
$sourceLink = "";
foreach ($results as $res) {
if ($res->request_guid == $row->requestGuid) {
$job_id = $res->job_id;
$job = Job::load($job_id);
if ($job) {
$label = html_entity_decode($job->label());
$status = $row->status;
$due_date = $job->getSetting("due_date");
$state = $job->getState();
$jobItems = array_values($job->getItems());
$sourceLink = $this->getSourceLink($jobItems);
if ($row->status == WordsOnlineStatus::IMPORTED_STATUS && $res->status == WordsOnlineConst::JOB_DELIVERED) {
$this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_IMPORTED);
$res->status = WordsOnlineConst::JOB_IMPORTED;
}
if ($state == WordsOnlineConst::STATE_FINISHED) {
if ($row->status != WordsOnlineStatus::FINISHED_STATUS) {
$this->wo_manager->requestAction($token, $row->requestGuid, WordsOnlineStatus::FINISHED_STATUS);
$status = WordsOnlineStatus::FINISHED_STATUS;
}
$download_link = $this->getDownloadLink($job_id,$row->requestGuid);
$view_job_link = $this->getViewJobLink($jobItems,$job_id);
$operation = $this->t( $view_job_link . $download_link . $sourceLink );
$this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_FINISHED);
break;
}
//hotfix old bug
if ($state != WordsOnlineConst::STATE_FINISHED && $row->status == WordsOnlineStatus::FINISHED_STATUS) {
$this->wo_manager->requestAction($token, $row->requestGuid, WordsOnlineStatus::IMPORTED_STATUS);
$status = WordsOnlineStatus::IMPORTED_STATUS;
$edit = $this->getReviewLink($jobItems, $job_id);
$operation =$this->t( $this->getViewXlfLink($job_id,$res->request_guid,'Reimport',$edit) . $sourceLink);
$this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::IMPORTED_STATUS);
break;
}
//end hotfix
if ($row->state == WordsOnlineState::AUTOMATION_FAILED) {
$this->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_AUTOMATION_FAILED);
$status = WordsOnlineConst::JOB_AUTOMATION_FAILED;
break;
}
if ($row->status == WordsOnlineStatus::IN_PROGRESS_STATUS) {
$operation =$this->t( $this->getConfirmLink($job_id, $res->request_guid,"&allowSubmmit=false") . $sourceLink);
$this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_QUOTED);
break;
}
if ($row->state == WordsOnlineState::QUOTE_SUBMITTED
&& ($row->status == WordsOnlineStatus::UNPAID
|| $row->status == WordsOnlineStatus::QUOTE_SUBMITTED)
) {
$operation =$this->t( $this->getConfirmLink($job_id, $res->request_guid) . $sourceLink);
$this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_QUOTED);
break;
}
if ($row->state == WordsOnlineState::PAYMENT_FAILED
&& ($row->status == WordsOnlineStatus::UNPAID
|| $row->status == WordsOnlineStatus::QUOTE_SUBMITTED)
) {
$operation =$this->t( $this->getConfirmLink($job_id, $res->request_guid) . $sourceLink);
break;
}
if ($res->status == WordsOnlineConst::JOB_IMPORTED) {
if ($row->status != WordsOnlineStatus::IMPORTED_STATUS) {
$this->wo_manager->requestAction($auth, $row->requestGuid, WordsOnlineStatus::IMPORTED_STATUS);
$status = WordsOnlineStatus::IMPORTED_STATUS;
}
$edit = $this->getReviewLink($jobItems, $job_id);
$operation =$this->t( $this->getViewXlfLink($job_id,$res->request_guid,'Reimport',$edit) . $sourceLink);
break;
}
if ($row->status == WordsOnlineStatus::DELIVERED
|| $row->status == WordsOnlineStatus::IMPORT_FAIL_STATUS
|| $row->status == WordsOnlineStatus::IMPORT_FAILED_STATUS
) {
if ($res->status != WordsOnlineConst::JOB_DELIVERED) {
$this->wo_manager->updateWordsOnlineJobStatus($job_id, WordsOnlineConst::JOB_DELIVERED);
}
$link_text = "Import";
if ($row->status == WordsOnlineStatus::IMPORT_FAIL_STATUS
|| $row->status == WordsOnlineStatus::IMPORT_FAILED_STATUS) {
$link_text = "Reimport";
}
$operation =$this->t( $this->getViewXlfLink($job_id,$res->request_guid,$link_text) . $sourceLink);
}
break;
}
}
}
$rows[] = [
"id" => $job_id,
"label" => $label,
"project_name" => $row->projectId,
"request_id" => $row->requestId,
"request_name" => $row->requestName,
"lang_name" =>
$row->sourceLanguageName . " > " . $row->targetLanguageName,
"due_date" => $due_date,
"status" => $status,
"opt" => $operation,
];
}
}
$form["searh_prefix"] = [
"#markup" => '<div class="wol-search-field">',
];
$form["searh_data"] = [
"#type" => "textfield",
"#name" => "job_data",
"#value" => $key,
"#placeholder" => $this->t(WordsOnlineConst::SEARCH_PLACEHOLDER),
];
$form["actions"] = [
"#type" => "button",
"#value" => $this->t("Search"),
"#name" => "job-search",
"#attributes" => [
"class" => ["btn", "btn-layout", "ml-3", "wol-btn"],
"onclick" => "searchJob()",
],
];
$pageLimits = [];
$pageLimits["10"] = "10";
$pageLimits["15"] = "15";
$pageLimits["20"] = "20";
$pageLimits["25"] = "25";
$form["page_limit"] = [
"#type" => "select",
"#required" => TRUE,
"#name" => "job_page",
"#default_value" => $top,
"#options" => $pageLimits,
"#attributes" => ["onchange" => "changePageLimit()"],
'#value' => $top,
];
$job_filters=[];
$job_ids = $this->database
->query(
WordsOnlineConst::ALL_JOB_FOR_FILTER_QUERY,
[
':prj_guid' => $prj_guid
]
)
->fetchAll();
$job_filters["0"] = $this->t("Select Job");
foreach($job_ids as $tjid){
$val ="Job (" . $tjid->tjid . ")";
$job_filters[(string)$tjid->tjid] = $val;
}
$form["job_filter"] = [
"#type" => "select",
"#name" => "job_filter",
"#default_value" => $job_filter_id,
"#options" => $job_filters,
"#attributes" => ["onchange" => "changePageLimit()"],
'#value' =>$job_filter_id,
];
$form["searh_surfix"] = [
"#markup" => "</div>",
];
$form["table"] = [
"#type" => "table",
"#header" => $header,
"#rows" => $rows,
"#empty" => $this->t("No records found"),
"#attributes" => ["class" => ["wol-table"]],
];
$form["pager"] = [
"#type" => "pager",
];
$pagging = $this->generatePagingHtml($pageCount, $skip);
$form["info_prefix"] = [
"#markup" => $pagging,
];
$form["#attached"]["library"][] = "wordsonline_connector/wordsonline_job";
return $form;
}
/**
* Generate paging html
*/
public function generatePagingHtml($pageCount, $skip){
$pagging = "<div class='pagination'>";
if ($pageCount > 0) {
$pagging = $pagging . "<a href='#' class='wo-page' data-page='1'>«</a>";
if ($skip == "" || $skip == NULL) {
$skip = 1;
}
for ($i = 1; $i <= $pageCount; $i++) {
$active = "";
if ($i == $skip) {
$active = "active";
}
$pagging =
$pagging .
"<a class='$active wo-page' href='#' data-page='$i'>" .
$i .
"</a>";
}
$pagging =
$pagging .
"<a href='#' class='wo-page' data-page='$pageCount'>»</a></div>";
}
$pagging = $pagging . "</div>";
return $pagging;
}
/**
* Get view job link.
*
* @param array $jobItems
* Job items.
* @param int $job_id
* Job id.
*/
public function getViewJobLink($jobItems, $job_id){
$url ='';
if (count($jobItems) > 1) {
$url = base_path() .
"admin/tmgmt/jobs/" .
$job_id;
}
else {
$url = base_path() .
"admin/tmgmt/items/" .
$jobItems[0]->id() .
"?destination=" .
base_path() .
"admin/tmgmt/jobs/" .
$job_id;
}
return " <a href='$url' target='_blank' class='btn' title='View Job'>View Job</a> ";
}
/**
* Get download link.
*
* @param int $job_id
* Job id.
* @param string $request_guid
* Request guid.
*/
public function getDownloadLink($job_id,$request_guid){
$down = base_path() .
WordsOnlineConst::VIEW_XLF_LINK .
$job_id.'&request_guid='.$request_guid;
return $this->t(
" <a href=':url' class='use-ajax btn'
data-dialog-type='modal'
title='download'>Download</a> ",
[
":url" => $down
]
);
}
/**
* Get confirm link.
*
* @param int $job_id
* Job id.
* @param string $request_guid
* Request guid.
* @param string $add
* Add more param.
*/
public function getConfirmLink($job_id, $request_guid,$add=''){
$link = base_path() .
WordsOnlineConst::CONFIRM_ORDER_LINK .
$job_id.'&request_guid='.$request_guid.$add;
return $this->t(
" <a href=':url' class='use-ajax btn'
data-dialog-type='modal' title='View Quote'
>View Quote</a> ",
[
":url" => $link,
]
);
}
/**
* Get review link.
*
* @param array $jobItems
* Job items.
* @param int $job_id
* Job id.
*/
public function getReviewLink($jobItems, $job_id){
$link = '';
if (count($jobItems) > 1) {
$url = base_path() .
"admin/tmgmt/jobs/" .
$job_id;
$link =" <div class='wo-dropdown'><button class='dropbtn'>Review</button><div class='wo-dropdown-content'>";
foreach($jobItems as $ji){
$job_item_id = $ji->id();
$link .="<a href='".base_path() .
"admin/tmgmt/items/" .
$job_item_id .
"?destination=" .
base_path() .
"admin/tmgmt/jobs/" .
$job_id."' hreflang='und' target='_blank'>".$ji->getSourceLabel()."(Job Item " . $job_item_id . ")</a>";
}
$link .= "</div></div> ";
}
else {
foreach($jobItems as $ji){
$job_item_id = $ji->id();
$url = base_path() .
"admin/tmgmt/items/" .
$job_item_id .
"?destination=" .
base_path() .
"admin/tmgmt/jobs/" .
$job_id;
$link = " <a href='" . $url . "' target='_blank'
class='btn' title='Review'>Review</a> ";
break;
}
}
return $link;
}
/**
* Get source link.
*
* @param array $jobItems
* Job items.
*/
public function getSourceLink($jobItems){
$link =" <div class='wo-dropdown'><button class='dropbtn'>Source</button><div class='wo-dropdown-content'>";
foreach($jobItems as $ji){
$item_id = $ji->getItemId();
$sourceUrl = $ji->getSourceUrl()->toString();
if($sourceUrl == "FALSE" || $sourceUrl == "1"){
$sourceUrl = "/node/".$item_id;
}
if (substr($sourceUrl , 0, 1 ) === '/') {
$sourceUrl = substr($sourceUrl, 1);
}
$sourceUrl = base_path() . $sourceUrl;
$sourceLabel = $ji->getSourceLabel();
$link .="<a href='" . $sourceUrl . "' hreflang='und' target='_blank'>" . $sourceLabel ."(Job Item " . $ji->id() . ")</a>";
}
$link .= "</div></div> ";
return $link;
}
/**
* Get view xlf link.
*
* @param int $job_id
* Job id.
* @param string $request_guid
* Request guid.
* @param string $link_text
* Link text.
* @param string $add
* Add more string.
*/
public function getViewXlfLink($job_id,$request_guid,$link_text ='Import',$add =''){
$down = base_path() .
WordsOnlineConst::VIEW_XLF_LINK .
$job_id.'&request_guid='.$request_guid;
return $this->t($add.
" <a href=':url' class='use-ajax btn'
data-dialog-type='modal'
title='download'>Download</a> <a class='btn' onclick='reimport(@job_id,@request_guid
)' title='@link_text'>@link_text </a> ",
[
":url" => $down,
"@job_id" => $job_id,
"@link_text" => $link_text,
'@request_guid' => "'" . (string) $request_guid . "'",
]
);
}
/**
* Get list requests.
*
* @param string $filter
* The filter string.
* @param int $skip
* Skip record.
* @param string $top
* Number of record per page.
* @param string $job_filter_id
* Job id.
*/
public function getDataList($filter, $skip, $top = "10", string $job_filter_id = "0", $token = NULL) {
$page = 0;
if ($skip != NULL && $skip != "") {
$page = (int) $skip;
if ($page > 0) {
$page = $page - 1;
}
}
if($job_filter_id != NULL && $job_filter_id !="0"){
$record = $this->getWordsOnlineConnectorJobRecordByJobId((int)$job_filter_id);
if($record != NULL){
$filter = $record["request_name"];
}
}
$page = $page * 10;
if ($token == NULL) {
$token = $this->wo_manager->getToken();
}
if ($token != NULL) {
$url = WordsOnlineConst::API_URL .
'Requests?$skip=' .
$page .
'&$top=' .
$top .
'&$orderby=CreatedAt desc ';
if ($filter != NULL && $filter != "") {
$searchId = "";
if (is_numeric($filter)) {
$searchId = " or RequestId eq " . $filter . " ";
}
$url = $url .
'&$filter=(contains(tolower(RequestName),tolower(%27' .
$filter .
"%27)) " .
$searchId .
")";
}
$result = $this->client->get(
$url,
[
"headers" => [
"Authorization" => "Bearer " . $token,
"Accept" => "application/json",
"Referer" => "ClientAPI",
],
"timeout" => 3600,
]
);
if ($result->getStatusCode() == 200) {
$data = json_decode($result->getBody()->getContents());
if ($data->status == 1) {
return $data->result;
}
}
}
return NULL;
}
/**
* Get quote info for job.
*
* @param Symfony\Component\HttpFoundation\Request $request
* The request from client.
*
* @return Symfony\Component\HttpFoundation\JsonResponse
* A json response.
*/
public function getQuote(Request $request) {
$res["status"] = "error";
if ($request->query->get("job_id")) {
$job_id = $request->query->get("job_id");
$request_guid = $request->query->get("request_guid");
$token = $this->wo_manager->getToken();
if ($token != NULL) {
if ($request_guid != NULL) {
$quotes = wordsonline_connector_get_quote($request_guid, $token);
if ($quotes != NULL && $quotes->status == 1) {
$res["status"] = "success";
$res["data"] = $quotes->result;
}
}
return new JsonResponse($res);
}
else {
return new JsonResponse($res);
}
}
else {
return new JsonResponse($res);
}
}
/**
* Check has delivery files.
*
* @return Symfony\Component\HttpFoundation\JsonResponse
* A json response.
*/
public function checkHasFiles() {
$token = $this->wo_manager->getToken();
if ($token != NULL) {
$has_change = $this->wo_manager->isHasDeliveryStatusChange($token);
return new JsonResponse(
[
"status" => "success",
"changed" => $has_change,
]
);
}
else {
return new JsonResponse(["status" => "error", "changed" => FALSE]);
}
}
/**
* Set request fail and send mail.
*
* @param string $request_guid
* Guid of request.
* @param string $xmlData
* Xml content.
* @param string $token
* The token for authorization.
*/
public function sendErrorToWordsOnline($request_guid, $xmlData, $token) {
$messages = wordsonline_connector_get_error_message($xmlData);
wordsonline_connector_request_action(
$request_guid,
WordsOnlineStatus::IMPORT_FAIL_STATUS,
$messages,
$token
);
}
/**
* Import file.
*
* @param Symfony\Component\HttpFoundation\Request $request
* The request from client.
*
* @return Symfony\Component\HttpFoundation\JsonResponse
* A json response.
*/
public function reimport(Request $request) {
if ($request->query->get("job_id")) {
$job_id = $request->query->get("job_id");
$request_guid = $request->query->get("request_guid");
$status = $this->wo_manager->import($job_id, $request_guid);
return new JsonResponse(["status" => $status]);
}
return new JsonResponse(["status" => "error"]);
}
/**
* Get config from wordsonline table.
*/
public function getConfig() {
$ret = $this->database
->query(WordsOnlineConst::SELECT_CONFIG)
->fetchAssoc();
return $ret;
}
/**
* Display xlf file for review.
*
* @param Symfony\Component\HttpFoundation\Request $request
* The request from client.
*/
public function viewXlf(Request $request) {
$xmlData = [];
$fName ="";
if ($request->query->get("job_id")) {
$job_id = $request->query->get("job_id");
$request_guid = $request->query->get("request_guid");
$token = $this->wo_manager->getToken();
if ($token != NULL) {
if ($request_guid != NULL) {
$files = wordsonline_connector_get_request_files_list(
$request_guid,
$token
);
if ($files != NULL) {
foreach ($files->result as $fi) {
$file_guid = $fi->guid;
$data = wordsonline_connector_download_file(
$request_guid,
$file_guid,
$token
);
$fName = "public://" . $fi->name;
file_put_contents($fName, $data);
$zip = new ZipHandle($fName, $this->archiver, $this->fileSystem);
$fileContent = $zip->fileContent;
$fileNames = $zip->fileNames;
//$this->fileSystem->delete($fName);
if ($fileContent != NULL
&& count($fileContent) > 0
) {
$i = 0;
foreach ($fileContent as $fcontent) {
array_push($xmlData, new WOFile(
$fileNames[$i],
$fcontent
));
$i++;
}
}
}
}
}
}
}
$modal_form = $this->formBuilder()->getForm(
'\Drupal\wordsonline_connector\Form\ViewXlfForm',
$xmlData,
$fName
);
$render["form"] = $modal_form;
return $render;
}
/**
* Get xlf file content.
*
* @param Symfony\Component\HttpFoundation\Request $request
* The request from client.
*/
public function getFileContent(Request $request) {
$result = "";
if ($request->query->get("fileName")) {
$fileName = $request->query->get("fileName");
$tempPath = "temporary://wordsonline_connector/$fileName";
if (!file_exists($tempPath)) {
return new JsonResponse(
[
"status" => "error",
"result" => "",
"messages" => "File $fileName is not exists",
]
);
}
$result = file_get_contents($tempPath);
}
else {
return new JsonResponse(
[
"status" => "error",
"result" => "",
"messages" => "Paramerter is incorrect",
]
);
}
return new JsonResponse(
[
"status" => "success",
"result" => $result,
"messages" => "",
]
);
}
/**
* Get zip file content.
*
* @param Symfony\Component\HttpFoundation\Request $request
* The request from client.
*/
public function downloadJobFile(Request $request) {
$fileName = $request->query->get("fileName");
$uri = 'public://' . $fileName;
$headers = [
'Content-Type' => 'application/zip',
'Content-Disposition' => 'attachment;filename="' . $fileName . '"',
];
return new BinaryFileResponse($uri, 200, $headers, TRUE);
}
/**
* Display list wordsonline support language.
*
* @param Symfony\Component\HttpFoundation\Request $request
* The request from client.
*/
public function supportLanguages(Request $request) {
$header = [
"code" => $this->t("Drupal Language Code"),
"lang_name" => $this->t("Language Name"),
"wol_code" => $this->t("WordsOnline Language Code")
];
$rows = [];
$form["#prefix"] =
"<div><a href='".base_path() . WordsOnlineConst::IMPORT_SUPPORT_LANG_URL."'
class='wol-btn btn-layout'>Re-import support languages</a>
</div>";
$results = $this->database
->query(
WordsOnlineConst::GET_ALL_WORDSONLINE_SUPPORT_LANGUAGES_QUERY
)
->fetchAll();
foreach ($results as $res) {
$rows[] = [
"code" => $res->code,
"lang_name" => $res->lang_name,
"wol_code" => $res->wol_code
];
}
$form["table"] = [
"#type" => "table",
"#header" => $header,
"#rows" => $rows,
"#empty" => $this->t("No records found"),
"#attributes" => ["class" => ["wol-table"]],
];
$form["#attached"]["library"][] = "wordsonline_connector/wordsonline_support_language";
return $form;
}
/**
* reImport list wordsonline support language.
*
* @param Symfony\Component\HttpFoundation\Request $request
* The request from client.
*/
public function importSupportLanguages(Request $request) {
try{
$npath = $this->moduleExtensionList->getPath(WordsOnlineConst::MODULE_ID);
$import = $this->fileSystem->realpath($npath . '/js/languages.json');//$this->fileUrlGenerator->generateAbsoluteString($npath . '/js/languages.json');
$content = file_get_contents($import);
$langs = json_decode($content);
foreach ($langs as $lang) {
$results = $this->database
->query(
WordsOnlineConst::GET_WORDSONLINE_SUPPORT_LANGUAGE_BY_CODE_QUERY,
[":code" => (string) $lang->code]
)
->fetchAssoc();
if ($results != NULL) {
$this->database
->update(WordsOnlineConst::LANGUAGE_JOB_TABLE)
->condition("code", $lang->code)
->fields(
[
'code' => $lang->code,
'lang_name' => $lang->lang_name,
'wol_code' => $lang->wol_code
]
)
->execute();
} else {
$this->database->insert(WordsOnlineConst::LANGUAGE_JOB_TABLE)
->fields(['code', 'lang_name', 'wol_code'])
->values([
'code' => $lang->code,
'lang_name' => $lang->lang_name,
'wol_code' => $lang->wol_code
])
->execute();
}
}
$this->messenger->addMessage('Re-import supported languages successfully');
}catch(\Exception $e) {
$this->messenger->addError($e->getMessage());
}
$target_url = base_path() . WordsOnlineConst::SUPPORT_LANG_URL;
$response = new RedirectResponse($target_url);
$response->send();
}
}
