web-dev-qa-db-ja.com

ノードの作成を制限するために実装するフックはどれですか?

ユーザーが作成できるノードの数をDrupal 7で制限しようとしています。

「ノードの追加」ページが表示される前に、どのフックを実装する必要がありますか?

6
Citricguy

メニューコールバックのアクセスコールバックを変更します:

function custom_module_menu_alter(&$items){
    $items['node/add/page']['access callback'] = 'my_custom_access_callback';
    // Next line needed for Drupal 7
    unset($items['node/add/page']['access arguments']);
}

カスタムアクセスコールバックとして関数を追加:

function my_custom_access_callback() {
   global $user;
   $allowed_limit = variable_get('allowed_limit', 10);

   // If Drupal 6.
   $node_counts = db_result(db_query("SELECT count(*) FROM {node} WHERE uid = %d;", $user->uid));
   // End If

   // If Drupal 7.
   $node_counts = db_query("SELECT count(*) FROM {node} WHERE uid = :uid", array(':uid' => $user->uid))->fetchField();
   // End If

   if ($node_counts < $allowed_limit && user_access("create page")) {
     return TRUE;
   }
   else{
     drupal_set_message(t('Print message about exceeded limit and/or user permissions.'));
     return FALSE;
   }
}

この種のロジックは、ユーザーが制限を超えることを制限します。

7
Shoaib Nawaz

Node Limit プロジェクトにDrupal 7ポートがAlphaリリースとして追加されました。

Node Limitモジュールを使用すると、管理者は、役割またはユーザーが作成できる特定のタイプのノードの数を制限できます。たとえば、サイトに「広告」を作成できる「広告主」の役割がある場合ノードの場合、ノード制限管理者は、その役割のすべてのユーザーを特定のノード数に制限できます。また、ユーザーごとにユーザーを制限することもできます。

近い将来、ルールのサポートも含める予定です。ドキュメンテーションは、いくつかの作業を使用することができますが、モジュールをざっと見れば、おそらく必要なことを達成するでしょう。

4
MauiTechSpot

ここでは、フックノードの検証がより適切な場合があります。 http://api.drupal.org/api/drupal/modules--node--node.api.php/function/hook_node_validate/7

このように、サービスを使用する場合、ソリューションは機能しますが、Shoaibによって提案されたソリューションは、ユーザーが実際のノード作成ページにアクセスした場合にのみ機能します。リモートクライアントがサービスを介してnode.saveを呼び出す場合、メニューアクセスハックは失敗します。

2
giorgio79

価値があるのは、メニューを変更してデフォルトのノードアクセスコールバックを削除する必要がないことです。

Drupalは hook_node_access この目的で使用します:

例えば:

/**
 * Implements hook_node_access
 */
function MY_MODULE_node_access($node, $op, $account) {
  // Get node type, can be string or node object
  $type = is_string($node) ? $node : $node->type;
  if ($type == 'type_of_interest') {
    // Check node create limit
    if ($op == 'create') {
      // Check if some condition, limit check, is true
      // omitted for brevity
      // ...
      if($limit_reached){
        return NODE_ACCESS_DENY;
      }    
    }
  }
  return NODE_ACCESS_IGNORE;
}
1
David Thomas