web-dev-qa-db-ja.com

ノードのコメントがそのノードに送信された場合、ノードの作成者がノードのコンテンツを変更できないようにするにはどうすればよいですか?

私のサイトでは、問い合わせ(ノード)と価格オファー(コメント)があります。したがって、少なくとも1つの価格が提示されている(コメントが送信されている)場合、問い合わせの詳細(ノード)は変更しないでください。それを行う方法はありますか?

2
Timur Kutuev

これをコーディングすることがオプションの場合は、 hook_node_prepare 。最初の行で述べたように:

追加/編集フォームに表示されるノードオブジェクトを操作します。

これを行うコードスニペットのアイデア:

function SOME_MODULE_node_prepare($node) {
  if (isset($node->nid) && $node->type == 'YOUR_CONTENT_TYPE' && $node->comment_count> 0) {
    drupal_set_message('You cannot alter this node anymore', 'warning');
    drupal_goto('node/' . $node->nid);
  }
}

幸運を!

3

カスタムコードを記述したくない場合は、以下で説明するように、このために Rules および Flag モジュールを使用できます。

手順1:コメントでノードにフラグを設定する

Flag モジュールを使用して、「価格オファーあり」などのラベルが付いた(グローバル)フラグを作成します。

ステップ2:コメント送信を登録する

Rules を使用して、ルールイベント "After a new comment."でカスタムルールを作成します。

このルールは、ルールアクション「フラグノード」を実行する必要があります(手順1で作成したフラグを使用)。

ステップ3:価格オファーがあるノードの編集を禁止する

Rules を使用して、価格オファーがある(=フラグが設定されている)ノードの「編集」を禁止するカスタムルールを作成します。このルールは、- node/12を介したノードへのアクセスを制限し、content/sometitleのようなパスを介したアクセスを許可する方法? =

これらは、このケースでも機能するようにそのルールを変更したものです。

  • nodeを含むパスは、末尾に/editを追加することによって拡張する必要があります(編集リンクのURLがこのようになっていると想定しています)。
  • ルール条件を追加して、ノードにフラグが付いているかどうかを確認します(ステップ1のフラグを使用)。
  • ルールアクションの「メッセージ」を何かに変更して、すでに価格オファーがあるため編集が許可されていないことを示します。
  • 独自の要件に合わせてルールアクションを変更します。これに関する詳細が記載された「ヘルプページ」へのリダイレクトを発行します。

適切なルール条件の追加に問題がある場合(関連するデータセレクターを見つけるため)、「データ比較」条件を追加するときにルールUIに記載されていることが原因である可能性があります。「データセレクターは、ルールで使用できるデータにドリルダウンするのに役立ちます。エンティティーフィールドをデータセレクターに表示するには、「エンティティーがフィールドを持つ」(または「コンテンツのタイプ」)の条件を使用する必要がある場合があります。 」.

備考:これは誰からの編集もブロックします。ノード作成者に対してのみブロックする場合は、(ステップ3で)追加の​​ルール条件を追加して、現在ログオンしているユーザーがノード作成者と一致するかどうかを確認します。これのバリエーションは、選択された一部のロールに対して何らかの方法で編集を許可することです(適切なルール条件を追加して、現在のユーザーのロールを確認することにより)。

1
Pierre.Vriens

ユーザーが編集リンクを編集できない場合は、編集リンクを表示しないようにすることをお勧めします。ユーザーにボタンをクリックしてもらい、そこにいるはずがないことを伝えるのは悪いユーザーエクスペリエンスです。

Drupalには、使用できる優れたコンテンツ制御システムがあります。これにはコーディングが含まれますが(20行未満)、ここでの他の回答よりも結果が良くなると思います。

カスタムモジュールを作成する (小さなモジュール)を実行する必要があります。 mymodule.infoファイルの作成については、そのチュートリアルをお読みください。

また、mymodule.moduleファイルを作成して実装 hook_node_access

function mymodule_node_access($node, $op, $account) {
  // If this user is the node author and he wants to edit a node?
  if ($account->uid == $node->uid && $op == 'update') {
    // Get comment count
    $comment_count = db_query('SELECT COUNT(cid) AS count FROM {comment} WHERE nid = :nid', array(':nid' => $node->nid))->fetchField();
    // If there is 1 comment or more
    if ($comment_count > 0) {
      // Deny the user access (and hide the edit link).
      return NODE_ACCESS_DENY;
    }
  }
  return NODE_ACCESS_IGNORE;
}

このファイルに入力する必要があるのはそれだけです。これにより、管理者やその他の特権ユーザーは引き続きノードを編集できます(ブロックする場合は、$account->uid == $node->uid &&部分を削除します)。

したがって、必要なのは2つのファイルと1つのフォルダーだけです。これは、ユーザーが編集できるという印象をユーザーに与え、編集できないことをユーザーに伝えるよりもユーザーフレンドリーであると私は考えています。

オプションの追加として、表示中にユーザーがノードを編集できないというメッセージを表示することができます。これをモジュールファイルに追加します。

function mymodule_node_view($node, $view_mode, $langcode) {
  // Fetch the current user.
  global $user;

  // Compare
  if ($user->uid == $node->uid) {
    // Get comment count
    $comment_count = db_query('SELECT COUNT(cid) AS count FROM {comment} WHERE nid = :nid', array(':nid' => $node->nid))->fetchField();
    // If there is 1 comment or more
    if ($comment_count > 0) {
      // Show the message
      drupal_set_message(t('This enquiry has received at least one price offer an can no longer be edited.'), 'warning');
    }
  }
}
0
Neograph734