Anular autocompletar entidadreference y devolver salida de fieldfield consulta

7

Estoy tratando de anular un elemento de formulario de autocompletar de referencia de entidad, he logrado anular el formulario y hacer que el argumento pase a una devolución de llamada hook_menu. Sin embargo, estoy luchando para que la devolución de llamada funcione en función de lo que escribo en el cuadro de formulario. Mirando en el módulo de referencia de Entity hay un código en hook_autocomplete_callback que maneja el argumento $ string y busca coincidencias $entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator'], algo así.

¿Alguien puede ayudar?

Mi código:

/**
 * 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);
}
Andrew Welch
fuente
¿Cómo interactúo con la búsqueda y envío nuevo contenido? He revisado el código en el módulo de entidad de referencia, pero no pude hacer que hiciera lo que quería. Mi objetivo es buscar aquellos que están registrados a través del registro de la entidad en el nodo al que está conectado el campo de autocompletar, luego hacer una consulta en otro nodo llamado 'recursos' que han sido creados por cada uno de los usuarios que están registrados. .
Andrew Welch
El código en entityreference que generalmente hace esto es entityreference_autocomplete_callback_get_matches () en drupalcode.org/project/entityreference.git/blob/HEAD:/…
Andrew Welch
por lo que puedo ver (con información recién obtenida en este momento), la devolución de llamada se activa cada vez que un usuario agrega un nuevo carácter a la ruta de autocompletar, por lo que lo que esté en la devolución de llamada debe tomar el valor ingresado y realizar la búsqueda y devolución el json
Andrew Welch

Respuestas:

10

EntityReference utiliza el sistema de complementos ctools para definir manejadores de selección que alimentan las opciones de autocompletar. La definición de interfaz se define en entityreference / plugins / selection / abstract.inc . En ese mismo directorio, verá los dos controladores incluidos, Simple y Vistas. Cada uno de estos está definido por dos archivos, uno para la clase en sí y otro con una matriz para registrar el complemento con ctools.

Para proporcionar su propio controlador de selección, primero dígale a ctools dónde buscar su complemento mediante la implementación hook_ctools_plugin_directory.

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

Luego cree 2 archivos wl_event/plugins/selectionsimilares a los de la referencia de entidad. El .incarchivo debe definir la información del complemento ctools, y el .class.phparchivo debe contener su clase de complemento. Lo más probable es que desee subclasificar EntityReference_SelectionHandler_Genericy simplemente anular los métodos apropiados.

Por último, asegúrese de agregar el archivo con su clase de complemento a la files[]matriz en el archivo de información de sus módulos para que el cargador automático pueda encontrarlo.

zroger
fuente
suena bien para mí. ¿Alguien más quiere comentar / responder antes de dar la recompensa?
Andrew Welch
He creado los archivos y las clases, mi clase extiende la clase original, pero mi clase de complemento nunca se selecciona. ¿Puedes editar tu respuesta y expandir la parte? ¿Debo indicar de alguna manera que mi clase debería preferirse a la original?
Alexei Rayu