3

「cssswitch」というモジュールの「node/%/edit」ページにいくつかのタブを追加したいと思います。「メニューの再構築」をクリックすると、2つの新しいタブが表示されますが、編集時に、ノード「cssswitch」だけでなく、すべてのノードに対して表示されます。これらの新しいタブは、「cssswitch」タイプのノードを編集するときにのみ表示されるようにします。

もう1つの問題は、すべてのキャッシュをクリアすると、タブがすべての編集ページから完全に消えてしまうことです。以下は私が書いたコードです。

    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';
}

助けてくれてありがとう。

4

1 に答える 1

8

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 を返すため、アクセスが拒否され、タブが削除されます。

于 2010-05-20T19:05:10.993 に答える