Remplacer la saisie automatique de référence d'entité et renvoyer la sortie de requête de champ d'entité

7

J'essaie de remplacer un élément de formulaire de saisie semi-automatique entityreference, j'ai réussi à remplacer le formulaire et à faire passer l'argument à un rappel hook_menu. Cependant, j'ai du mal à faire fonctionner le rappel en fonction de ce que je tape dans la zone de formulaire. En regardant dans le module de référence d'entité, il y a du code dans le hook_autocomplete_callback qui gère l'argument $ string et recherche les correspondances $entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator']- quelque chose comme ça.

Quelqu'un peut-il aider?

Mon 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
la source
Comment puis-je interfacer avec la recherche et sortir du nouveau contenu. J'ai vérifié le code dans le module entityference, mais je n'ai pas pu le faire faire ce que je voulais. Mon objectif est de rechercher ceux qui sont enregistrés via l'enregistrement d'entité sur le nœud auquel le champ de saisie semi-automatique est attaché, puis de faire une requête sur un autre nœud appelé `` ressources '' qui a été créé par chacun des utilisateurs enregistrés. .
Andrew Welch
Le code dans entityreference qui fait généralement cela est entityreference_autocomplete_callback_get_matches () dans drupalcode.org/project/entityreference.git/blob/HEAD:/…
Andrew Welch
pour autant que je puisse voir (avec quelques informations nouvellement acquises tout à l'heure), le rappel est déclenché chaque fois qu'un utilisateur ajoute un nouveau caractère dans le chemin de complétion automatique, donc tout ce qui est dans le rappel doit prendre la valeur entrée et faire la recherche et le retour le json.
Andrew Welch

Réponses:

10

EntityReference utilise le système de plugins ctools pour définir des gestionnaires de sélection qui alimentent les options de saisie semi-automatique. La définition de l'interface est définie dans entityreference / plugins / selection / abstract.inc . Dans ce même répertoire, vous verrez les deux gestionnaires inclus, Simple et Views. Chacun d'eux est défini par deux fichiers, un pour la classe elle-même et un avec un tableau pour enregistrer le plugin avec ctools.

Pour fournir votre propre gestionnaire de sélection, dites d'abord à ctools où chercher votre plugin en l'implémentant hook_ctools_plugin_directory.

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

Créez ensuite 2 fichiers wl_event/plugins/selectionsimilaires à ceux de la référence d'entité. Le .incfichier doit définir les informations du plugin ctools et le .class.phpfichier doit contenir votre classe de plugin. Vous voudrez probablement sous EntityReference_SelectionHandler_Generic- classer et simplement remplacer les méthodes appropriées.

Enfin, assurez-vous d'ajouter le fichier avec votre classe de plug-in au files[]tableau dans le fichier d'informations de vos modules afin que l'autochargeur puisse le trouver.

zroger
la source
sonne bien pour moi. Quelqu'un d'autre veut-il commenter / répondre avant de donner la prime?
Andrew Welch
J'ai créé les fichiers et les classes, ma classe étendant la classe d'origine, mais ma classe de plugin n'est jamais sélectionnée. Pouvez-vous modifier votre réponse et développer la partie? Dois-je en quelque sorte indiquer que ma classe devrait être préférée à celle d'origine?
Alexei Rayu