我尝试填充要在搜索框中使用的值,以便超级用户可以impersonate other users。但是,我遇到了下面列出的问题,我不确定是否有统一的解决方案,或者至少是否有正确的解决方案。处理它的方法:
?_switch_user=jsmith
(例如)jsmith
)与另一个普通用户之间切换,则会收到错误消息:
您已经切换到" jsmith"用户。
我的搜索表单
<form class="navbar-form navbar-left" role="search">
<div class="form-group">
<input type="search" id="search-names" class="form-control" placeholder="Enter username to switch to">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
脚本:
这是我的基础树枝模板(因为表单位于所有页面的导航栏中)。我实际使用的代码是var searchnames = ["Smith, John",...
,但我会以某种方式传递选择的用户名(例如jsmith
)来重新加载同一页面但?_switch_user=jsmith
作为参数:
<script>
$(function() {
var searchnames = [
"Smith, John" => "jsmith",
"Doe, Jane" => "jdoe1990",
];
$( "#search-names" ).autocomplete({
source: searchnames
});
});
</script>
我的想法是从我的UserRepository传递所有名称/用户名的列表,并用twig填充脚本。除此之外,我不知道从?_switch_user=
答案 0 :(得分:1)
这是PHP中的关联数组:
var searchnames = [
"Smith, John" => "jsmith",
"Doe, Jane" => "jdoe1990",
];
在JavaScript中,您只有normal arrays和objects。对象可用于键/值对。
source option可以获取一系列对象。每个对象都有value
和label
属性。
[
{ "label": "Smith, John", "value": "jsmith" },
{ "label": "Doe, Jane", "value": "jdoe1990" }
]
如果您有一组固定的用户,只需将它们添加到您的JavaScript函数即可。
但是,用户可能来自数据库。您可以在系统中创建所有用户的对象,将它们传递到(Twig)视图并使用json_encode
filter输出它们。然而,这是不好的做法,因为它会增加HTML并增加安全风险。 (o.a.即使您注销,所有用户仍然在浏览器缓存中。)
相反,你可能想要使用AJAX。您可以将source
选项设置为URL,该URL由用户控制器处理。 (见the jQuery UI remote example。)
$("#search-names).autocomplete({
source: "/users/search"
});
搜索操作查询数据库并创建一个数组,该数组包含关联的数组,每个数组都有value
和label
键。比output it as JSON。
最后要在选择选项时加载页面。这可以通过设置window.location
。
$("#search-names").autocomplete({
source: "/users/search",
change: function() {
var username = $(this).val();
if (!username) return;
window.location = window.location + '?_switch_user=' + username;
}
});
代码未经测试,可能需要进行一些修改才能使其真正有效。