Commit be8f7020ac61c61f0c01196cab45a10b9900c004

Authored by Brad Shuttleworth
1 parent 4b0338e9

- cleanup checkin, delete

- make move use new form ui.


git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@5837 c91229c3-7414-0410-bfa2-8a42b809f60b
plugins/ktcore/KTDocumentActions.php
... ... @@ -407,69 +407,109 @@ class KTDocumentCheckInAction extends KTDocumentAction {
407 407 return true;
408 408 }
409 409  
  410 +
  411 + function form_main() {
  412 + $oForm = new KTForm;
  413 + $oForm->setOptions(array(
  414 + 'label' => _kt("Checkin Document"),
  415 + 'action' => 'checkin',
  416 + 'fail_action' => 'main',
  417 + 'cancel_url' => KTBrowseUtil::getUrlForDocument($this->oDocument),
  418 + 'submit_label' => _kt("Checkin"),
  419 + 'context' => &$this,
  420 + 'file_upload' => true, // otherwise the post is not received.
  421 + ));
  422 + $oForm->setWidgets(array(
  423 + array('ktcore.widgets.file', array(
  424 + 'label' => _kt("File"),
  425 + 'description' => sprintf(_kt('Please specify the file you wish to upload. Unless you also indicate that you are changing its filename (see "Force Original Filename" below), this will need to be called <strong>%s</strong>'), $this->oDocument->getFilename()),
  426 + 'name' => 'file',
  427 + 'basename' => 'file',
  428 + 'required' => true,
  429 + )),
  430 + array('ktcore.widgets.reason', array(
  431 + 'label' => _kt("Reason"),
  432 + 'description' => _kt("Please specify why you are cancelling this document's checked-out status. Please bear in mind that you can use a maximum of <strong>250</strong> characters."),
  433 + 'name' => 'reason',
  434 + )),
  435 + array('ktcore.widgets.boolean',array(
  436 + 'label' => _kt('Force Original Filename'),
  437 + 'description' => sprintf(_kt('If this is checked, the uploaded document must have the same filename as the original: <strong>%s</strong>'), $this->oDocument->getFilename()),
  438 + 'name' => 'forcefilename',
  439 + 'value' => true,
  440 + )),
  441 + ));
  442 + $oForm->setValidators(array(
  443 + array('ktcore.validators.string', array(
  444 + 'test' => 'reason',
  445 + 'max_length' => 250,
  446 + 'output' => 'reason',
  447 + )),
  448 + array('ktcore.validators.file', array(
  449 + 'test' => 'file',
  450 + 'output' => 'file',
  451 + )),
  452 + array('ktcore.validators.boolean', array(
  453 + 'test' => 'forcefilename',
  454 + 'output' => 'forcefilename',
  455 + )),
  456 + ));
  457 +
  458 + return $oForm;
  459 + }
  460 +
  461 +
