entityreferenceオートコンプリートをオーバーライドし、entityfieldqueryの出力を返す


7

entityreferenceオートコンプリートフォームアイテムをオーバーライドしようとしています。フォームをオーバーライドして、hook_menuコールバックに引数を渡すことができました。ただし、フォームボックスに入力した内容に基づいてコールバックを機能させるのに苦労しています。Entity参照モジュールを見ると、hook_autocomplete_callbackに$ string引数を処理して一致を検索するコードがあります$entity_labels = $handler->getReferencableEntities($tag_last, $instance['widget']['settings']['match_operator']

誰でも手伝ってくれる?

私のコード:

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

ルックアップとインターフェイスして新しいコンテンツを出力するにはどうすればよいですか。entityferenceモジュールのコードをチェックアウトしましたが、思い通りに実行できませんでした。私の目的は、オートコンプリートフィールドがアタッチされているノードでエンティティ登録によって登録されているものを検索し、登録されている各ユーザーによって作成された「リソース」と呼ばれる別のノードでクエリを実行することです。ありがとう。
Andrew Welch

通常、これはentityreference_autocomplete_callback_get_matchesでないことのEntityReferenceでのコード()内drupalcode.org/project/entityreference.git/blob/HEAD:/...
アンドリュー・ウェルチ

私が見る限り(今すぐにいくつかの新しい情報を取得)、ユーザーがautcompleteパスに新しい文字を追加するたびにコールバックが起動されるため、コールバック内のすべてのものが入力された値を取得し、ルックアップを実行して戻ります。 json。
Andrew Welch

回答:


10

EntityReferenceは、ctoolsプラグインシステムを使用して、オートコンプリートオプションにフィードする選択ハンドラを定義します。インターフェース定義は、entityreference / plugins / selection / abstract.incで定義されています。同じディレクトリに、含まれている2つのハンドラーSimpleとViewsが表示されます。これらはそれぞれ2つのファイルで定義されます。1つはクラス自体用で、もう1つはプラグインをctoolsに登録するための配列です。

独自の選択ハンドラーを提供するには、最初にを実装してプラグインを探す場所をctoolsに伝えますhook_ctools_plugin_directory

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

次にwl_event/plugins/selection、entityreferenceのファイルと同様の2つのファイルを作成します。.incファイルには、情報をプラグインctoolsを定義する必要があり、.class.phpファイルがプラグインクラスが含まれている必要があります。ほとんどの場合、サブクラスEntityReference_SelectionHandler_Genericを作成し、適切なメソッドをオーバーライドするだけです。

最後に、files[]オートローダーが見つけられるように、プラグインクラスを含むファイルをモジュール情報ファイルの配列に必ず追加してください。


私にはいいですね。賞金を差し上げる前に他の誰かがコメント/回答したいですか?
Andrew Welch

ファイルとクラスを作成しました。私のクラスは元のクラスを拡張していますが、プラグインクラスが選択されません。回答を編集してパートを拡張していただけませんか?私のクラスを元のクラスよりも優先する必要があることをどうにかして示す必要がありますか?
Alexei Rayu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.