【问题标题】:How to show the step2 div when the user click in "go to step 2"?当用户单击“转到第 2 步”时如何显示第 2 步 div?
【发布时间】:2018-09-30 08:43:39
【问题描述】:

我有一个使用引导程序和 jQuery 的多步骤表单。多步骤表单是供用户购买产品的。有 4 个步骤: - 步骤 1 是用户输入他的信息(姓名、电子邮件等) - 步骤 2 用户选择付款方式 - 步骤 3 用户介绍付款数据 - 步骤 4 为用户出示发票。

当用户点击“转到第 2 步”时,网址更改为“store.test/product/5/a-5/payment/paymentMethods”,用户仍然在同一个支付页面,但如何从第 2 步更改多步表格中的1到2步?

step1 html是这样的:

<div class="tab-pane fade show active clearfix" id="step1" role="tabpanel" aria-labelledby="home-tab">
    <h6>User Info</h6>
    <form method="post" action="{{route('products.storeUserInfo', ['id' => $id, 'slug' => $slug])}}">
         {{csrf_field()}}
        <div class="form-group font-size-sm">
            <label for="name" class="text-gray">Name</label>
            <input type="text" required class="form-control"  value="{{ (\Auth::check()) ? Auth::user()->name : old('name')}}">
        </div>
        <!-- other form fields -->
        <input type="submit" href="#step2"
                class="btn btn-primary btn float-right next-step" value="Go to step 2"/>
    </form>
</div>

在 paymentcontroller 我有 storeUserInfo 来收集 step1 中引入的用户数据并重定向到同一页面(我的疑问是如何重定向到同一页面但显示 step2 div):

public function storeUserInfo(Request $request, $id, $slug = null){
        //dd($request);
        $request->validate([
            'name' => 'required|max:255|string',
            'surname' => 'required|max:255|string',
            'email' => 'required|max:255|string',
        ]);
        Session::put('name' ,  $request->name);
        Session::put('surname' ,  $request->surname);
        Session::put('email' ,  $request->email);
        return redirect(route('products.presentPaymentMethods',['id' => $id, 'slug' => $slug]));
    }

    public function presentPaymentMethods(Request $request, $id, $slug=null){
        $productQuantities =  Session::get('productQuantities');
        return view('products.registration',
            ['productQuantities' => $productQuantities, 'id' => $id, 'slug' => $slug]);
    }

路线:

Route::post('/product/{id}/{slug?}/payment/storeUserInfo', [
    'uses' => 'PaymentController@storeUserInfo',
    'as'   =>'products.storeUserInfo'
]);

Route::get('/product/{id}/{slug?}/payment/paymentMethods', [
    'uses' => 'PaymentController@presentPaymentMethods',
    'as'   => 'products.presentPaymentMethods'
]);

jQuery 在步骤之间导航:

<script type="text/javascript">
    $(function(){
        $('a.nav-link').on('show.bs.tab', function(e) {
            var $target = $(e.target);
            if (!divValid($('.nav-pills li a.active').prop('hash'))) {
                e.preventDefault();
            } else

            if ($target.parent().hasClass('disabled')) {
                e.preventDefault();
            }
        });
        $(".next-step").click(function(e) {
            var $active = $('.nav-pills li a.active');
            nextTab($active);
        });

        $(".prev-step").click(function(e) {
            var $active = $('.nav-pills li a.active');
            prevTab($active);
        });

        function nextTab(elem) {
            elem.parent().next().removeClass('disabled').find('a.nav-link').click();
        }

        function prevTab(elem) {
            elem.parent().prev().find('a.nav-link').click();
        }
});

【问题讨论】:

  • 为什么不将数据存储在 php session 中,然后在最后一步付款完成后清除它?
  • 谢谢,我在 storeUserInfo() 方法的会话中存储数据。问题是,然后在该方法中,用户被重定向到此 URL“store.test/product/5/a-5/payment/paymentMethods”的相同支付页面。但是在这个页面中仍然默认显示第 1 步,但它应该显示第 2 步,因为用户之前单击了“转到第 2 步”按钮。
  • 尝试为步骤添加另一个会话名称/值,提交第一步时将会话设置为2,然后在页面中检查会话是否为2隐藏第一步并显示步骤@987654327 @

标签: php jquery laravel


【解决方案1】:

你为什么不直接用 js 收集所有数据并一次性发布到服务器,我觉得你正在以一种非常复杂的方式处理这个问题。

或者,为第一步收集数据,发布到服务器,将用户重定向到第 2 步,然后重复。

例如

Route::get('step1', 'step3@PaymentController')->name('step1');
Route::post('step1store', 'step1@PaymentController')->name('step1-store');
Route::get('step2', 'step2@PaymentController')->name('step2');
Route::post('step2store', 'step2@PaymentController')->name('step2-store');
Route::get('step3', 'step3@PaymentController')->name('step3');
Route::post('step3store', 'step3@PaymentController')->name('step3-store');

public function step1store(Request $request)
{
    //process your data and store to db
    return redirect()->route('step2');
}

public function step2store(Request $request)
{
    //process your data and store to db
    return redirect()->route('step3');
}

public function step3store(Request $request)
{
    //process your data and store to db
    return redirect()->route('step4');
}

我相信你明白了。就个人而言,我会一次发布所有数据,并使用 ajax 验证每个页面。

【讨论】:

  • 谢谢,对于您的替代示例,它似乎与我在问题中的内容相似,但您知道如何在将用户重定向到 step2 之后(在您的示例中的 step1store() 方法中,在问题中storeUserInfo() 方法)显示页面刷新后页面中的step2?因为当用户在点击“转到第 2 步”后被重定向到同一支付页面时,可见的步骤仍然是第 1 步。
  • 我对 ajax 没有太多经验,但你说的是在每个步骤中使用 jquery 收集数据,并在每个步骤中发送一个 ajax 发布请求?但不是每一步都需要存储在db中,只是在第3步中需要存储在db中。
  • 是的,就是这样,让我们​​在步骤 1 中说您有名字、姓氏和电子邮件。如果成功返回,您将通过 ajax 将该数据传递给验证器,然后使用 js 存储数据,然后继续下一步,重复所有收集数据的步骤,在最后一步,步骤 3 发布所有通过 ajax 将经过验证的数据发送到服务器,成功后返回第 4 步的发票。
  • 谢谢,但首先需要使用 ajax 将数据传递给验证器,并且仅在存储在 js 中之后?不是相反吗?首先需要用 jQuery 存储数据,然后只用 ajax 发送到验证器?
【解决方案2】:

我想这就是你要找的东西

$(function(){
 $('.next_step').click(function(){
    var tab = $(this).attr('data-nexttab');
    $('.tabs').hide().removeClass('show').addClass('hide');
    $(tab).show().removeClass('hide').addClass('show');
  });
});
.hide{
 display:none;
}
.show{
display:block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="tabs show" id="tabs1">
Continue Here
<button type="button" data-nexttab="#tabs2" class="next_step">next</button>
</div>
<div class="tabs hide" id="tabs2">
Continue Here 2
<button type="button" data-nexttab="#tabs3" class="next_step">next</button>
</div>
<div class="tabs hide" id="tabs3">
Continue Here 3
<button type="submit" class="next_step">finish</button>
</div>

【讨论】:

  • 谢谢,但是当用户在点击“转到步骤”后被重定向到相同的支付页面时,可见的步骤仍然是第 1 步。
猜你喜欢
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
相关资源
最近更新 更多