いいね!数

0

閲覧数
911

競合文書を避けるために、文書のロックをかける仕組みをつくりました。

①編集ボタンをクリックすると以下のコードで文書のロックをかける

var doc:NotesDocument = currentDocument.getDocument();
    // ロックする
    doc.lock( session.getEffectiveUserName(), true );

 

②保存ボタンかキャンセルボタンをクリックすると、ロックが解除される。

 

上記の仕組みだと、編集ボタンをクリックした後に、そのままブラウザの閉じるボタンを

クリックしてページを閉じてしまうと、文書がロックされたままになってしまいます。

そこで、ブラウザの閉じるボタンをクリックしたときに、以下のような仕組みをつけ

加えたいのですが、やり方がわかりません。

●文書が編集モードの場合はロックを解除してからブラウザを閉じる

 

以下のページを参考にしてみたのですが、動作しません。

http://www-10.lotus.com/ldd/xpagesforum.nsf/xpTopicThread.xsp?documentId=267579C7CF1EDC6D85257877002345BE&SessionID=CU3IDH9KSS

 

使用しているブラウザはgoogle chromになります。

ブラウザの閉じるボタンをイベントにしたコードは実現できるでしょうか?

できるならやり方を教えて頂けないでしょうか?

 

サーバー情報: | クライアント情報: | 
カテゴリ:アプリ開発 - XPages | タグ:
  | 質問日時:2016/10/24 14:51:39

回答・コメント

いいね!数

1

ブラウザを閉じたり「戻る」を押されたことを検出する方法は私も興味あるのですが、なかなか回答が付きませんね。

ブラウザの操作をうまく取れなかった時の保険として、以下の方法もありますよ、ということで。

XPagesの文書ロックライブラリ」で紹介してる方法です。

原理は単純です。

  • 編集を始めるときに「ロック文書」を作成。ロック文書には元の文書を特定するID、編集者氏名、ロック期限を設定しておく
  • 編集を始める時には編集を書ける文書のロック文書が残っているかチェック。なければ編集権限を確保し、新たにロック文書を作成すればいい。
  • ロック文書が存在してたとしても、編集者が自分か、ロック期限を過ぎていたら編集権限を奪取していい
  • 編集が終わったときには、ロック文書の名前と期限を削除しておく(ロック文書を削除してもいい)

200人程度が利用する小規模なシステムなら結構実用になると思います。

まぁ参考までに。

/Yac

回答日時:2016/10/26 7:18:10

いいね!数

0

yac4423さん、

ご回答をありがとうございます。

なるほど、そのような仕組みを作ってユーザーさんがロックを解除できるようにするのも

いいですね。最終的にはそのような仕組みにするかもしれません。

もう少し、質問を解放してその他のヒントがないかを待ってみます。

回答日時:2016/10/27 11:10:05

いいね!数

0

「ブラウザを閉じる」されたときに文書ロック用の文書を削除(編集)する仕組みを使っています。

yac4423さんに書いていただいた、文書ロック用の文書を作成して制御する方式を採用しています。

ただし、ポップアップブロックされてしまうと動作しないので制限付きであります。

1つの案として参考程度にご覧ください。

R5のときに実装したものでXPagesでなくても実装可能です。

 

以下のような仕組みになります。

①排他制御したい画面のCSJSで以下のコードを書きます。

function onStartEdit(){
    if (location.href.indexOf('editDocument') != -1){
    	window.open('/xxxxx.nsf/editCtrlForm?OpenForm&DUID='+ 文書UNID +'&Agent=Start','SubWindow','width=300,height=30,status=no,toolbar=no,menubar=no,location=no,resizable=no,scrollbars=0,left=350,top=300');
    }
}
function onFinishEdit(){
    window.open('/xxxxx.nsf/editCtrlForm?OpenForm&DUID='+ 文書UNID +'&Agent=End','SubWindow','width=300,height=30,status=no,toolbar=no,menubar=no,location=no,resizable=no,scrollbars=0,left=350,top=300');
}

window.onload = onStartEdit;
window.onbeforeunload = onFinishEdit;

ブラウザの画面をeditDocumentでloadしたときと、閉じたときのイベントを取得しています。

イベントが発生すると、フォームをポップアップで開きます。

フォームには、文書のUNIDと、Start or Endのパラメータを渡しています。Startは編集開始(ロック)で、Endは編集終了(ロック解除)です。

 

②①で開かれたフォームには、ボタンでStartEditボタンと、EndEditボタンがついています。

 フォームは、onLoadイベントで、以下のようなJavaScript(CSJS)を実行するようになっています。

var f = document.forms[0];
if(f.LoadFG.value == ''){
	f.LoadFG.value = '1';
	//Agent select
	var tmp = f.Query_String.value.substr(f.Query_String.value.lastIndexOf('Agent=')+6);
	if(tmp == 'Start'){
		f.StartEdit.click();
	}else{
		f.EndEdit.click();
	}
}

 

 

StartEditボタンには、編集開始のLSエージェント、EndEditボタンには、編集終了のLSエージェントが実行されるようになっています。

LSエージェント実行時には、フォームにQueryStringで渡された対象の文書のUNIDを渡してあげて、

ロック用文書を特定して、ロック状態にしたり、解除したりします。

StartEditボタン:@Command([ToolsRunMacro]; "LSAgt_StartEdit")

EndEditボタン:@Command([ToolsRunMacro]; "LSAgt_EndEdit")

 

XPagesで作ったアプリでも、同じ方法で排他制御しています。

Dominoについている文書ロックの機構だとロックした本人以外はロック解除できませんが、

この方法であれば、ロック用文書の編集権限があれば解除可能なので重宝しています。

 

