Переопределить автозаполнение сущности ссылки и вернуть вывод entityfieldquery

7

Я пытаюсь переопределить элемент формы автозаполнения объектной ссылки, мне удалось переопределить форму и передать аргумент в функцию обратного вызова 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);
}
Эндрю Уэлч
источник
Как мне взаимодействовать с поиском и выводить новый контент. Я проверил код в модуле entityference, но не смог заставить его делать то, что хотел. Моя цель состоит в том, чтобы посмотреть, какие из них зарегистрированы посредством регистрации объекта на узле, к которому прикреплено поле автозаполнения, а затем выполнить запрос на другом узле, называемом «ресурсами», который был создан каждым из зарегистрированных пользователей. Спасибо ,
Эндрю Уэлч
Код в entityreference, который обычно делает это, - entityreference_autocomplete_callback_get_matches () в drupalcode.org/project/entityreference.git/blob/HEAD:/…
Эндрю Уэлч,
насколько я вижу (с некоторой недавно полученной информацией), обратный вызов запускается каждый раз, когда пользователь добавляет новый символ в путь автозаполнения, поэтому все, что находится в обратном вызове, должно принимать введенное значение, выполнять поиск и возвращать JSON.
Эндрю Уэлч

Ответы:

10

EntityReference использует систему плагинов ctools для определения обработчиков выбора, которые подаются в опции автозаполнения. Определение интерфейса определено в entityreference / plugins / selection / abstract.inc . В этом же каталоге вы увидите два включенных обработчика, Simple и Views. Каждый из них определяется двумя файлами, один для самого класса и один с массивом для регистрации плагина с помощью ctools.

Чтобы предоставить свой собственный обработчик выбора, сначала скажите ctools, где искать ваш плагин, выполняя его hook_ctools_plugin_directory.

/**
 * Implements hook_ctools_plugin_directory().
 */
function wl_event_ctools_plugin_directory($module, $plugin) {
  if ($module == 'entityreference') {
    return 'plugins/' . $plugin;
  }
}

Затем создайте 2 файла, wl_event/plugins/selectionпохожих на те, что указаны в ссылке на объект. .incФайл должен определить CTools плагина данных, и .class.phpфайл должен содержать ваш класс плагина. Скорее всего, вы захотите создать подкласс EntityReference_SelectionHandler_Genericи просто переопределить соответствующие методы.

Наконец, убедитесь, что вы добавляете файл с вашим классом плагина в files[]массив в вашем информационном файле модулей, чтобы автозагрузчик мог его найти.

zroger
источник
звучит неплохо. Кто-нибудь еще хочет прокомментировать / ответить, прежде чем я получу награду?
Эндрю Уэлч
Я создал файлы и классы, мой класс расширяет исходный класс, но мой класс плагина никогда не выбирается. Можете ли вы отредактировать свой ответ и расширить часть? Должен ли я как-то указать, что мой класс должен быть предпочтительнее исходного?
Алексей Раю