覆盖实体引用自动完成并返回entityfieldquery输出


7

我试图覆盖一个实体引用自动完成表单项,我设法覆盖了表单,并将arg传递给了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模块中的代码,但是我无法按照我想要的去做。我的目的是查找那些通过自动注册字段附加到的节点上的实体注册进行注册的注册,然后在由每个注册用户创建的名为``资源''的另一个节点上进行查询。 。
安德鲁·韦尔奇

实体引用中通常执行此操作的代码是drupalcode.org/project/entityreference.git/blob/HEAD中的entityreference_autocomplete_callback_get_matches():/
Andrew Welch

据我所知(现在有一些新获得的信息),每次用户将一个新字符添加到自动完成路径时都会触发回调,因此回调中的任何内容都应采用输入的值并进行查找并返回json。
安德鲁·韦尔奇

Answers:


10

EntityReference使用ctools插件系统定义选择处理程序,这些选择处理程序将馈入自动完成选项。接口定义在entityreference / plugins / selection / abstract.inc中定义。在同一目录中,您将看到其中包含的两个处理程序:简单和视图。这些文件中的每一个都由两个文件定义,一个文件用于类本身,另一个文件用于通过数组向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这些文件与entityreference中的文件类似。该.inc文件应定义ctools插件信息,并且.class.php文件应包含您的插件类。您很可能希望继承EntityReference_SelectionHandler_Generic并只重写适当的方法。

最后,请确保将带有插件类的文件添加到files[]模块信息文件中的数组中,以便自动加载器可以找到它。


听起来不错。在给予赏金之前,有人要发表评论/回答吗?
Andrew Welch

我已经创建了文件和类,我的类扩展了原始类,但是从未选择我的插件类。您能编辑答案并扩展部分吗?我是否应该以某种方式表明我的班级比原来的班级更受青睐?
Alexei Rayu '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.