410 462 function do_main() {
411 463 $this->oPage->setBreadcrumbDetails("checkin");
412 464 $oTemplate =& $this->oValidator->validateTemplate('ktcore/action/checkin');
413 465  
414   - $sReason = KTUtil::arrayGet($_REQUEST, 'reason', "");
415   - $checkin_fields = array();
416   - $checkin_fields[] = new KTFileUploadWidget(_kt('File'), _kt('The updated document.'), 'file', "", $this->oPage, true);
417   - $checkin_fields[] = new KTStringWidget(_kt('Reason'), _kt('Describe the changes made to the document.'), 'reason', $sReason, $this->oPage, true);
418   - $checkin_fields[] = new KTCheckboxWidget(_kt('Force Original Filename'), _kt('If this is checked, the uploaded document must have the same filename as the original.'), 'forcefilename', '1', $this->oPage, true);
  466 + $oForm = $this->form_main();
419 467  
420 468 $oTemplate->setData(array(
421 469 'context' => &$this,
422   - 'checkin_fields' => $checkin_fields,
  470 + 'form' => $oForm,
423 471 ));
424 472 return $oTemplate->render();
425 473 }
426 474  
427 475 function do_checkin() {
428   - $sReason = KTUtil::arrayGet($_REQUEST, 'reason');
429   - $aOptions = array(
430   - 'message' => _kt('You must supply a reason.'),
431   - 'redirect_to' => array('main', sprintf('fDocumentId=%d', $this->oDocument->getId())),
432   - );
433   - $sReason = $this->oValidator->notEmpty($sReason, $aOptions);
434   -
435   - $bForceFilename = KTUtil::arrayGet($_REQUEST, 'forcefilename');
436   -
437   - // make sure the user actually selected a file first
438   - if (strlen($_FILES['file']['name']) == 0) {
439   - $this->errorRedirectToMain(_kt("No file was uploaded"), 'fDocumentId=' . $this->oDocument->getId() . '&reason=' . $sReason);
  476 + $oForm = $this->form_main();
  477 + $res = $oForm->validate();
  478 + $data = $res['results'];
  479 +
  480 + $extra_errors = array();
  481 +
  482 + if ($data['forcefilename'] && ($data['file']['name'] != $this->oDocument->getFilename())) {
  483 + $extra_errors['file'] = sprintf(_kt('The file you uploaded was not called "%s". If you wish to change the filename, please set "Force Original Filename" below to false. '), $this->oDocument->getFilename());
440 484 }
  485 +
  486 + if (!empty($res['errors']) || !empty($extra_errors)) {
  487 + return $oForm->handleError(null, $extra_errors);
  488 + }
  489 +
  490 + $sReason = $data['reason'];
  491 +
  492 + $sCurrentFilename = $this->oDocument->getFileName();
  493 + $sNewFilename = $data['file']['name'];
441 494  
442   - // and that the filename matches
443   - global $default;
444   -
445   - $sCurrentFilename = $this->oDocument->getFileName();
446   - $sNewFilename = $_FILES['file']['name'];
447   -
448   - $default->log->info("checkInDocumentBL.php uploaded filename=" . $sNewFilename . "; current filename=" . $sCurrentFilename);
449   -
450   -
451   - $aOptions = array();
452   -
453   - if ($this->oDocument->getFileName() != $_FILES['file']['name']) {
454   - if($bForceFilename) {
455   - $this->errorRedirectToMain(_kt("The file name of the uploaded file does not match the file name of the document in the system"), 'fDocumentId=' . $this->oDocument->getId() . '&reason=' . $sReason);
456   - } else {
457   - $aOptions['newfilename'] = $sNewFilename;
458   - }
459   - }
460   -
  495 + $aOptions = array();
461 496  
462   - $res = KTDocumentUtil::checkin($this->oDocument, $_FILES['file']['tmp_name'], $sReason, $this->oUser, $aOptions);
  497 + if ($sCurrentFilename != $sNewFilename) {
  498 + $aOptions['newfilename'] = $sNewFilename;
  499 + }
  500 +
  501 + $res = KTDocumentUtil::checkin($this->oDocument, $data['file']['tmp_name'], $sReason, $this->oUser, $aOptions);
463 502 if (PEAR::isError($res)) {
464 503 $this->errorRedirectToMain(_kt("An error occurred while trying to check in the document"), 'fDocumentId=' . $this->oDocument->getId() . '&reason=' . $sReason);
465 504 }
466   - redirect("$default->rootUrl/control.php?action=viewDocument&fDocumentID=" . $this->oDocument->getID());
  505 + redirect(KTBrowseUtil::getUrlForDocument($this->oDocument));
  506 + exit(0);
467 507 }
468 508 }
469 509 // }}}
470 510  
471 511  
472   -// {{{ KTDocumentCheckInAction
  512 +// {{{ KTDocumentCancelCheckOutAction
