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);
}
Respuestas:
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
.Luego cree 2 archivos
wl_event/plugins/selection
similares a los de la referencia de entidad. El.inc
archivo debe definir la información del complemento ctools, y el.class.php
archivo debe contener su clase de complemento. Lo más probable es que desee subclasificarEntityReference_SelectionHandler_Generic
y 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.fuente