私のサイトでは、問い合わせ(ノード)と価格オファー(コメント)があります。したがって、少なくとも1つの価格が提示されている(コメントが送信されている)場合、問い合わせの詳細(ノード)は変更しないでください。それを行う方法はありますか?
これをコーディングすることがオプションの場合は、 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);
}
}
幸運を!
カスタムコードを記述したくない場合は、以下で説明するように、このために Rules および Flag モジュールを使用できます。
Flag モジュールを使用して、「価格オファーあり」などのラベルが付いた(グローバル)フラグを作成します。
Rules を使用して、ルールイベント "After a new comment."でカスタムルールを作成します。
このルールは、ルールアクション「フラグノード」を実行する必要があります(手順1で作成したフラグを使用)。
Rules を使用して、価格オファーがある(=フラグが設定されている)ノードの「編集」を禁止するカスタムルールを作成します。このルールは、- node/12を介したノードへのアクセスを制限し、content/sometitleのようなパスを介したアクセスを許可する方法? =
これらは、このケースでも機能するようにそのルールを変更したものです。
node
を含むパスは、末尾に/edit
を追加することによって拡張する必要があります(編集リンクのURLがこのようになっていると想定しています)。適切なルール条件の追加に問題がある場合(関連するデータセレクターを見つけるため)、「データ比較」条件を追加するときにルールUIに記載されていることが原因である可能性があります。「データセレクターは、ルールで使用できるデータにドリルダウンするのに役立ちます。エンティティーフィールドをデータセレクターに表示するには、「エンティティーがフィールドを持つ」(または「コンテンツのタイプ」)の条件を使用する必要がある場合があります。 」.
備考:これは誰からの編集もブロックします。ノード作成者に対してのみブロックする場合は、(ステップ3で)追加のルール条件を追加して、現在ログオンしているユーザーがノード作成者と一致するかどうかを確認します。これのバリエーションは、選択された一部のロールに対して何らかの方法で編集を許可することです(適切なルール条件を追加して、現在のユーザーのロールを確認することにより)。
ユーザーが編集リンクを編集できない場合は、編集リンクを表示しないようにすることをお勧めします。ユーザーにボタンをクリックしてもらい、そこにいるはずがないことを伝えるのは悪いユーザーエクスペリエンスです。
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');
}
}
}