【问题标题】:Drupal 7 - How to retrieve Object/ID and use inside Hook Menu?Drupal 7 - 如何检索对象/ID 并在挂钩菜单中使用?
【发布时间】:2020-06-09 19:45:15
【问题描述】:

我正在使用Entity Registration 模块并在其中添加了一个“取消”选项卡

function registration_menu() ...

$items['registration/%registration/view'] = array(
    'title' => 'View',
    'page callback' => 'registration_view',
    'page arguments' => array(1),
    'access callback' => 'entity_access',
    'access arguments' => array('view', 'registration', 1),
    'type' => MENU_DEFAULT_LOCAL_TASK,
  );

$items['registration/%registration/cancel'] = array(
'title' => 'Cancel',
'page callback' => 'registration_view_cancel',
'page arguments' => array(1),
'access callback' => 'entity_access',
'access arguments' => array('view', 'registration', 1),
'type' => MENU_LOCAL_TASK,
);

我想根据注册状态隐藏,方法是将该选项卡放在 if 条件中。

我不知道如何加载当前的“注册”对象(ID 仅在 URL 中)以读取状态。 我认为这与节点类型的工作方式不同,因为这是实体类型“注册”。

如何才能最好地加载该对象以提取“状态”值? 请参阅下面的开发输出

.. (Object) Registration
entityType:protected (String, 12 characters ) registration
entityInfo:protected (Array, 25 elements)
idKey:protected (String, 15 characters ) registration_id
nameKey:protected (String, 15 characters ) registration_id
statusKey:protected (String, 6 characters ) status
defaultLabel:protected (Boolean) FALSE
registration_id (String, 3 characters ) 633
type (String, 9 characters ) classroom
entity_id (String, 4 characters ) 1426
entity_type (String, 4 characters ) node
anon_mail (NULL)
user_uid (String, 4 characters ) 1772
count (String, 1 characters ) 1
author_uid (String, 4 characters ) 1772
state (String, 8 characters ) complete
created (String, 10 characters ) 1591628269
updated (String, 10 characters ) 1591628269

更新 dpm($items);

admin/structure/registration (Array, 6 elements)
registration/%registration (Array, 6 elements)
test/registration2/%registration (Array, 6 elements)
test/registration2/%registration/view (Array, 6 elements)
registration/%registration/view (Array, 6 elements)
registration/%registration/edit (Array, 7 elements)
registration/%registration/delete (Array, 6 elements)
node/%entity_object/register (Array, 7 elements)
node/%entity_object/registrations (Array, 7 elements)
node/%entity_object/registrations/list (Array, 7 elements)
node/%entity_object/registrations/settings (Array, 8 elements)
node/%entity_object/registrations/broadcast (Array, 8 elements)
registration/%registration/devel (Array, 8 elements)
registration/%registration/devel/load (Array, 2 elements)

和注册对象(我所在的页面)

registration/%registration (Array, 6 elements)
title callback (String, 23 characters ) registration_page_title | (Callback) registration_page_title();
title arguments (Array, 1 element)
0 (Integer) 1
page callback (String, 17 characters ) registration_view | (Callback) registration_view();
page arguments (Array, 1 element)
0 (Integer) 1
access callback (String, 13 characters ) entity_access | (Callback) entity_access();
access arguments (Array, 3 elements)
0 (String, 4 characters ) view
1 (String, 12 characters ) registration
2 (Integer) 1

【问题讨论】:

  • 你做了什么?
  • 我在 /registration/633 查看的注册。
  • 谢谢,上面更新了。我花了一天的时间就卡住了。

标签: drupal menu drupal-7 hook


【解决方案1】:

menu_alter 将根据registration_cancel_visibility access callback 中设置的条件修改菜单。在这种情况下,如果回调在 $registration->state 中找到“完成”,它将返回 TRUE 并显示取消按钮,否则将保持隐藏状态。

无需在registration_menu 下添加$items['registration/%registration/cancel']。

您可能希望更改 page callback 以将用户引导至取消页面/表单。

将此添加到您的registration.module:

/**
* Implements hook_menu_alter.
*/
function registration_menu_alter(&$items) {
    $items['registration/%registration/cancel'] = array(
        'title' => 'Cancel',
        'page callback' => 'drupal_get_form',
        'page arguments' => array('registration_form', 1),
        // access callback to a function to check if the menu item should be visible
        'access callback' => 'registration_cancel_visibility',
        'access arguments' => array('update', 1),
        'weight' => 10,
        'type' => MENU_LOCAL_TASK,
    );
}

/**
*
* Check state of registration and apply visibility of cancel functionality accordingly
*/
function registration_cancel_visibility($action, $registration) {
    // ternary operator to return TRUE or FALSE based on the value of $registration->state
    return $registration->state === "complete" ? TRUE : FALSE;
}

【讨论】:

  • 再次感谢,您在这方面帮助我真是太棒了!我付出了努力并将它放在一个自定义模块中,它正在发挥作用。学了很多,看懂了代码。
猜你喜欢
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
相关资源
最近更新 更多