Drupal 6 hook_menu,带有来自l()的查询字符串

时间:2011-12-13 15:20:29

标签: drupal drupal-6 hook drupal-hooks

[Drupal 6] 我的预处理功能是

function blogs_additions_preprocess_user_profile(&$variables) {
    global $user;

    $op = '';
    $op .= l(t('Delete All My Blogs'),$_GET["q"],array('query' => 'delete=myBlogs'));

    $variables['profile'] = array('content_profile' => $op);
    $variables['user_profile'] = implode($variables['profile']);
}

我的hook_menu是

function blogs_additions_menu(){

    $items= array();

    $items['users/%?delete=myBlogs'] = array(
        'page callback' => 'delete_all_blogs',
        'access arguments' => array('access blogs additions'),
        'type' => MENU_CALLBACK,
    );
    return $items;
}

和我的delete_all_blogs()

function delete_all_blogs(){
    global $user;
    $sql = "SELECT nid FROM node node WHERE node.uid='".$user->uid."'AND node.type='blog'";
    $result = db_query($sql);
    while ($row = db_fetch_object($result)) {
        //print $sql;
        node_delete($row->nid);
    }
    drupal_set_message('test', 'test');
}

我的用户可以像这样查看他们的个人资料 www.mysite.com/users/barack-obama

我的钩子似乎不起作用。可能是网址中使用%的错误。我不知道如何使用它通用,以便它可以工作。

1 个答案:

答案 0 :(得分:3)

你绝对不想要:

$items['users/%?delete=myBlogs']

相反,您可能需要一个生成确认表单的回调。 [...发出文字“你确定要删除所有博客吗?”然后把实际删除所有博客的位放在表单的提交处理程序中。这种方法最终让您有机会检查他们是否有任何博客。 ]

如果这是你的设计,那个发出回调的表单可以检查在该回调中设置的delete = myBlogs变量。

或者如果您选择将此表单放在“user /%/ delete-my-blogs”这样的网址上,您可以将该表单作为用户个人资料页面上的标签。 (注意单一用户。你还需要改变     'type'=> MENU_CALLBACK为'type'=> MENU_NORMAL_ITEM,  把它变成一个标签。

%是他们的UID的占位符,它将通过传递给回调     'page arguments'=>阵列(1),

我还建议将函数名称delete_all_blogs更改为blog_additions_delete_all_blogs(),这样就不会与模块外的某些命名空间发生冲突。指示这是“私有”功能的一种方法是使用下划线继续名称。

function _blog_additions_delete_all_blogs(){...

了解如何构建表单/ submit-handler最好在这样的页面上完成: http://drupal.org/node/751826