如何通过在文本框中键入非唯一项来唯一标识记录。例如,使用自动完成,我键入学生姓名,它会提示任何三个姓名,现在我应该如何确保哪一个是正确的。我在数据库表中有学生id,但我想让它对用户更友好,所以我不想在前端使用id。
Drupal通过将id附加到值来解决这个问题,使其看起来像:James Kirk[10]然后通过提取最后一个[]对的内容来解析该值。但很明显,这不是你想做的。它很脏,对用户来说不好看。
我通过使用jquery自动完成控件解决了这个问题,该控件具有一个存储id的隐藏表单项和一个存储用户可读值的可见表单项。
完整控制html与jquery ui
<div class="form-item type-autocomplete_ajax name-employer">
<label for="employer"> Employer </label>
<input type="autocomplete_ajax" name="employer-label" maxlength="60" size="30" value="EAS" class="ui-autocomplete-input" autocomplete="off">
<input type="hidden" name="employer" value="14">
<div class="description">Begin typing to see your options. You may add your own value if the desired value is not available</div>
<script>
$('.name-employer input[name="employer-label"]').autocomplete({source: function( request, response )
{
var form_id = "patient_info_form";
var form_item = "employer";
$.ajax({
url: "/ajax/options?term=" + request.term,
dataType:"json"
})
.done(function(list)
{
$(".ui-autocomplete-loading").removeClass("ui-autocomplete-loading");
response(list);
})
.fail(function()
{
$(".ui-autocomplete-loading").removeClass("ui-autocomplete-loading");
list = [{"label": "No results found", "value": 0, "id": 0}];
response(list);
})
},select: function (event, ui)
{
if (ui.item.id != 0)
{
$('.name-employer input[name="employer-label"]').val(ui.item.label);
$('.name-employer input[name="employer"]').val(ui.item.value);
}
return false;
}, focus: function (event, ui) {
if (event.keyCode == null)
{
return false;
}
$('.name-employer input[name="employer-label"]').val(ui.item.label);
return false;
}});$('.name-employer input[name="employer-label"]').focusout(function() {
if ($(this).val() == "")
{
$('.name-employer input[name="employer"]').val("");
}
}); </script>
</div>
注意两个输入。第一个是jquery ui构建的自动操作删除。xecond只是一个隐藏的输入,它存储用户不需要看到的"key"唯一id值。
然后在提交时忽略自动完成值,只检查隐藏值。