【问题标题】:Drupal 6 hook_menu with query string from l()Drupal 6 hook_menu 带有来自 l() 的查询字符串
【发布时间】:2011-12-13 15:20:28
【问题描述】:

[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

我的钩子似乎不起作用。网址中使用的 % 可能有错误。我不知道如何通用地使用它才能正常工作。

【问题讨论】:

  • AFAIK, hook_menu 在其声明中不接受/处理查询参数,因此您需要切换到类似的东西,例如'用户/%/博客/删除'。此外,如果您使用“%”通配符,您通常希望通过“页面参数”条目将它们传递给回调函数 - 请查看链接文档了解详细信息。

标签: drupal drupal-6 hook drupal-hooks


【解决方案1】:

你绝对不想要:

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

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

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

或者,如果您选择将此表单放在“user/%/delete-my-blogs”之类的 URL 中,您可以将该表单设置为用户个人资料页面上的选项卡。 (注意单数用户。您还需要更改 'type'=>MENU_CALLBACK 到 'type' => MENU_NORMAL_ITEM, 让它成为一个标签。

% 是他们的 UID 的占位符,它将通过以下方式传递给回调 '页面参数' => 数组(1),

我还建议将函数名称 delete_all_blogs 更改为 blog_additions_delete_all_blogs(),这样您就不会与模块外的某些命名空间发生冲突。表明这是一个“私有”函数的一种方法是在 name 后面加上下划线。

函数 _blog_additions_delete_all_blogs(){ ...

了解如何构建表单/提交处理程序最好在这样的页面上完成: http://drupal.org/node/751826

【讨论】:

  • +1 - 永远不应该通过简单的 GET 请求进行删除操作。至于确认表单,Drupal 提供了一个帮助 - 请参阅confirm_form()
  • 如果我正在创建一个表单,我应该把它放在哪里?在 blogs_additions_preprocess_user_profileblogs_additions_menublog_additions_delete_all_blogs ??
  • 这是一个很好的例子...api.drupal.org/api/drupal/modules--block--block.admin.inc/… 您可以复制此函数,将其名称更改为与您的模块相对应,使用任何名称,然后将该函数作为您选项卡的回调。 (即相应的 $items 数组中的“页面回调”) Henrik 的链接显示了 confirm_form 本身的文档,该文档将解释这些参数。你可能需要稍微改变一下。
  • 由于我在函数 delete_all_blogs(){} 中使用了 node_delete,看来我们需要明确清除缓存,因为博客仍然显示在视图中(尽管节点已被删除)。 node_delete后如何清除缓存?
  • 最好只是谷歌:drupal clear cache api :-) 这足以让我的答案被接受吗? [-:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多