473 513 class KTDocumentCancelCheckOutAction extends KTDocumentAction {
474 514 var $sName = 'ktcore.actions.document.cancelcheckout';
475 515  
... ... @@ -490,7 +530,7 @@ class KTDocumentCancelCheckOutAction extends KTDocumentAction {
490 530 if (KTBrowseUtil::inAdminMode($this->oUser, $oFolder)) {
491 531 $this->bAdminMode = true;
492 532 return parent::getInfo();
493   - }
  533 + }
494 534 } else if ($this->bInAdminMode == true) {
495 535 return parent::getInfo();
496 536 }
... ... @@ -500,8 +540,6 @@ class KTDocumentCancelCheckOutAction extends KTDocumentAction {
500 540 return parent::getInfo();
501 541 }
502 542  
503   -
504   -
505 543 function check() {
506 544 $res = parent::check();
507 545  
... ... @@ -519,7 +557,7 @@ class KTDocumentCancelCheckOutAction extends KTDocumentAction {
519 557 if (KTBrowseUtil::inAdminMode($this->oUser, $oFolder)) {
520 558 $this->bAdminMode = true;
521 559 return true;
522   - }
  560 + }
523 561 } else if ($this->bInAdminMode == true) {
524 562 return true;
525 563 }
... ... @@ -637,35 +675,66 @@ class KTDocumentDeleteAction extends KTDocumentAction {
637 675 return true;
638 676 }
639 677  
  678 +
  679 + function form_main() {
  680 + $oForm = new KTForm;
  681 + $oForm->setOptions(array(
  682 + 'label' => _kt("Delete Document"),
  683 + 'action' => 'delete',
  684 + 'fail_action' => 'main',
  685 + 'cancel_url' => KTBrowseUtil::getUrlForDocument($this->oDocument),
  686 + 'submit_label' => _kt("Delete Document"),
  687 + 'context' => &$this,
  688 + ));
  689 + $oForm->setWidgets(array(
  690 + array('ktcore.widgets.reason', array(
  691 + 'label' => _kt("Reason"),
  692 + 'description' => _kt("Please specify why you are deleting this document. Please bear in mind that you can use a maximum of <strong>250</strong> characters."),
  693 + 'name' => 'reason',
  694 + )),
  695 + ));
  696 + $oForm->setValidators(array(
  697 + array('ktcore.validators.string', array(
  698 + 'test' => 'reason',
  699 + 'max_length' => 250,
  700 + 'output' => 'reason',
  701 + )),
  702 + ));
  703 +
  704 + return $oForm;
  705 + }
  706 +
640 707 function do_main() {
641   - $this->oPage->setBreadcrumbDetails("delete");
  708 + $this->oPage->setBreadcrumbDetails("Delete");
642 709 $oTemplate =& $this->oValidator->validateTemplate('ktcore/action/delete');
643   - $delete_fields = array();
644   - $delete_fields[] = new KTStringWidget(_kt('Reason'), _kt('The reason for this document to be removed.'), 'reason', "", $this->oPage, true);
  710 +
  711 + $oForm = $this->form_main();
645 712  
646 713 $oTemplate->setData(array(
647 714 'context' => &$this,
648   - 'delete_fields' => $delete_fields,
  715 + 'form' => $oForm,
649 716 ));
650 717 return $oTemplate->render();
651 718 }
652 719  
653 720 function do_delete() {
654   - global $default;
655   - $sReason = KTUtil::arrayGet($_REQUEST, 'reason');
656   - $this->oValidator->validateString($sReason,
657   - array('redirect_to' => array('', sprintf('fDocumentId=%d', $this->oDocument->getId()))));
  721 + $oForm = $this->form_main();
  722 + $res = $oForm->validate();
  723 + $data = $res['results'];
  724 + if (!empty($res['errors'])) {
  725 + return $oForm->handleError();
  726 + }
  727 +
  728 + $sReason = $data['reason'];
658 729  
659 730 $fFolderId = $this->oDocument->getFolderId();
660 731 $res = KTDocumentUtil::delete($this->oDocument, $sReason);
661 732 if (PEAR::isError($res)) {
662   - $_SESSION['KTErrorMessage'][] = $res->getMessage();
663   - controllerRedirect('viewDocument',sprintf('fDocumentId=%d', $this->oDocument->getId()));
664   - } else {
665   - $_SESSION['KTInfoMessage'][] = sprintf(_kt('Document "%s" Deleted.'),$this->oDocument->getName());
666   - }
667   -
668   -
  733 + $this->errorRedirectToMain(sprintf(_kt("Unexpected failure deleting document: %s"), $res->getMessage()));
  734 + }
  735 +
  736 + $_SESSION['KTInfoMessage'][] = sprintf(_kt('Document "%s" Deleted.'),$this->oDocument->getName());
  737 +
