Я пытаюсь переопределить элемент формы автозаполнения объектной ссылки, мне удалось переопределить форму и передать аргумент в функцию обратного вызова hook_menu. Однако я пытаюсь заставить работать обратный вызов, основываясь на том, что я печатаю в поле формы. В справочном модуле Entity есть некоторый код в hook_autocomplete_callback, который обрабатывает аргумент $ string и ищет совпадения $entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator']
- что-то в этом роде.
Кто-нибудь может помочь?
Мой код:
/**
* Implements hook_form_FORM_ID_alter().
*/
function wl_event_form_event_node_form_alter(&$form, &$form_state, $form_id) {
dpm($form);
// We will get our term id argument from the from build itself.
$node_id = $form['#node']->nid;
// This is the path we will create in hook_menu().
$new_path = "wl_event/autocomplete/{$node_id}";
// Maximum number of descrete values (deltas) that are present.
$max_delta = $form['field_wl_event_acquired_resource']['und']['#max_delta'];
// Hijack the autocomplete callback for each of our values.
for($x=0; $x <= $max_delta; $x++) {
$form['field_wl_event_acquired_resource']['und'][$x]['target_id']['#autocomplete_path']= $new_path;
}
}
/**
* Implements hook_menu().
*/
// can be used to do a lookup on a menu path to return json
// probably entity reference autocomplete does a similar thing
//we want to get all of the resources of the user profiles of
//users who are registered on the event
//
function wl_event_menu() {
$items = array();
$items['wl_event/autocomplete/%'] = array(
'title' => t('project call back'),
'page callback' => 'wl_event_autocomplete_callback',
'page arguments' => array(2),
'access callback' => TRUE,
'type' => MENU_CALLBACK
);
return $items;
}
function wl_event_autocomplete_callback($arg1, $string = '') {
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'resource');
// ->propertyCondition('nid', '1')
$results = $query->execute();
print_r(drupal_json_output($results));
return drupal_json_output($results);
}
Ответы:
EntityReference использует систему плагинов ctools для определения обработчиков выбора, которые подаются в опции автозаполнения. Определение интерфейса определено в entityreference / plugins / selection / abstract.inc . В этом же каталоге вы увидите два включенных обработчика, Simple и Views. Каждый из них определяется двумя файлами, один для самого класса и один с массивом для регистрации плагина с помощью ctools.
Чтобы предоставить свой собственный обработчик выбора, сначала скажите ctools, где искать ваш плагин, выполняя его
hook_ctools_plugin_directory
.Затем создайте 2 файла,
wl_event/plugins/selection
похожих на те, что указаны в ссылке на объект..inc
Файл должен определить CTools плагина данных, и.class.php
файл должен содержать ваш класс плагина. Скорее всего, вы захотите создать подклассEntityReference_SelectionHandler_Generic
и просто переопределить соответствующие методы.Наконец, убедитесь, что вы добавляете файл с вашим классом плагина в
files[]
массив в вашем информационном файле модулей, чтобы автозагрузчик мог его найти.источник