我一定错过了什么。我试图从选择中获取提交,以显示所选项目上的字段。
//the view
{{ Form::open(array('route' => 'user.show', 'name' => "frm_select_client")) }}
{{Form::select('client_id', array('-1' => 'Please select...') + $usersperclient, null, array('class' => 'selectpicker', 'id' => 'client_id', 'name' => 'client_id', "onchange" => "document.frm_select_client.submit();") );}}
{{ Form::close() }}
//routes.php
Route::resource('user', 'UserController');
我正在寻找一种方法将URL user / id(user / 1901)放到UserController :: show()。 我所看到的所有例子都直接来自节目链接:
<a class="btn btn-small btn-success" href="{{ URL::to('user/' . $value->id) }}">Show this user</a>
我知道我可以在javascript中执行此操作,但我希望以最佳方式执行此操作,因为我可能会做很多事情。希望这很清楚。 Thx提前!
编辑: 我一直在寻找一种格式化表单提交的方法来完成资源丰富的格式,在这种情况下(show / {id} for show)。
答案 0 :(得分:4)
您必须使用JavaScript
来触发选择的change
事件,您可以尝试这样做:
var select = document.getElementById('client_id');
select.addEventListener('change', function(){
this.form.submit();
}, false);
这将submit
form
change
事件,您也可以尝试这样做:
var select = document.getElementById('client_id');
select.onchange = function(){
this.form.submit();
};
使用jQuery
,您可以尝试:
$('#client_id').on('change', function(e){
$(this).closest('form').submit();
});
或者使用内联事件处理,您可以尝试这个(在属性的数组中添加它):
"onchange" => "this.form.submit()"
上面的代码会生成如下内容:
<select onchange="this.form.submit()">
要生成url
,您可以使用:
{{ Form::open(array('url' => 'user/' . $user->id, 'name' => "frm_select_client")) }}
此外,您可以使用route
这样的(假设user.show
是网址user/{id}
的路线名称):
{{ Form::open(array('route' => array('user.show', $user->id), 'name' => "frm_select_client")) }}
确保在加载表单时将$user
对象传递给view
,使用类似的内容(基本上来自Controller
):
public function edit($id)
{
$user = User::find($id);
return View::make('userform')->with('user', $user);
}
由于user id
是从select
动态选择的,因此您必须使用JavaScript
将表单action
设置为id
,在这种情况下,您可以尝试以下方法:
// Add this line before you submit the form
this.form.action = 'user/' + this.value;
// Now submit
this.form.submit();
或者使用jQuery
你可以试试这个:
$('#client_id').on('change', function(e){
var select = $(this), form = select.closest('form');
form.attr('action', 'user/' + select.val());
form.submit();
});
在这种情况下,请将表单action
保留为空,请使用url => ''
之类的空白字符串。
答案 1 :(得分:2)
这是一个非常简单的答案,不需要提交表格。
Route::get('select', function()
{
return View::make('select')->with('opts', User::lists('username', 'id'));
});
lists()
功能在选择下拉菜单中设置选项时非常棒。它只是从数据库中为我们创建一个键值数组。
{{ Form::open() }}
{{ Form::select('user', $opts, null, array('id' => 'userid')) }}
{{ Form::close() }}
<span id='username'></span>
<span id='email'></span>
在设置下拉列表时,只需将我们使用lists()
函数创建的数组作为第二个参数传递。还设置了用于设置用户名和电子邮件的地方以获取示例。如果要设置一个,则第三个参数将是默认值,第四个参数将设置元素的属性。你真的只需要这个例子的id,所以jQuery可以很容易地抓住它。
$(document).ready(function() {
$('#userid').on('change', function() {
var data = {
'id': $(this).val()
};
console.log(data);
$.post('{{ route("ajax.user_select") }}', data, function(data, textStatus, xhr) {
/*optional stuff to do after success */
console.log(data);
$('#username').html(data.username);
$('#email').html(data.email);
});
});
});
使用Laravel提供的route()
功能,可以轻松地从javascript中调用您想要的任何路径。唯一的缺点是您必须将其放在刀片模板文件中。我通常会在主模板上为此创建一个scripts
部分。接下来我们将设置该路线。
我们使用Javascript将视图上的用户名和电子邮件页面设置为所选用户的值。
Route::post('select', array('as' => 'ajax.user_select', 'uses' => 'HomeController@getUser'));
这里很简单,它只是说它期待一个帖子,它告诉它在哪里发布帖子。此处的名称与我们在上一步中发送给route()
函数的参数相匹配。
public function getUser()
{
return Response::json(User::find(Input::get('id')));
}
这里没什么难的。只需获取我们想要的用户并将其作为json响应返回。
此方法允许人们查看其他用户的哈希密码。即使是哈希,你可能也不想显示那些信息。要在执行这些操作时隐藏一条信息,您可以将public $hidden = array('password');
添加到User
模型中。如果您希望保留隐藏的列名,也可以从数据库中添加其他列名。