XPagesとの組み合わせで、改善できて、もっと良い方法があるかもしれません。

回答日時:2016/11/10 10:29:55

いいね!数

0

onodaさん、

有用な情報をありがとうございます。

ユーザーにロックとロック解除のボタンで制御してもらうということですね。

ただ、ポップアップブロックをしているユーザーが多いので実現は難しいかも

しれないです。ひとつの解決法として検討してみたいと思います。

 

回答日時:2016/11/15 10:25:33

いいね!数

0

ブラウザが閉じられたときのイベントは、CSJSの、window.onbeforeunload で取得できそうで、

私のサンプルでは、このイベントきっかけで、LSエージェントを実行するためにFormをポップアップしています。

もしかしたら、Formをポップアップしなくても、window.onbeforeunloadから、CSJS→SSJSのプログラムを呼び出すことができれば、

ポップアップなしでロック用文書の制御ができるかもしれませんね。

ちなみに、ユーザーが、意識的にロック、ロック解除するのは、サンプルの機構がうまく動作しなかった場合でも、手動で制御するという意味合いになります。

 

回答日時:2016/11/15 11:13:05

いいね!数

0

onotaさん、

「ブラウザが閉じられたときのイベントは、CSJSの、window.onbeforeunload で取得できそう」というのは

大変うれしい情報です。今、時間がないのですぐには試してみれないのですが、時間ができたときにonotaさんの

方法をサンプルで試してみたいと思います。

試したらまたコメント致します。

取り急ぎ、御礼まで。

回答日時:2016/11/15 14:45:54

いいね!数

0

yac4423さんの方法で文書ロックを試しました。このやり方で行こうかと考えています。

ただ、onotaさんのやっているようにwindow.onbeforeunloadでブラウザを閉じるイベントを取得して、

ssjsの書いてあるボタンをクリックして・・・とやってみたのですが、うまく動作しませんでした。

    <xp:eventHandler event="onbeforeunload" submit="false">
        <xp:this.script><![CDATA[document.getElementById(ボタンのID).click();]></xp:this.script>
    </xp:eventHandler>

ssjsの書いてあるボタンでは、編集を始めるときに作成した「ロック文書」を削除するコードを

書いたのですが、ボタン自体クリックされているのかされていないのかもよくわかりませんでした。

もしかしたら、onotaさんから頂いたコードをXpagesに移す書き方がいけないのでしょうか?

ブラウザを閉じるイベントを取得するのはあきらめて、文書上にユーザーが押せるロック解除の

ボタンを用意するかもしれません。

 

回答日時:2016/11/22 17:26:25

いいね!数

0

①ブラウザのウィンドウを閉じる→②編集制御用フォームをポップアップで開く→③編集制御用フォームからLSエージェント実行

までの処理について私の環境でサンプル作ってみました。以下が設計要素の詳細になります。

①XPagesでブラウザのウィンドウを閉じる

以下のXPagesのコードになります。

便宜上、編集制御を行いたい文書のUNIDとか、DBのパスとかは、viewScopeでセットしていますが、実際に処理するシステムで変えていただければ結構です。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:this.beforePageLoad><![CDATA[#{javascript:viewScope.docUNID = "12345678ABCDEF";
viewScope.dbPath = @ReplaceSubstring(database.getFilePath(),"\\","/");
}]]></xp:this.beforePageLoad>
    <xp:scriptBlock id="scriptBlock1">
        <xp:this.value><![CDATA[function onStartEdit(){
    
}
function onEndEdit(){
    window.open('/'+XSP.getElementById("#{id:dbPath}").value+'/editCtrlForm?OpenForm&docUNID='+ XSP.getElementById("#{id:docUNID}").value +'&Agent=endEdit','SubWindow','width=300,height=100,status=no,toolbar=no,menubar=no,location=no,resizable=no,scrollbars=0,left=350,top=300');
}
window.onload = onStartEdit;
window.onbeforeunload = onEndEdit;
]]></xp:this.value>
    </xp:scriptBlock>
    <xp:br></xp:br>
    <xp:inputText id="docUNID" value="#{viewScope.docUNID}"></xp:inputText><xp:br></xp:br>
    <xp:inputText id="dbPath" value="#{viewScope.dbPath}"></xp:inputText></xp:view>


 

②編集制御用フォームはコード出力できなかったので画面イメージでご容赦ください。

フォームのonLoadで、EndEditボタンをclickしています。

EndEditボタンでは、LotusScriptのエージェントを実行しています。

 

③編集制御用フォームからLSエージェント実行

文書ロック用の文書の制御はここで実施するようにします。

以下のサンプルでは、受け渡されたQueryStringから処理対象の文書のUNIDを得られることが、サーバーログで確認できます。

[12B8:007D-1694] 2016/11/24 17:27:21   HTTP Server: Agent message: 編集終了しました。 Query_String = OpenForm&docUNID=12345678ABCDEF&Agent=endEdit

ポップアップしたeditCtrlFormフォームを自動的に閉じるため、LSエージェントの最後に、print文で、window.close()を出力します。

endEditAgent

Sub Initialize

	Dim ss As NotesSession
	Dim paradoc As NotesDocument
	
	Set ss = New NotesSession
	Set paradoc = ss.DocumentContext

	'編集制御した文書のUNID
	MsgBox("編集終了しました。 Query_String = "+paradoc.Query_String(0))

	'編集制御用ポップアップWindowを閉じる
	Print "<SCRIPT LANGUAGE=JavaScript>"
	Print "<!--"
	Print "window.close();"
	Print "//-->"
	Print "</SCRIPT>"

End Sub
回答日時:2016/11/24 17:50:35