669 738 controllerRedirect('browse', 'fFolderId=' . $fFolderId);
670 739 exit(0);
671 740 }
... ... @@ -711,6 +780,7 @@ class KTDocumentMoveAction extends KTDocumentAction {
711 780 controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId());
712 781 exit(0);
713 782 }
  783 + $this->persistParams(array('fFolderId'));
714 784 $iFolderId = KTUtil::arrayGet($_REQUEST, 'fFolderId', $this->oDocument->getFolderId());
715 785 $this->oFolder = $this->oValidator->validateFolder($iFolderId);
716 786 $this->oDocumentFolder = $this->oValidator->validateFolder($this->oDocument->getFolderId());
... ... @@ -770,43 +840,71 @@ class KTDocumentMoveAction extends KTDocumentAction {
770 840 return $oTemplate->render();
771 841 }
772 842  
  843 + function form_move() {
  844 + $oForm = new KTForm;
  845 + $oForm->setOptions(array(
  846 + 'label' => _kt("Move Document"),
  847 + 'action' => 'move_final',
  848 + 'fail_action' => 'move',
  849 + 'cancel_url' => KTBrowseUtil::getUrlForDocument($this->oDocument),
  850 + 'submit_label' => _kt("Move Document"),
  851 + 'context' => &$this,
  852 + ));
  853 + $oForm->setWidgets(array(
  854 + array('ktcore.widgets.reason', array(
  855 + 'label' => _kt("Reason"),
  856 + 'description' => _kt("Please specify why you are moving this document. Please bear in mind that you can use a maximum of <strong>250</strong> characters."),
  857 + 'name' => 'reason',
  858 + )),
  859 + ));
  860 + $oForm->setValidators(array(
  861 + array('ktcore.validators.string', array(
  862 + 'test' => 'reason',
  863 + 'max_length' => 250,
  864 + 'output' => 'reason',
  865 + )),
  866 + ));
  867 +
  868 + return $oForm;
  869 + }
  870 +
