カスタムオートコンプリート関数を作成しました。オートコンプリートフィールドには、コンテンツプロファイルのユーザー名と姓が入力されます。
同じ名前と姓を持つユーザーがほとんどいない可能性があります。コンテンツタイプIDをDrupalオートコンプリートに渡し、このIDを非表示のフォームフィールドに追加して、より正確にすることができます。
コンテンツタイプIDをオートコンプリートフィールドに直接入れたくないので、現在の実装へのコールバックが必要です。
@googletorpアドバイスのおかげで、解決策はとても簡単です。他の人と共有したいと思います。私が必要なのは、2つのDrupalオートコンプリートオブジェクト関数を上書きすることだけです:検出して選択しました。
私のオートコンプリートはコンテンツプロファイルフィールドで機能します。選択したプロファイルのnidをJSに渡します:
PHP:
function messagi_autocomplete($string) {
global $user;
$cache = cache_get('messagi_auto_complete_'.$string);
$items = array();
if ($cache) {
$items = $cache->data;
} else {
$sql = "
SELECT
n.nid AS id
FROM
node as n
WHERE
n.type = 'profile'
AND
u.status = 0
";
$result = db_query($sql);
$disabled = array();
while($obj = db_fetch_object($result)) {
$disabled[] = $obj->id;
}
$items = array();
$sql = "
SELECT
profile.nid AS nid,
profile.field_profile_name_value AS name,
profile.field_profile_surname_value AS surname
FROM
content_type_profile AS profile
WHERE
lower(profile.field_profile_name_value) LIKE lower('%s%%')
OR lower(profile.field_profile_surname_value) LIKE lower('%s%%')
LIMIT 10
";
$result = db_query($sql, $string, $string);
$sql = NULL;
while($obj = db_fetch_object($result)) {
if (! in_array($obj->nid, $disabled)) {
$key = check_plain($obj->name).' '.check_plain($obj->surname);
$items['nids'][$key] = (int) $obj->nid;
$items[$key] = $key.', '.check_plain($obj->venue);
}
}
if (! empty($items)) {
cache_set('messagi_auto_complete_'.$string, $items, 'cache', 1000);
}
$disabled = NULL;
}
print drupal_to_js($items);
exit();
}
JS:
$(document).ready(function() { if
(Drupal.jsEnabled) {
Drupal.jsAC.prototype.found = function (matches) {
if (!this.input.value.length) {
return false;
}
var ul = document.createElement('ul');
var ac = this;
for (key in matches) {
var li = document.createElement('li');
//to avoid of showing nids object in the select list
if (key !== 'nids') {
$(li)
.html('<div>'+ matches[key] +'</div>')
.mousedown(function () {
ac.select(this); })
.mouseover(function () {
ac.highlight(this); })
.mouseout(function () { ac.unhighlight(this); });
li.autocompleteValue = key;
$(ul).append(li);
} else {
//add all nids to prototype
Drupal.jsAC.prototype.nids = matches[key];
}
}
//rest of the code
}
};
Drupal.jsAC.prototype.select = function (node) {
//get selected value nid and put it on form hidden field
$('#edit-nid').val(Drupal.jsAC.prototype.nids[node.autocompleteValue]);
this.input.value = node.autocompleteValue;
};
} })
これが将来誰かを助けることを願っています。このコードに対する他のアドバイスをありがとう。
デフォルトのDrupalオートコンプリートを使用する場合は、オートコンプリートにIDを追加してから、追加のカスタムJSを使用してIDを非表示フィールドに移動することをお勧めします。
他の解決策は、Drupalによって作成されたプロトタイプ関数を上書きし、そこで追加の処理を追加することです。