ユーザーが作成できるノードの数をDrupal 7で制限しようとしています。
「ノードの追加」ページが表示される前に、どのフックを実装する必要がありますか?
メニューコールバックのアクセスコールバックを変更します:
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;
}
}
この種のロジックは、ユーザーが制限を超えることを制限します。
Node Limit プロジェクトにDrupal 7ポートがAlphaリリースとして追加されました。
Node Limitモジュールを使用すると、管理者は、役割またはユーザーが作成できる特定のタイプのノードの数を制限できます。たとえば、サイトに「広告」を作成できる「広告主」の役割がある場合ノードの場合、ノード制限管理者は、その役割のすべてのユーザーを特定のノード数に制限できます。また、ユーザーごとにユーザーを制限することもできます。
近い将来、ルールのサポートも含める予定です。ドキュメンテーションは、いくつかの作業を使用することができますが、モジュールをざっと見れば、おそらく必要なことを達成するでしょう。
ここでは、フックノードの検証がより適切な場合があります。 http://api.drupal.org/api/drupal/modules--node--node.api.php/function/hook_node_validate/7
このように、サービスを使用する場合、ソリューションは機能しますが、Shoaibによって提案されたソリューションは、ユーザーが実際のノード作成ページにアクセスした場合にのみ機能します。リモートクライアントがサービスを介してnode.saveを呼び出す場合、メニューアクセスハックは失敗します。
価値があるのは、メニューを変更してデフォルトのノードアクセスコールバックを削除する必要がないことです。
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;
}