Überschreiben Sie die automatische Vervollständigung der Entitätsreferenz und geben Sie die Ausgabe der Entitätsfeldabfrage zurück

7

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);
}
Andrew Welch
quelle
Wie kann ich mit der Suche kommunizieren und neue Inhalte ausgeben? Ich habe den Code im Entityference-Modul ausgecheckt, aber ich konnte ihn nicht dazu bringen, das zu tun, was ich wollte. Mein Ziel ist es, nachzuschlagen, welche durch Entitätsregistrierung auf dem Knoten registriert sind, an den das Feld für die automatische Vervollständigung angehängt ist, und dann eine Abfrage auf einem anderen Knoten namens "Ressourcen" durchzuführen, die von jedem der registrierten Benutzer erstellt wurden. Danke .
Andrew Welch
Code in entityreference, der dies normalerweise tut, ist entityreference_autocomplete_callback_get_matches () in drupalcode.org/project/entityreference.git/blob/HEAD:/…
Andrew Welch,
Soweit ich sehen kann (mit einigen neu gewonnenen Informationen), wird der Rückruf jedes Mal ausgelöst, wenn ein Benutzer ein neues Zeichen in den Pfad für die automatische Vervollständigung einfügt. Was auch immer im Rückruf enthalten ist, sollte den eingegebenen Wert annehmen und die Suche durchführen und zurückkehren der json.
Andrew Welch

Antworten:

10

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.

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

Erstellen Sie dann 2 Dateien wl_event/plugins/selectionähnlich wie in der Entitätsreferenz. Die .incDatei sollte die ctools-Plugin-Informationen definieren und die .class.phpDatei sollte Ihre Plugin-Klasse enthalten. Höchstwahrscheinlich möchten Sie eine Unterklasse erstellen EntityReference_SelectionHandler_Genericund 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.

zroger
quelle
klingt gut für mich. Möchte noch jemand einen Kommentar abgeben / antworten, bevor ich das Kopfgeld gebe?
Andrew Welch
Ich habe die Dateien und Klassen erstellt, wobei meine Klasse die ursprüngliche Klasse erweitert, aber meine Plugin-Klasse wird nie ausgewählt. Können Sie bitte Ihre Antwort bearbeiten und das Teil erweitern? Sollte ich irgendwie angeben, dass meine Klasse der ursprünglichen vorgezogen werden sollte?
Alexei Rayu