773 871 function do_move() {
774   - $this->oPage->setBreadcrumbDetails(_kt("move"));
  872 + $this->persistParams(array('fFolderId'));
  873 +
  874 + $this->oPage->setBreadcrumbDetails(_kt("Move"));
775 875 $oTemplate =& $this->oValidator->validateTemplate('ktcore/action/move_final');
776 876  
777   - if($this->oDocument->getFolderId() === $this->oFolder->getId()) {
778   - $this->errorRedirectTo('main', _kt("The document was already in this folder"), sprintf("fDocumentId=%d&fFolderId=%d", $this->oDocument->getId(), $this->oFolder->getId()));
779   - exit(0);
780   - }
781   -
782   -
783   - $sFolderPath = join(" &raquo; ", $this->oFolder->getPathArray());
784   - $aNames = $this->oDocumentFolder->getPathArray();
785   - $aNames[] = $this->oDocument->getName();
786   - $sDocumentName = join(" &raquo; ", $aNames);
787   -
788   - $move_fields = array();
789   - $move_fields[] = new KTStaticTextWidget(_kt('Document to move'), '', 'fDocumentId', $sDocumentName, $this->oPage, false);
790   - $move_fields[] = new KTStaticTextWidget(_kt('Target folder'), '', 'fFolderId', $sFolderPath, $this->oPage, false);
791   - $move_fields[] = new KTStringWidget(_kt('Reason'), _kt('The reason for this document to be moved.'), 'reason', "", $this->oPage, true);
  877 + if($this->oDocument->getFolderId() === $this->oFolder->getId()) {
  878 + $this->errorRedirectTo('main', _kt("The document was already in this folder"), sprintf("fDocumentId=%d&fFolderId=%d", $this->oDocument->getId(), $this->oFolder->getId()));
  879 + exit(0);
  880 + }
  881 +
  882 + $oForm = $this->form_move();
  883 +
  884 + //$sFolderPath = join(" &raquo; ", $this->oFolder->getPathArray());
  885 + //$aNames = $this->oDocumentFolder->getPathArray();
  886 + //$aNames[] = $this->oDocument->getName();
  887 + //$sDocumentName = join(" &raquo; ", $aNames);
792 888  
793 889 $oTemplate->setData(array(
794 890 'context' => &$this,
795   - 'move_fields' => $move_fields,
  891 + 'form' => $oForm,
796 892 ));
797 893 return $oTemplate->render();
798 894 }
799 895  
800 896 function do_move_final() {
801   - $sReason = KTUtil::arrayGet($_REQUEST, 'reason');
802   - $aOptions = array(
803   - 'message' => _kt("No reason given"),
804   - 'redirect_to' => array('move', sprintf('fDocumentId=%d&fFolderId=%d', $this->oDocument->getId(), $this->oFolder->getId())),
805   - );
806   - $this->oValidator->notEmpty($sReason, $aOptions);
  897 + $oForm = $this->form_move();
  898 + $res = $oForm->validate();
  899 + $data = $res['results'];
  900 + if (!empty($res['errors'])) {
  901 + return $oForm->handleError();
  902 + }
  903 +
  904 + $sReason = $data['reason'];
807 905  
808 906 if (!Permission::userHasFolderWritePermission($this->oFolder)) {
809   - $this->errorRedirectTo("main", _kt("You do not have permission to move a document to this location"), sprintf("fDocumentId=%d&fFolderId=%d", $this->oDocument->getId(), $this->oFolder->getId()));
  907 + $this->errorRedirectToMain(_kt("You do not have permission to move a document to this location"));
810 908 exit(0);
811 909 }
812 910  
... ... @@ -823,19 +921,22 @@ class KTDocumentMoveAction extends KTDocumentAction {
823 921  
824 922 //put the document in the new folder
825 923 $this->oDocument->setFolderID($this->oFolder->getId());
826   - if (!$this->oDocument->update(true)) {
827   - $this->errorRedirectTo("main", _kt("There was a problem updating the document's location in the database"), sprintf("fDocumentId=%d&fFolderId=%d", $this->oDocument->getId(), $this->oFolder->getId()));
  924 + $res = $this->oDocument->update();
  925 + if (PEAR::isError($res) || ($res === false)) {
  926 + $this->errorRedirectToMain(_kt("There was a problem updating the document's location in the database"));
828 927 }
829 928  
830 929  
831 930 //move the document on the file system
832 931 $oStorage =& KTStorageManagerUtil::getSingleton();
833   - if (!$oStorage->moveDocument($this->oDocument, $this->oDocumentFolder, $this->oFolder)) {
834   - $this->oDocument->setFolderID($this->oDocumentFolder->getId());
835   - $this->oDocument->update(true);
836   - $this->errorRedirectTo("move", _kt("There was a problem updating the document's location in the repository storage"), sprintf("fDocumentId=%d&fFolderId=%d", $this->oDocument->getId(), $this->oFolder->getId()));
  932 + $res = $oStorage->moveDocument($this->oDocument, $this->oDocumentFolder, $this->oFolder);
  933 + if (PEAR::isError($res) || ($res === false)) {
  934 + $this->oDocument->setFolderID($oOriginalFolder->getId());
  935 + $this->oDocument->update();
  936 + $this->errorRedirectToMain(_kt("There was a problem updating the document's location in the repository storage"));
837 937 }
838 938  
  939 +
839 940 $sMoveMessage = sprintf("Moved from %s/%s to %s/%s: %s",
840 941 $this->oDocumentFolder->getFullPath(),
841 942 $this->oDocumentFolder->getName(),
... ... @@ -868,7 +969,7 @@ class KTDocumentMoveAction extends KTDocumentAction {
868 969 }
869 970 }
870 971  
871   - controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId());
  972 + redirect(KTBrowseUtil::getUrlForDocument($this->oDocument));
872 973 exit(0);
873 974 }
874 975 }
... ...
templates/ktcore/action/checkin.smarty
  1 +<h2>{i18n arg_docname=$context->oDocument->getName()}Checkin Document: #docname#{/i18n}</h2>
  2 +
1 3 <p class="descriptiveText">{i18n}Checking in a document updates the document
2 4 and allows others to make changes to the document and its metadata.{/i18n}</p>
3 5  
4   -{assign var=iDocumentId value=$context->oDocument->getId()}
5 6 <p class="descriptiveText">{i18n}If you do not
6 7 intend to change the document, or you do not wish to prevent others from
7 8 changing the document, you should rather use the action menu to <strong>cancel this checkout</strong>.{/i18n}</p>
8 9  
9   -<form method="POST" action="{$smarty.server.PHP_SELF}" enctype="multipart/form-data">
10   -<fieldset><legend>{i18n}Checkin{/i18n}</legend>
11   -<input type="hidden" name="action" value="checkin" />
12   -<input type="hidden" name="fDocumentId" value="{$iDocumentId}" />
13   -{foreach from=$checkin_fields item=oWidget }
14   - {$oWidget->render()}
15   -{/foreach}
16   -<div class="form_actions">
17   -<input type="submit" name="submit" value="{i18n}Checkin{/i18n}" />
18   -</div>
19   -</fieldset>
20   -</form>
  10 +{$form->render()}
... ...
templates/ktcore/action/delete.smarty
  1 +<h2>{i18n arg_docname=$context->oDocument->getName()}Delete Document: #docname#{/i18n}</h2>
  2 +
1 3 <p class="descriptiveText">{i18n}Deleting a document marks it as no longer
2 4 being displayed. The document management system does not remove the
3 5 document entirely, and it can be restored at a later stage.{/i18n}</p>
4 6  
5   -{assign var=iDocumentId value=$context->oDocument->getId()}
6   -{capture assign=link}
7   -{"viewDocument"|generateControllerUrl:"fDocumentId=$iDocumentId"}
8   -{/capture}
9   -<p class="descriptiveText">{i18n arg_link=$link}If you do not intend to delete this document, you should
10   -<a href="#link#">cancel the deletion</a>.{/i18n}</p>
11   -
12   -<form method="POST" action="{$smarty.server.PHP_SELF}">
13   -<fieldset><legend>{i18n}Delete{/i18n}</legend>
14   -<input type="hidden" name="action" value="delete" />
15   -<input type="hidden" name="fDocumentId" value="{$iDocumentId}" />
16   -{foreach from=$delete_fields item=oWidget }
17   - {$oWidget->render()}
18   -{/foreach}
19   -<div class="form_actions">
20   -<input type="submit" name="submit" value="{i18n}Delete{/i18n}" />
21   -</div>
22   -</fieldset>
23   -</form>
  7 +{$form->render()}
... ...
templates/ktcore/action/move_final.smarty
1   -<p class="descriptiveText">{i18n}Moving a document relocates the document
2   -within the document repository.{/i18n}</p>
3   -
4   -{assign var=iDocumentId value=$context->oDocument->getId()}
5   -{capture assign=link}
6   -{"viewDocument"|generateControllerUrl:"fDocumentId=$iDocumentId"}
7   -{/capture}
8   -<p class="descriptiveText">{i18n arg_link=$link}If you do not intend to
9   -move this document, you should <a href="#link#">cancel the
10   -move</a>.{/i18n}</p>
  1 +<h2>{i18n arg_docname=$context->oDocument->getName()}Checkin Document: #docname#{/i18n}</h2>
11 2  
12   -<form method="POST" action="{$smarty.server.PHP_SELF}">
13   -<fieldset><legend>{i18n}Move{/i18n}</legend>
14   -<input type="hidden" name="action" value="move_final" />
15   -<input type="hidden" name="fDocumentId" value="{$iDocumentId}" />
16   -<input type="hidden" name="fFolderId" value="{$context->oFolder->getId()}" />
17   -{foreach from=$move_fields item=oWidget }
18   - {$oWidget->render()}
19   -{/foreach}
  3 +<p class="descriptiveText">{i18n}Moving a document relocates the document
  4 +within the DMS.{/i18n}</p>
20 5  
21   -<div class="form_actions">
22   -<input type="submit" name="submit[move]" value="{i18n}Move{/i18n}" />
23   -<input type="submit" name="submit[cancel]" value="{i18n}Cancel{/i18n}" />
24   -</div>
25   -</fieldset>
26   -</form>
  6 +{$form->render()}
... ...