Substituir o preenchimento automático da entidade e retornar a saída entityfieldquery

7

Estou tentando substituir um item de formulário de preenchimento automático de entidade, consegui substituir o formulário e obter o argumento passado para um retorno de chamada hook_menu. No entanto, estou lutando para que o retorno de chamada funcione com base no que digito na caixa de formulário. Olhando no módulo de referência de entidade , há algum código no hook_autocomplete_callback que lida com o argumento $ string e procura correspondências $entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator']- algo assim.

Alguém pode ajudar?

Meu 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);
}
Andrew Welch
fonte
Como faço para interagir com a pesquisa e gerar novos conteúdos. Fiz o check-out do código no módulo entityference, mas não consegui fazer o que queria. Meu objetivo é procurar aqueles que estão registrados através do registro de entidade no nó ao qual o campo de preenchimento automático está anexado e, em seguida, fazer uma consulta em outro nó chamado 'recursos' que foram criados por cada um dos usuários registrados. .
Andrew Welch
Código em EntityReference que normalmente faz isso é entityreference_autocomplete_callback_get_matches () in drupalcode.org/project/entityreference.git/blob/HEAD:/...
Andrew Welch
até onde eu posso ver (com algumas informações recém-adquiridas agora), o retorno de chamada é acionado toda vez que um usuário adiciona um novo caractere no caminho de preenchimento automático; portanto, o que estiver no retorno de chamada deve receber o valor digitado e fazer a pesquisa e retornar o json.
Andrew Welch

Respostas:

10

EntityReference usa o sistema de plug-ins ctools para definir manipuladores de seleção que alimentam as opções de preenchimento automático. A definição da interface é definida em entityreference / plugins / selection / abstract.inc . Nesse mesmo diretório, você verá os dois manipuladores incluídos, Simple e Views. Cada um deles é definido por dois arquivos, um para a própria classe e outro com uma matriz para registrar o plug-in no ctools.

Para fornecer seu próprio manipulador de seleção, primeiro diga ao ctools onde procurar seu plug-in implementando hook_ctools_plugin_directory.

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

Em seguida, crie 2 arquivos wl_event/plugins/selectionsemelhantes aos da referência da entidade. O .incarquivo deve definir as informações do plug-in ctools e .class.phpdeve conter sua classe de plug-in. Provavelmente, você desejará subclassificar EntityReference_SelectionHandler_Generice substituir os métodos apropriados.

Por fim, certifique-se de adicionar o arquivo com sua classe de plug-in à files[]matriz no arquivo de informações de módulos para que o carregador automático possa encontrá-lo.

zroger
fonte
parece bom para mim. Alguém mais quer comentar / responder antes de eu dar a recompensa?
Andrew Welch
Eu criei os arquivos e classes, minha classe estendendo a classe original, mas minha classe de plug-in nunca é selecionada. Você pode editar sua resposta e expandir a peça? De alguma forma, devo indicar que minha turma deve ser preferida à turma original?
Alexei Rayu