drupal hook_menu_alter () для добавления вкладок - PullRequest
3 голосов
/ 20 мая 2010

Я хочу добавить несколько вкладок на странице "node /% / edit" из моего модуля под названием "cssswitch". Когда я нажимаю «Перестроить меню», отображаются две новые вкладки, но при редактировании они отображаются для ВСЕХ узлов, а не только для узла «cssswitch». Я хочу, чтобы эти новые вкладки отображались только при редактировании узла типа "cssswitch".

Другая проблема - когда я очищаю весь кэш, вкладки полностью исчезают со всех страниц редактирования. Ниже приведен код, который я написал.

    function cssswitch_menu_alter(&$items) {

        $node = menu_get_object();
        //print_r($node);
        //echo $node->type; //exit();
        if ($node->type == 'cssswitch') {

            $items['node/%/edit/schedulenew'] = array(
                'title' => 'Schedule1',
                'access callback'=>'user_access',
                'access arguments'=>array('view cssswitch'),
                'page callback' => 'cssswitch_schedule',
                'page arguments' => array(1),
                'type' => MENU_LOCAL_TASK,
                'weight'=>4,
            );

            $items['node/%/edit/schedulenew2'] = array(
                'title' => 'Schedule2',
                'access callback'=>'user_access',
                'access arguments'=>array('view cssswitch'),
                'page callback' => 'cssswitch_test2',
                'page arguments' => array(1),
                'type' => MENU_LOCAL_TASK,
                'weight'=>3,
            );  


        }

    }

function cssswitch_test(){
    return 'test';
}

function cssswitch_test2(){
    return 'test2';
}

Спасибо за любую помощь.

1 Ответ

8 голосов
/ 20 мая 2010

hook_menu_alter () вызывается только во время процесса создания меню, поэтому вы не можете выполнять динамические проверки типа узла в этой функции.

Однако, чтобы достичь того, чего вы хотите, вы можете сделать это с помощью обратного вызова с настраиваемым доступом следующим образом:

       // Note, I replaced the '%' in your original code with '%node'. See hook_menu() for details on this.
       $items['node/%node/edit/schedulenew2'] = array(
            ...
            'access callback'=>'cssswitch_schedulenew_access',
            // This passes in the $node object as the argument.
            'access arguments'=>array(1),
            ...
        );  

Затем, в вашем новом обратном вызове пользовательского доступа:

function cssswitch_schedulenew_access($node) {
  // Check that node is the proper type, and that the user has the proper permission.
  return $node->type == 'cssswitch' && user_access('view cssswitch');
}

Для других типов узлов эта функция вернет false, что приведет к запрету доступа и удалению вкладки.

...