是否可以通过搜索字段使用`switch_user`?

我正在尝试填充要在搜索框中使用的值,以便超级用户可以模拟其他用户 。 但是,我遇到了下面列出的问题,我不确定是否有统一的解决方案或至少是一种“正确”的方法来处理它:

  1. 如何传递搜索字符串以及脚本的用户名值
  2. 如何重新加载当前页面但补充路径?_switch_user=jsmith (例如)
  3. 如果超级用户在模拟一个用户(例如jsmith )和另一个普通用户之间切换,我会收到一个错误:

    您已经切换到“jsmith”用户。

我的搜索表单:

  

剧本:

这是我的基础树枝模板(因为表单在所有页面的导航栏中)。 我实际使用的代码是var searchnames = ["Smith, John",...但是我会以某种方式需要通过选择的用户名(例如jsmith )来重新加载同一页面但是使用?_switch_user=jsmith作为参数:

  $(function() { var searchnames = [ "Smith, John" => "jsmith", "Doe, Jane" => "jdoe1990", ]; $( "#search-names" ).autocomplete({ source: searchnames }); });  

我的想法是从我的UserRepository传递所有名称/用户名的列表,并用twig填充脚本。 除此之外,我不知道从哪里开始传递参数?_switch_user=

这是PHP中的关联数组:

 var searchnames = [ "Smith, John" => "jsmith", "Doe, Jane" => "jdoe1990", ]; 

在JavaScript中,您只有普通的数组和对象 。 对象可用于键/值对。

source选项可以使用一组对象。 每个对象都有一个valuelabel属性。

 [ { "label": "Smith, John", "value": "jsmith" }, { "label": "Doe, Jane", "value": "jdoe1990" } ] 

如果你有一组固定的用户,你可以简单地将它们添加到你的JavaScript函数中就是这样。

但是,用户可能来自数据库。 您可以在系统中创建所有用户的对象,将它们传递到(Twig)视图并使用json_encodefilter输出它们。 然而,这是不好的做法,因为它会增加HTML并增加安全风险。 (oa即使您注销,所有用户仍然在浏览器缓存中。)

相反,你可能想要使用AJAX。 您可以将source选项设置为URL,该URL由用户控制器处理。 (请参阅jQuery UI远程示例 。)

 $("#search-names).autocomplete({ source: "/users/search" }); 

搜索操作查询数据库并创建一个包含关联数组的数组,每个数组都有一个valuelabel键。 然后将其输出为JSON 。

最后,您希望在选择选项时加载页面。 这可以通过设置window.location在JavaScript中完成。

 $("#search-names").autocomplete({ source: "/users/search", change: function() { var username = $(this).val(); if (!username) return; window.location = window.location + '?_switch_user=' + username; } }); 

代码未经测试,可能需要进行一些修改才能使其真正起作用。