16 import(
'classes.handler.Handler');
27 parent::__construct();
31 array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT, ROLE_ID_REVIEWER, ROLE_ID_AUTHOR),
32 array(
'editor',
'json',
'media',
'createGalleyForm',
'createGalley')
39 function authorize($request, &$args, $roleAssignments) {
40 import(
'lib.pkp.classes.security.authorization.SubmissionFileAccessPolicy');
42 return parent::authorize($request, $args, $roleAssignments);
54 import(
'plugins.generic.texture.controllers.grid.form.TextureArticleGalleyForm');
61 $galleyForm->initData();
62 return new JSONMessage(
true, $galleyForm->fetch($request));
72 import(
'plugins.generic.texture.controllers.grid.form.TextureArticleGalleyForm');
75 $galleyForm->readInputData();
77 if ($galleyForm->validate()) {
79 $galleyForm->execute();
81 return $request->redirectUrlJson($request->getDispatcher()->url($request, ROUTE_PAGE,
null,
'workflow',
'access',
null,
83 'submissionId' => $request->getUserVar(
'submissionId'),
84 'stageId' => $request->getUserVar(
'stageId')
100 public function editor($args, $request) {
101 $stageId = (int)$request->getUserVar(
'stageId');
102 $fileId = (int)$request->getUserVar(
'fileId');
103 $submissionId = (int)$request->getUserVar(
'submissionId');;
104 if (!$submissionId || !$stageId || !$fileId) {
108 $editorTemplateFile = method_exists($this->_plugin,
'getTemplateResource') ? $this->_plugin->getTemplateResource(
'editor.tpl') : ($this->_plugin->getTemplateResourceName() .
':templates/editor.tpl');
109 $router = $request->getRouter();
110 $documentUrl = $router->url($request,
null,
'texture',
'json',
null,
112 'submissionId' => $submissionId,
114 'stageId' => $stageId,
120 $templateMgr->assign(array(
121 'documentUrl' => $documentUrl,
122 'textureUrl' => $this->_plugin->getTextureUrl($request),
123 'texturePluginUrl' => $this->_plugin->getPluginUrl($request),
125 return $templateMgr->fetch($editorTemplateFile);
137 public function json($args, $request) {
141 if (!$submissionFile) {
145 if (empty($submissionFile)) {
146 echo __(
'plugins.generic.texture.archive.noArticle');
150 if ($_SERVER[
"REQUEST_METHOD"] ===
"DELETE") {
151 $postData = file_get_contents(
'php://input');
153 if (!empty($media)) {
155 $dependentFiles = $submissionFileDao->getLatestRevisionsByAssocId(
156 ASSOC_TYPE_SUBMISSION_FILE,
157 $submissionFile->getFileId(),
158 $submissionFile->getSubmissionId(),
159 SUBMISSION_FILE_DEPENDENT
161 foreach ($dependentFiles as $dependentFile) {
162 if ($dependentFile->getOriginalFileName() === $media[
'fileName']) {
163 $fileId = $dependentFile->getFileId();
164 $submissionId = (int)$request->getUserVar(
'submissionId');
165 $fileStage = $dependentFile->getFileStage();
166 $fileRevision = $submissionFileDao->deleteLatestRevisionById($fileId, $fileStage, $submissionId);
167 if ($fileRevision > 0) {
169 'submissionId' => $submissionId,
170 'fileId' => $submissionId,
171 'fileRevision' => $fileRevision,
172 'delete_stauts' =>
true
183 if ($_SERVER[
"REQUEST_METHOD"] ===
"GET") {
185 $filePath = $submissionFile->getFilePath();
186 $manuscriptXml = file_get_contents($filePath);
188 $manuscriptXmlDom = $this->_removeElements($manuscriptXml);
191 'manifest.xml' => array(
192 'encoding' =>
'utf8',
193 'data' => $manifestXml,
194 'size' => strlen($manifestXml),
198 'manuscript.xml' => array(
199 'encoding' =>
'utf8',
200 'data' => $manuscriptXmlDom->saveXML(),
201 'size' => filesize($filePath),
207 'version' => $submissionFile->getSourceRevision(),
208 'resources' => array_merge($resources, $mediaInfos)
210 header(
'Content-Type: application/json');
211 return json_encode($mediaBlob, JSON_UNESCAPED_SLASHES);
212 } elseif ($_SERVER[
"REQUEST_METHOD"] ===
"PUT") {
214 $postData = file_get_contents(
'php://input');
216 if (!empty($postData)) {
218 $submissionId = (int)$request->getUserVar(
'submissionId');
219 $submission = $submissionDao->getById($submissionId);
221 $resources = (array)
json_decode($postData)->archive->resources;
224 if (!empty($media)) {
225 import(
'classes.file.PublicFileManager');
229 $journal = $request->getJournal();
231 $genres = $genreDao->getByDependenceAndContextId(
true, $journal->getId());
233 $extension = $publicFileManager->getImageExtension($media[
"fileType"]);
234 while ($candidateGenre = $genres->next()) {
236 if ($candidateGenre->getKey() ==
'IMAGE') {
237 $genreId = $candidateGenre->getId();
241 if ($candidateGenre->getKey() ==
'MULTIMEDIA') {
242 $genreId = $candidateGenre->getId();
253 $user = $request->getUser();
254 $insertedSubmissionFile = $this->
_createDependentFile($genreId, $media, $submission, $submissionFile, $user);
257 } elseif (!empty($resources) && isset($resources[
'manuscript.xml']) && is_object($resources[
'manuscript.xml'])) {
258 $genreId = $submissionFile->getGenreId();
259 $fileStage = $submissionFile->getFileStage();
260 $user = $request->getUser();
262 $insertedSubmissionFile = $this->
_updateManuscriptFile($fileStage, $genreId, $resources, $submission, $submissionFile, $user);
269 'submissionId' => $insertedSubmissionFile->getSubmissionId(),
270 'fileId' => $insertedSubmissionFile->getFileIdAndRevision(),
271 'fileStage' => $insertedSubmissionFile->getFileStage(),
291 $mediaDir =
'texture/media';
292 $context = $request->getContext();
293 $router = $request->getRouter();
294 $dispatcher = $router->getDispatcher();
295 $fileId = $request->getUserVar(
'fileId');
296 $stageId = $request->getUserVar(
'stageId');
297 $submissionId = $request->getUserVar(
'submissionId');
299 $assetsFilePaths = array();
301 import(
'lib.pkp.classes.submission.SubmissionFile');
302 $dependentFiles = $submissionFileDao->getLatestRevisionsByAssocId(
303 ASSOC_TYPE_SUBMISSION_FILE,
306 SUBMISSION_FILE_DEPENDENT
308 foreach ($dependentFiles as $dFile) {
309 $assetsFilePaths[$dFile->getOriginalFileName()] = $dFile->getFilePath();
311 foreach ($assets as $asset) {
312 $path = str_replace(
'media/',
'', $asset[
'path']);
313 $filePath = $assetsFilePaths[$path];
314 $url = $dispatcher->url($request, ROUTE_PAGE,
null,
'texture',
'media',
null, array(
315 'submissionId' => $submissionId,
317 'stageId' => $stageId,
320 $infos[$asset[
'path']] = array(
323 'size' => filesize($filePath),
324 'createdAt' => filemtime($filePath),
325 'updatedAt' => filectime($filePath),
338 $dom =
new DOMDocument();
339 if (!$dom->loadXML($manuscriptXml)) {
340 fatalError(
"Unable to load XML document content in DOM in order to generate manifest XML.");
345 $figElements = $dom->getElementsByTagName(
'fig');
346 foreach ($figElements as $figure) {
348 $figItem = $figElements->item($k);
349 $graphic = $figItem->getElementsByTagName(
'graphic');
350 if (
sizeof($graphic) > 0) {
353 if (!$figItem || !$graphic) {
359 if ($figItem->hasAttribute(
'id')) {
360 $figId = $figItem->getAttribute(
'id');
362 $figId =
"ojs-fig-{$pos}";
366 $figGraphPath = $graphic->item(0)->getAttribute(
'xlink:href');
371 'type' =>
'image/jpg',
372 'path' => $figGraphPath,
378 $sxml = simplexml_load_string(
'<dar><documents><document id="manuscript" type="article" path="manuscript.xml" /></documents><assets></assets></dar>');
379 foreach ($assets as $asset) {
380 $assetNode = $sxml->assets->addChild(
'asset');
381 $assetNode->addAttribute(
'id', $asset[
'id']);
382 $assetNode->addAttribute(
'type', $asset[
'type']);
383 $assetNode->addAttribute(
'path', $asset[
'path']);
386 return $sxml->asXML();
397 public function media($args, $request) {
398 $user = $request->getUser();
399 $context = $request->getContext();
401 if (!$submissionFile) {
406 import(
'lib.pkp.classes.submission.SubmissionFile');
407 $dependentFiles = $submissionFileDao->getLatestRevisionsByAssocId(
408 ASSOC_TYPE_SUBMISSION_FILE,
409 $submissionFile->getFileId(),
410 $submissionFile->getSubmissionId(),
411 SUBMISSION_FILE_DEPENDENT
415 if (!in_array($submissionFile->getFileType(), array(
'text/xml',
'application/xml'))) {
419 $mediaSubmissionFile =
null;
420 foreach ($dependentFiles as $dependentFile) {
421 if ($dependentFile->getOriginalFileName() == $request->getUserVar(
'fileName')) {
422 $mediaSubmissionFile = $dependentFile;
427 if (!$mediaSubmissionFile) {
428 $request->getDispatcher()->handle404();
431 $filePath = $mediaSubmissionFile->getFilePath();
432 header(
'Content-Type:' . $mediaSubmissionFile->getFileType());
433 header(
'Content-Length: ' . $mediaSubmissionFile->getFileSize());
446 protected function _createDependentFile($genreId, $mediaData, $submission, $submissionFile, $user) {
447 $mediaBlob = base64_decode(preg_replace(
'#^data:\w+/\w+;base64,#i',
'', $mediaData[
"data"]));
448 $tmpfname = tempnam(sys_get_temp_dir(),
'texture');
449 file_put_contents($tmpfname, $mediaBlob);
452 $newMediaFile = $submissionFileDao->newDataObjectByGenreId($genreId);
453 $newMediaFile->setSubmissionId($submission->getId());
454 $newMediaFile->setSubmissionLocale($submission->getLocale());
455 $newMediaFile->setGenreId($genreId);
456 $newMediaFile->setFileStage(SUBMISSION_FILE_DEPENDENT);
459 $newMediaFile->setUploaderUserId($user->getId());
460 $newMediaFile->setFileSize(filesize($tmpfname));
461 $newMediaFile->setFileType($mediaData[
"fileType"]);
462 $newMediaFile->setAssocId($submissionFile->getFileId());
463 $newMediaFile->setAssocType(ASSOC_TYPE_SUBMISSION_FILE);
464 $newMediaFile->setOriginalFileName($mediaData[
"fileName"]);
465 $insertedMediaFile = $submissionFileDao->insertObject($newMediaFile, $tmpfname);
468 return $insertedMediaFile;
481 protected function _updateManuscriptFile($fileStage, $genreId, $resources, $submission, $submissionFile, $user) {
482 $manuscriptXml = $resources[
'manuscript.xml']->data;
483 $tmpfname = tempnam(sys_get_temp_dir(),
'texture');
484 file_put_contents($tmpfname, $manuscriptXml);
487 $fileSize = filesize($tmpfname);
490 $newSubmissionFile = $submissionFileDao->newDataObjectByGenreId($genreId);
492 $newSubmissionFile->setSubmissionId($submission->getId());
493 $newSubmissionFile->setSubmissionLocale($submission->getLocale());
494 $newSubmissionFile->setGenreId($genreId);
495 $newSubmissionFile->setFileStage($fileStage);
498 $newSubmissionFile->setOriginalFileName($submissionFile->getOriginalFileName());
499 $newSubmissionFile->setUploaderUserId($user->getId());
500 $newSubmissionFile->setFileSize($fileSize);
501 $newSubmissionFile->setFileType($submissionFile->getFileType());
502 $newSubmissionFile->setSourceFileId($submissionFile->getFileId());
503 $newSubmissionFile->setSourceRevision($submissionFile->getRevision());
504 $newSubmissionFile->setFileId($submissionFile->getFileId());
505 $newSubmissionFile->setRevision($submissionFile->getRevision() + 1);
506 $insertedSubmissionFile = $submissionFileDao->insertObject($newSubmissionFile, $tmpfname);
510 return $insertedSubmissionFile;
517 private function _removeElements($manuscriptXml) {
518 $elementsPath = array(
"/article/front/journal-meta",
"/article/front/article-meta/self-uri");
520 $manuscriptXmlDom =
new DOMDocument;
521 $manuscriptXmlDom->loadXML($manuscriptXml);
522 $xpath =
new DOMXpath($manuscriptXmlDom);
524 foreach ($elementsPath as $elementPath) {
525 $elements = $xpath->query($elementPath);
526 foreach ($elements as $element) {
527 $element->parentNode->removeChild($element);
530 return $manuscriptXmlDom;