[development] hook_user('categories')

Jakob Petsovits jpetso at gmx.at
Wed Apr 29 06:14:15 UTC 2009


On Wednesday 29 April 2009, David Cohen wrote:
> Can someone point me to general doc, or an example of how to emulate the
> following logic in D6.  The logic is basically to show the user an edit
> category only if they have permission to change their own settings.
>
>   if ($op == 'categories') {
>     if (user_access('edit own extended permissions') &&
>         $user->uid == $account->uid) {
>       // build the data structure
>     }
>   }

First up, hook_user($op='categories') is one giant hack, and results in 
nothing else than inserting a couple of menu items. In Drupal 6 it adapted to 
the new menu system, which means you don't return categories depending on 
dynamic permission tests. Instead, use access callbacks to check for 
permissions. Something like this worked for me (another hack, so to say):

function versioncontrol_user($type, &$edit, &$user, $category = NULL) {
  switch ($type) {
    case 'categories':
      $categories = array();
      $categories[] = array(
        'name' => 'versioncontrol',
        // user_menu() pipes 'title' though check_plain() already.
        'title' => 'Repository accounts',
        'weight' => 99,
      );
      return $categories;
  }
}

function versioncontrol_menu() {
  (...)
  $items['user/%versioncontrol_user_accounts/edit/versioncontrol'] = array(
    'title callback' => 'versioncontrol_user_accounts_title_callback',
    'title arguments' => array(1),
    'page callback' => 'versioncontrol_account_page',
    'page arguments' => array(1),
    'access callback' => 'versioncontrol_private_account_access',
    'access arguments' => array(1),
    'file' => 'versioncontrol.pages.inc',
    'weight' => 99,
    'type' => MENU_LOCAL_TASK,
  );
  (...)
}

Somehow, these two are getting merged in the end. (I guess they aren't
really getting merged but my item is preferred so it works. Probably 
hook_menu_alter() is a cleaner solution and would result in a genuinely merged 
item.) I'd prefer to skip hook_user() altogether, but that results in bugs 
with tab display.

If someone has a proper solution for this common piece of functionality,
I'm all ears.

Cheers,
  Jakob



More information about the development mailing list