Drupal 6で許可をオーバーライドする

Drupal Commonsを構築するための1つの問題を解決する方法を共有したいと思います。 ToRの要件に従って、特定のルールに従ってノードへのユーザーアクセスを制限する必要がありました。





すぐにhook_node_grants



hook_node_access_records



を介してこれを実装しようとしましたが、解決策は面倒で、バグが多く、くだらないものであるという結論に達しました。



そして彼は反対に行きました。



メニューレジストリを思い出してください。 要素の説明を含む配列には、 access callback



access arguments



2つのパラメーターが含まれていaccess arguments



。 それらを再定義してみましょうが、インストールされたaccess callback



access arguments



最後の要素として保存してaccess arguments







 // MYMODULE_menu_alter        function MYMODULE_menu_alter(&$items) { foreach ($items as &$item) { if (!isset($item['access arguments'])) { $item['access arguments'] = array(); } if (isset($item['access callback'])) { //  callback,    . $item['access arguments'][] = $item['access callback']; } else { // callback  ,   , Drupal 6 //  user_access() if (!empty($item['access arguments'])) { $item['access arguments'][] = 'user_access'; } else { //     -  -   $item['access arguments'][] = TRUE; } } //  callback $item['access callback'] = 'MYMODULE_access_callback'; } }
      
      







修正してくれた匿名に感謝します。



モジュールをインストールするときに、その重量を非常に大きく設定することに注意してください(つまり、私のモジュールは最後に実行され、誰もメニューを再定義しません)。 別の状況がある場合は、パラメーターを配列に追加することをお勧めします。例えば:
 $item['default access callback'] = $item['access callback'];
      
      





ただし、この場合、後の変更は考慮されません。 つまり モジュールの重量を大きく設定することをお勧めします。



コールバック自体:



 function MYMODULE_access_callback() { $args = func_get_args(); //  ,     TRUE, FALSE     //  ,    if (count($args) == 1) { if (is_bool($args[0])) { return $args[0]; } return $args[0](); } // callback -    $callback = $args[count($args) - 1]; $callback_args = array_slice($args, 0, count($args) - 1); //   : if (is_object($args[1]) && isset($args[1]->nid)) { //     //  ,        if (!call_user_func_array($callback, $callback_args)) { return FALSE; } // 3-  - ,    //.. node_access($op, $node, $account = NULL) if (is_object($args[2])) { $account = $args[2]; } else { global $user; $account = $user; } //   : if ($condition && some_rights()) { return TRUE; } else { return FALSE; } } //   if (!function_exists($callback)) { $dump = print_r($callback_args, TRUE); $msg = ' <b>Access callback  !</b><br /> Callback: "%callback"<br /> Callback arguments:<hr> <pre> %args </pre> '; $vars = array( '%callback' => $callback, '%args' => $callback_args ); watchdog('php', $msg, $vars, WATCHDOG_ERROR); return TRUE; } //    return call_user_func_array($callback, $callback_args); }
      
      







私にとっては、それは機能し、十分に快適であるように見えました。おそらく他の誰かに役立つでしょう。



All Articles