Mengganti entitasreference autocomplete dan mengembalikan outputquerifieldquery

7

Saya mencoba untuk menimpa item formulir autocomplete entitasreference, saya telah berhasil menimpa formulir, dan mendapatkan arg diteruskan ke panggilan balik hook_menu. Namun, saya kesulitan mendapatkan panggilan balik untuk bekerja berdasarkan apa yang saya ketik di kotak formulir. Mencari di modul referensi Entitas ada beberapa kode di hook_autocomplete_callback yang menangani argumen $ string dan mencari kecocokan $entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator']- sesuatu seperti itu.

Adakah yang bisa membantu?

Kode saya:

/**
 * 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
sumber
Bagaimana saya berinteraksi dengan pencarian dan menampilkan konten baru. Saya telah memeriksa kode dalam modul entitasference, tetapi saya tidak dapat melakukan apa yang saya inginkan. Tujuan saya adalah untuk mencari orang-orang yang terdaftar melalui pendaftaran entitas pada node tempat bidang autocomplete dilampirkan, lalu lakukan kueri pada node lain yang disebut 'sumber daya' yang telah dibuat oleh masing-masing pengguna yang terdaftar. Terima kasih .
Andrew Welch
Kode dalam entitasreference yang biasanya melakukan ini adalah entityreference_autocomplete_callback_get_matches () di drupalcode.org/project/entityreference.git/blob/HEAD:/…
Andrew Welch
sejauh yang saya bisa lihat (dengan beberapa informasi yang baru didapat sekarang), callback dipecat setiap kali pengguna menambahkan karakter baru ke jalur autcomplete, jadi apa pun yang ada dalam callback harus mengambil nilai yang dimasukkan dan melakukan pencarian dan kembali json.
Andrew Welch

Jawaban:

10

EntityReference menggunakan sistem plugin ctools untuk mendefinisikan handler pemilihan yang mengumpan ke dalam opsi autocomplete. Definisi antarmuka didefinisikan dalam entitasreference / plugins / selection / abstract.inc . Dalam direktori yang sama, Anda akan melihat dua penangan yang disertakan, Sederhana dan Tampilan. Masing-masing didefinisikan oleh dua file, satu untuk kelas itu sendiri, dan satu dengan array untuk mendaftarkan plugin dengan ctools.

Untuk memberikan handler pilihan Anda sendiri, pertama-tama beri tahu ctools tempat mencari plugin Anda dengan mengimplementasikan hook_ctools_plugin_directory.

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

Kemudian buat 2 file yang wl_event/plugins/selectionmirip dengan yang ada di referensi entitas. The .incfile harus mendefinisikan ctools Plugin info, dan .class.phpfile yang harus berisi kelas plugin anda. Kemungkinan besar Anda ingin subkelas EntityReference_SelectionHandler_Genericdan mengganti metode yang tepat.

Terakhir, pastikan Anda menambahkan file dengan kelas plugin Anda ke files[]array di file info modul Anda sehingga autoloader dapat menemukannya.

zroger
sumber
Terdengar bagus untukku. Adakah yang ingin berkomentar / menjawab sebelum saya memberikan hadiah?
Andrew Welch
Saya telah membuat file dan kelas, kelas saya memperluas kelas asli, tetapi kelas plugin saya tidak pernah dipilih. Bisakah Anda mengedit jawaban Anda dan memperluas bagian itu? Haruskah saya menunjukkan bahwa kelas saya seharusnya lebih disukai daripada yang asli?
Alexei Rayu