Чтобы заставить ссылку, программно созданную, выполняться ajax'ом достаточно навешать на неё класс 'use-ajax', но в hook_menu() это сделать невозможно потому, что:
An array of options to be passed to l() when generating a link from this menu item. Note that the
optionsparameter has no effect on MENU_LOCAL_TASK, MENU_DEFAULT_LOCAL_TASK, and MENU_LOCAL_ACTION items.
Предположим у нас есть ссылка:
<?php
function my_module_menu(){
$items['node/%node/execute-something'] = array(
'title' => 'My new action',
'description' => 'This action will be something perform',
'type' => MENU_LOCAL_ACTION,
'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
'page callback' => 'my_module_action_ajax_callback',
'page arguments' => array(1),
'delivery callback' => 'ajax_deliver',
/**
* This need add class 'use-ajax', but Drupal not allow it
*/
);
}
Просто добавляем класс:
<?php
/**
* Implements hook_menu_local_tasks_alter().
*/
function my_module_menu_local_tasks_alter(&$data, $router_item, $root_path) {
/**
* Мы должны добавить класс "use-ajax" а action-ссылку здесь
* потому, что hook_menu не позволяет нам сделать это там.
*
* @see "options" param on https://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_menu/7
*/
if (isset($data['actions']['output']) && is_array($data['actions']['output'])) {
foreach ($data['actions']['output'] as &$item) {
if ($item['#link']['path'] == 'node/%node/execute-something') {
$item['#link']['options'] = $item['#link']['localized_options'] = array(
'attributes' => array(
'class' => array('use-ajax'),
),
);
}
}
}
}