Ich versuche, ein Formularelement für die automatische Vervollständigung von Entitätsreferenzen zu überschreiben. Es ist mir gelungen, das Formular zu überschreiben und das Argument an einen hook_menu-Rückruf zu übergeben. Ich habe jedoch Probleme damit, den Rückruf basierend auf der Eingabe in das Formularfeld zum Laufen zu bringen. Im Entity-Referenzmodul befindet sich im hook_autocomplete_callback Code, der das Argument $ string verarbeitet und Übereinstimmungen nachschlägt $entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator']
- so ähnlich.
Kann jemand helfen?
Mein Code:
/**
* 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);
}
Antworten:
EntityReference verwendet das ctools-Plugin-System, um Auswahlhandler zu definieren, die in die Optionen für die automatische Vervollständigung einfließen. Die Schnittstellendefinition ist in entityreference / plugins / selection / abstract.inc definiert . In demselben Verzeichnis sehen Sie die beiden enthaltenen Handler Simple und Views. Jede dieser Dateien wird durch zwei Dateien definiert, eine für die Klasse selbst und eine mit einem Array zum Registrieren des Plugins bei ctools.
Um Ihren eigenen Auswahlhandler bereitzustellen, teilen Sie ctools zunächst mit, wo Sie nach Ihrem Plugin suchen sollen, indem Sie es implementieren
hook_ctools_plugin_directory
.Erstellen Sie dann 2 Dateien
wl_event/plugins/selection
ähnlich wie in der Entitätsreferenz. Die.inc
Datei sollte die ctools-Plugin-Informationen definieren und die.class.php
Datei sollte Ihre Plugin-Klasse enthalten. Höchstwahrscheinlich möchten Sie eine Unterklasse erstellenEntityReference_SelectionHandler_Generic
und nur die entsprechenden Methoden überschreiben.Stellen Sie schließlich sicher, dass Sie die Datei mit Ihrer Plugin-Klasse zum
files[]
Array in Ihrer Modul-Info-Datei hinzufügen , damit der Autoloader sie finden kann.quelle