laravel->在选择更改时,请提交给Controller show

时间:2014-04-07 16:22:20

标签: php rest laravel blade

我一定错过了什么。我试图从选择中获取提交,以显示所选项目上的字段。

//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)。

2 个答案:

答案 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可以很容易地抓住它。

使用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将视图上的用户名和电子邮件页面设置为所选用户的值。

由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模型中。如果您希望保留隐藏的列名,也可以从数据库中添加其他列名。