Sostituisci il completamento automatico dell'entità entity e restituisce l'output di query field entity


7

Sto provando a sovrascrivere un elemento del modulo di completamento automatico entityreference, sono riuscito a sovrascrivere il modulo e ottenere l'arg passato a un callback hook_menu. Tuttavia, sto lottando per far funzionare il callback in base a ciò che digito nella casella del modulo. Guardando nel modulo di riferimento Entity c'è un po 'di codice in hook_autocomplete_callback che gestisce l'argomento $ string e cerca corrispondenze $entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator']- qualcosa del genere.

Qualcuno può aiutare?

Il mio codice:

/**
 * 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);
}

Come interfaccia con la ricerca e output di nuovi contenuti. Ho controllato il codice nel modulo entità, ma non sono riuscito a farlo fare quello che volevo. Il mio obiettivo è quello di cercare quelli che sono registrati attraverso la registrazione delle entità sul nodo a cui è collegato il campo di completamento automatico, quindi fare una query su un altro nodo chiamato 'risorse' che sono state create da ciascuno degli utenti che sono registrati. .
Andrew Welch,

Il codice in entityreference che di solito fa questo è entityreference_autocomplete_callback_get_matches () in drupalcode.org/project/entityreference.git/blob/HEAD:/…
Andrew Welch

per quanto posso vedere (con alcune informazioni appena acquisite proprio ora), il callback viene attivato ogni volta che un utente aggiunge un nuovo carattere nel percorso del completamento automatico, quindi qualunque cosa sia nel callback dovrebbe prendere il valore inserito e fare la ricerca e tornare il json.
Andrew Welch,

Risposte:


10

EntityReference utilizza il sistema di plugin ctools per definire gestori di selezione che inseriscono le opzioni di completamento automatico. La definizione dell'interfaccia è definita in entityreference / plugins / selection / abstract.inc . Nella stessa directory, vedrai i due gestori inclusi, Simple e Views. Ognuno di questi è definito da due file, uno per la classe stessa e uno con un array per registrare il plugin con ctools.

Per fornire il proprio gestore di selezione, dire innanzitutto a ctools dove cercare il proprio plugin implementando hook_ctools_plugin_directory.

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

Quindi crea 2 file wl_event/plugins/selectionsimili a quelli dell'entitàreference. Il .incfile deve definire le informazioni sul plug-in ctools e il .class.phpfile deve contenere la classe del plug-in. Molto probabilmente ti consigliamo di sottoclassare EntityReference_SelectionHandler_Generice semplicemente sostituire i metodi appropriati.

Infine, assicurati di aggiungere il file con la classe del plug-in files[]all'array nel file di informazioni dei moduli in modo che il caricatore automatico possa trovarlo.


per me va bene. Qualcun altro vuole commentare / rispondere prima di dare la grazia?
Andrew Welch,

Ho creato i file e le classi, la mia classe ha esteso la classe originale, ma la mia classe di plugin non viene mai selezionata. Puoi per favore modificare la tua risposta ed espandere la parte? Dovrei in qualche modo indicare che la mia classe dovrebbe essere preferita a quella originale?
Alexei Rayu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.