web-dev-qa-db-ja.com

Flagモジュールを使用して、同時編集を防ぐために編集中にコンテンツをロックできますか?

同時編集を防ぐために Flag モジュールを使用する方法を理解しようとしています。私たちの調査では コンテンツロック(同時並行編集) モジュールを見つけましたが、フラグモジュールを既に使用しているため、コンテンツロックにも使用できると考えました。

ユーザー(人物a)が既にコンテンツAを編集していて、別のユーザー(人物b)がコンテンツAを編集しようとしている場合、人物aがコンテンツの編集を完了するまで、人物bはコンテンツAの編集を許可されません。 。

これを行うための正しい組み合わせを見つけるのに苦労しているので、これを行うための最良の方法は何ですか?コンテンツの編集中、コンテンツをロックするフラグが設定され、別のユーザーがコンテンツを編集しようとすると、「ユーザーaは既にコンテンツを編集しています。完了するまでお待ちください」というメッセージが表示されます。 。

Flag モジュールでこれは可能ですか? Rules モジュールも使用する必要がありますか?

3
sf_admin819

以下は、この質問に対処するための2つの可能な解決策(オプション)です(これはD7についてだと思います)...

オプション1:ルールモジュールとフラグモジュールを使用する

はい、このような編集中(EIP)機能は Flag モジュールを使用して実装できますが、機能させるには Rules モジュールも必要です。詳細については、以下をお読みください...

ステップ1:編集中フラグを作成する

グローバル(ユーザー固有ではない)フラグを作成し、それに名前(ラベル)を付けるedit-in-progressフラグ(略して= 'EIP') 。このフラグの目的は次のとおりです。

  • このフラグがノードに対してオンになっている場合は、「誰かがこのノードを編集しているため、このノードの追加の編集セッションを開始できないようにする」ことを意味します。
  • このフラグがノードに対してオンになっていない場合、「許可されたユーザーがノードを編集できるようにノードを使用できる」ことを意味します。

ステップ2:EIPフラグが設定されている場合に編集を禁止するルールを作成する

ノードのEIPフラグがすでに設定されている場合、ノードの編集を禁止するルールを作成します。ノードの編集セッションを開始するリクエストを認識するには、node/xyz/editのようなURLを使用します(ノードのxyz = nidを使用)。

node/12を介したノードへのアクセスを制限し、content/sometitleのようなパスを介したアクセスを許可する方法 」に関する質問への私の回答を参照してください。これは、ここでこのルールに必要です:

  • 同じルールイベント、つまり「Drupalを初期化しています」を使用します(編集セッションの開始を実際に許可する前に、ルールを介してこの編集イベントをキャッチする必要があります)。

  • 正規表現に/editを追加することで、少し正規化します。

  • このノードのEIPフラグがすでにオンになっている(このノードの他の編集セッションがすでに開始されていることを示す)かどうかを確認するために、追加の条件を追加します。

  • ルールアクションを適合させて、(a)適切なメッセージ(他の編集セッションがすでに開始されていること)を発行し、(b)必要に応じて他のパスにユーザーをリダイレクトします(例:node/xzy)。

ステップ3:編集の開始時にEIPフラグを設定するルールを作成する

許可されたユーザーがノードの編集セッションの開始を要求するたびにノードのEIPフラグを設定するルールを作成します。このようなリクエストを認識するには、node/xyz/editのようなURLを使用します(ノードのxyz = nidを使用)。

手順2で述べた私の回答を参照してください。この回答には、このルールに必要なものにかなり近いルールが含まれています。

  • 同じルールイベント、つまり「Drupalを初期化しています」を使用します(編集セッションの開始を実際に許可する前に、ルールを介してこの編集イベントをキャッチする必要があります)。

  • 正規表現に/editを追加することで、少し正規化します。

  • このノードのEIPフラグがオンになっていない(このノードに他の編集セッションが存在しないことを示す)かどうかを確認するために、追加の条件を追加します。

  • EIPフラグを設定するようにルールアクションを適合させます。

ステップ4:編集が終了したときにEIPフラグを解除するルールを作成する

許可されたユーザーがノードの編集セッションの終了を要求するたびに、ノードのEIPフラグの設定を解除するルールを作成します。

このルールの概要は次のとおりです。

  • 「コンテンツの保存後」にルールイベントを使用します。
  • ルールアクションを使用して、EIPフラグの設定を解除します。

ステップ5:ステップ2とステップ3をマージする(オプション)

そうする/考える場合は、Step 2Stepの2つのルールをマージできるはずです。 条件付きルール モジュールを使用して、1つのルールで3。このモジュールの使用方法のサンプルについては、質問への私の回答を参照してください ルールモジュールの使用時にノードが保存されないようにする方法 (ドキュメントが多くないようです)。

オプション2:他のモジュールを使用する

上記の Flag モジュールと Rules モジュールの組み合わせを使用したくない(またはできない)場合は、検討する価値のある代替モジュールがいくつかあります。

それらの一部を以下に示します(引用はプロジェクトページから)。

  • コンテンツのロック(同時並行編集)

    特徴:

    • ブロック同時編集:ユーザーがノードを編集しているとき、同じノードを編集しようとする他のユーザーは編集をブロックされ、通知されますコンテンツは既に編集中です。
    • By node type:このモジュールは、同時編集に対して特定のコンテンツタイプのみをロックするように構成できます。
    • By format:このモジュールは、同時編集に対して特定の入力フォーマットのみをロックするように構成できます。
    • 誤ってコンテンツを失わないようにしてください:ユーザーがコンテンツを編集していて、最初に保存せずに編集フォームを終了しようとした場合(例:ブラウザーウィンドウ/タブを閉じる) 、リンクをクリックするなど)、通知されます。ユーザーがノードを保存せずに終了することを確認すると、編集ロックはajax呼び出しによって自動的に削除されます。この動作は、モジュール設定ページで無効にできます。
    • 忘れられたロックを回避する:ノードのロック解除を忘れた場合、ユーザーに通知されます。ノードのロックを解除するリンクをクリックするように求められます。
    • ビュー統合:ビューを使用して、開いているすべてのロックをリストできます。
  • 競合

    このモジュールを使用すると、フィールドレベルの競合検出とノードの編集中に別のセッションによってフィールドが変更された場合にフィールドが誤って上書きされないようにするトリックを使用して、ノードを並行して編集できます。

    この動作は、複数の人が同時に問題をフォローしている可能性がある問題キューのようなものに役立ちます。このモジュールにつながる元の問題は #1559578:複数のユーザーが同時に問題を更新している場合のD7ソリューション です。

    元のノードのフィールドデータ、私たちが編集したノード、他のユーザーが編集したノードの3者間比較を行うことで機能します。

2
Pierre.Vriens

node_validate 関数を使用して実行できます。

関連する部品コードは次のとおりです。

if (isset($node->nid) && (node_last_changed($node->nid) > $node->changed)) {
    form_set_error('changed', t('The content on this page has either been modified by another user, or you have already submitted modifications using this form. As a result, your changes cannot be saved.'));
  }
2
Adi