Drupal:将函数名作为页面参数传递

Drupal:将函数名作为页面参数传递,drupal,menu,module,hook,Drupal,Menu,Module,Hook,我有一个简单的模块: function cabinet_menu() { $items['cabinet'] = array( 'title' => 'cabinet', 'title callback' => 'cabinet_title', //'title arguments' => array(1), 'page arguments' => array('cabinet_mysettings'), 'page callbac

我有一个简单的模块:

function cabinet_menu() {
$items['cabinet'] = array(
    'title' => 'cabinet',
    'title callback' => 'cabinet_title',
    //'title arguments' => array(1),
    'page arguments' => array('cabinet_mysettings'),
    'page callback' => 'cabinet_page',
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM,
);

return $items;
}
我想向“页面参数”传递一个名为“cabinet_mysettings”的函数

function cabinet_mysettings() {
debug('call settings');
global $user;

$cabinet = user_load($user->uid);
return $cabinet;
}

function cabinet_page($cabinet) {
debug($cabinet);
}
在“CAB_页面”中,调试仅显示字符串“CAB_mysettings”

为什么菜单钩子不理解页面参数不是函数名而是一个sting

UPD:开发模块挂钩菜单:

  $items['devel/reinstall'] = array(
'title' => 'Reinstall modules',
'page callback' => 'drupal_get_form',
'page arguments' => array('devel_reinstall'),
'description' => 'Run hook_uninstall() and then hook_install() for a given module.',
'access arguments' => array('access devel information'),
'file' => 'devel.pages.inc',
'menu_name' => 'devel',
))

我认为“重新安装”是一种功能


有人知道这样的回调是如何工作的吗?

页面参数不是为了在幕后做些什么而设计的。通过将参数放入url,可以使用它们将参数传递给页面回调

在页面参数中像您那样放置字符串('page arguments'=>array('cabinet_mysettings'))会导致只传递该字符串。这是没有办法的。有关更全面的说明,请参阅

因此,在你的情况下,我会考虑这样的事情:

function cabinet_menu() {
  $items['cabinet/%'] = array(
    'title' => 'cabinet',
    'title callback' => 'cabinet_title',
    'page arguments' => array(1),
    'page callback' => 'cabinet_page',
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM,
  );

  return $items;
}

function cabinet_mysettings() {
  debug('call settings');
  global $user;

  $cabinet = user_load($user->uid);
  return $cabinet;
}

function cabinet_page($my_param_name) {
  $cabinet = cabinet_mysettings($my_param_name);
  debug($cabinet);
}

这有帮助吗?

m1n0,我很清楚。但我想在“文件柜标题”和“文件柜页面”功能中共享模块生成的数据。URL中不会有wildchar。我想要在“cabinet\u title”和“cabinet\u page”之前调用的函数。它必须生成模块数据。我应该在每个函数中调用“cabinet_mysettings”还是有正确的方法?是,在你需要数据的每个函数中调用“CabiNeTyMySt设置”是可能的解决方案…但是你也可以考虑拥有一个静态对象来存储数据…甚至会话变量…这取决于你的具体情况是什么,但您不应该多次调用该函数,以防它执行一些广泛的处理或从数据库加载数据。我最喜欢的选项是静态对象,这是一个非常优雅的解决方案,但它并不完全是“drupal方式”,“在每个函数中调用“cabinet_mysettings”既不是“drupal方式”,也不是“任何其他好方式”。即使它存储静态数据。最好的方法是使用“run()”方法创建对象,其中所有数据都在其中,但它根本不是drupal:-)谢谢您的回答,m1n0。