【问题标题】:laravel-> on select change, submit to Controller showlaravel-> 在选择更改时,提交给 Controller show
【发布时间】:2014-05-20 00:25:30
【问题描述】:

我一定错过了什么。我正在尝试从选择中获取 on submit,以在所选项目上显示字段。

//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 用户/id (user/1901) 放入然后转到 UserController::show() 的方法。 我看到的所有示例都直接来自该节目的链接:

<a class="btn btn-small btn-success" href="{{ URL::to('user/' . $value->id) }}">Show this user</a>

我知道我可以在 javascript 中做到这一点,但我希望以最好的方式做到这一点,因为我可能会经常这样做。希望这很清楚。 提前谢谢!

编辑: 我正在寻找一种方法来格式化表单提交以完成资源丰富的格式,在这种情况下(用户/{id} 用于节目)。

【问题讨论】:

  • 你的问题不清楚。
  • 好的..对此感到抱歉...我能想到的最清晰的重新表述方式:当我更改选择(onchange)时如何安排视图,它提交给 user.show 路线,或使用路由语言:user/(the_id_selected_in_select)
  • 检查答案,如果需要,请告诉我。

标签: php rest laravel blade


【解决方案1】:

您必须使用JavaScript 来触发选择的change 事件,您可以试试这个:

var select = document.getElementById('client_id');
select.addEventListener('change', function(){
    this.form.submit();
}, false);

这将submit form on 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是urluser/{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 来设置actionid 的形式,在这种情况下,您可以尝试以下方法:

// 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 =&gt; '' 之类的空白字符串。

【讨论】:

  • 是的.. 然后我怎样才能将我想要显示的用户传递给控制器​​?由于路线正在等待格式 -user/id- 显示。我可以简单地使用链接而不是表单......这就是我在这里探索的......最好的方法......谢谢你的回答!
  • 再次感谢!问题是我不知道 $user->id 直到它从选择中被选中。这个选定的项目将是我将传递给 usercontroller::show() 的项目。所以,我认为使用表单不是我的好主意。
  • 非常感谢您的回答!这应该可行,而且时间不长。我想知道是否没有 -no-javascript 方式...
  • 不,这需要JS
  • 如果您提供一个submit 按钮供用户在选择用户ID 后单击,您可以不使用JavaScript,在这种情况下,用户必须手动提交表单而且你的服务器端实现也需要改变,因为你必须创建一个静态的url,比如example.com/user/show,你可以使用$userID = Input::get('client_id')访问选定的用户id
【解决方案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 模型中。如果您希望这些列名保持隐藏,您也可以从数据库中添加其他列名。

【讨论】:

    猜你喜欢
    • 2011-12-31
    • 2011-10-31
    • 2014-12-10
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多