1

一見単純な質問への回答を探すためにDrupalコミュニティページを何時間も精査しても、これまでのところ結果が得られていないので、助けていただければ幸いです。

カスタムフォームでFAPIを使用して、タイプ'nodereference_autocomplete'の入力要素を実装する方法を誰かが説明できますか?初心者の場合、これはAJAXで装飾されたテキストフィールドであり、CCKモジュールによって提供される一致する参照ノードのフィールドでオートコンプリートされます。この機能を自分のDrupal6モジュールで活用したいと思います。

送信される値は、参照されるノードのnidである必要があります。さらに、タイプ「article」および「blogpost」のノードのみを含むようにオートコンプリートパスを制約するための手順をいただければ幸いです。

この最も基本的な質問にご協力いただきありがとうございます。

4

1 に答える 1

5

CCKを直接使用していないため、CCKの動作をエミュレートするカスタムモジュールに少しコードを記述する必要があると思います。FAPIのオートコンプリート機能を使用できます。

form_alterまたはフォーム定義コードは次のようになります。

$form['item'] = array(   
  '#title' => t('My autocomplete'),
  '#type' => 'textfield',   
  '#autocomplete_path' => 'custom_node/autocomplete'  
); 

ノードタイプで制限する必要があるため、おそらく独自のオートコンプリートコールバックも作成する必要があります。これは次のようになります。

function custom_node_autocomplete_menu() {
  $items = array();
  $items['custom_node/autocomplete'] = array(
      'title' => '',
      'page callback' => 'custom_node_autocomplete_callback',
      'access arguments' => array('access content'),
      'type' => MENU_CALLBACK,
    );
  return $items;
}

function custom_node_autocomplete_callback($string = '') {
  $matches = array();
  if ($string) {
    $result = db_query_range("SELECT title, nid FROM {node} WHERE type IN('article', 'blogpost') AND LOWER(title) LIKE LOWER('%s%%')", $string, 0, 5);
    while ($data = db_fetch_object($result)) {
      $matches[$data->title] = check_plain($data->title) . " [nid:" . $data->nid . "]";
    }
  }
  print drupal_to_js($matches);
  drupal_exit();
}

次に、送信された値からノードIDを抽出するコードを記述する必要があります。これを行うためにCCKが使用するコードは次のとおりです。

preg_match('/^(?:\s*|(.*) )?\[\s*nid\s*:\s*(\d+)\s*\]$/', $value, $matches);
if (!empty($matches)) {
  // Explicit [nid:n].
  list(, $title, $nid) = $matches;
  if (!empty($title) && ($n = node_load($nid)) && trim($title) != trim($n->title)) {
    form_error($element[$field_key], t('%name: title mismatch. Please check your selection.', array('%name' => t($field['widget']['label']))));
  }
}
else {
  // No explicit nid.
  $reference = _nodereference_potential_references($field, $value, 'equals', NULL, 1);
  if (empty($reference)) {
    form_error($element[$field_key], t('%name: found no valid post with that title.', array('%name' => t($field['widget']['label']))));
  }
  else {
    // TODO:
    // the best thing would be to present the user with an additional form,
    // allowing the user to choose between valid candidates with the same title
    // ATM, we pick the first matching candidate...
    $nid = key($reference);
  }
}
于 2012-10-25T22:49:16.193 に答える