【问题标题】:Perform specific action on button in Bootstrap modal (Laravel)在 Bootstrap 模式(Laravel)中对按钮执行特定操作
【发布时间】:2018-08-28 22:34:41
【问题描述】:

我创建了一个模式,显示特定于他们的 id 条目的信息,并放置了 Approve 和 Reject 按钮,如下所示。

Screenshot of modal

当用户点击“Accept”或“Reject”时,它需要传递与查看条目相关的id,以便用户可以执行请求的操作,无论是接受还是拒绝条目(默认状态为'pending') .

vendor.blade.php

<div class="modal-footer">
  <span class="pull-left">
    <form method="POST" action="{{ route('approve') }}">
      @method('PUT')
      @csrf
      <button type="submit" class="btn btn-success">Approve</button>
     </form>
  </span>
  <span class="pull-right">
    <form method="POST" action="{{ route('reject') }}">
      @method('PUT')
      @csrf
      <button type="submit" class="btn btn-danger">Reject</button>
    </form>
  </span>
</div>

VendorController.php

public function index()
{
    $vendors = DB::select('select company_name, roc_no, created_at from mides_vendors');

    $vendor_id = Vendor::where('status', 'Pending');

    return view('panel.vendor', ['vendors' => $vendors]);
}

ApprovedVendorController.php

<?php

namespace App\Http\Controllers;

use App\User;
use App\Vendor;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class ApproveVendorController extends Controller
{
    public function approve(Request $request, $id)
    {
    	DB::insert('insert into mides_users(name, email, password) select name,roc_no,password from mides_vendors where id = :id', ['id' => $id]);
    	DB::update('update mides_vendors set status = :status where id = :id', ['status' => 'Approved', 'id' => $id]);

    	return redirect('/');
    }

    public function reject(Request $request, $id)
    {
    	DB::update('update mides_vendors set status = :status where id = :id', ['status' => 'Rejected', 'id' => $id]);

    	return redirect('/');
    }
}

routes/web.php

Route::prefix('/panel')->group(function () {
	Route::get('/dashboard', function () {
		return view('panel.dashboard');
	});
  /* These routes only display the information/modal
	Route::get('/approve-vendor', 'VendorController@showNewRegistration'); // return vendor.blade.php
	Route::get('/vendor-approved', 'VendorController@showApproved'); // return vendor-approve.blade.php
	Route::get('/vendor-reject', 'VendorController@showRejected'); // return vendor-reject.blade.php
  /* These route used to perform the specific action */
	Route::put('/approve/{id}', 'ApproveVendorController@approve')->name('approve');
	Route::put('/reject{id}', 'ApproveVendorController@reject')->name('reject');
});

但是,它返回此错误。

Error got after clicking Accept or Reject

如何传递数据的 id?我尝试如pass the database value to modal popup 所示使用第二个答案选项(除了ajax 选项)创建模式。我需要为这些创建另一个控制器吗?

已编辑:按照@Wreigh 的说明进行操作后,它起作用了,这意味着状态从“待定”变为“接受/拒绝”。但是,当我返回上一页时,即/panel/approve-vendor(该页面用于显示待处理列表模式),然后我收到错误undefined variable vendorId

【问题讨论】:

  • 因为没有发送 {id} 方法到 route:Route::put('/approve/{id}' 用 post 方法写可以吗?
  • Supun Fiction Praneeth,我已经在 ApprovedVendorController 中添加了 {id},还是错了?我看到那篇帖子并给出了相同的结果。
  • 是的,这是错误的,使用post或put时无法获得这样的id,我会发布答案

标签: php jquery laravel


【解决方案1】:

您可以通过网址提供id,也可以使用帖子值。但是,让我们尝试通过 url 作为参数。

将您的路线更新为如下所示:

Route::put('/approve/{id}', 'ApproveVendorController@approve')->name('approve');
Route::put('/reject/{id}', 'ApproveVendorController@reject')->name('reject');

然后以你的形式:

<form method="POST" action="{{ route('approve', $vendorId) }}">
<form method="POST" action="{{ route('reject', $vendorId) }}">

如果你想通过帖子值。

不需要更新你的路由,但是更新你的控制器动作签名:

public function approve(Request $request) {
    $id = $request->input('id');
}
public function reject(Request $request) {
    $id = $request->input('id');
}

然后将其插入您的表单中:

<input type="hidden" name="id" value="{{ $vendorId }}">

您为什么会遇到错误?

在您的函数签名中,您需要一个 $id 参数,而在您的路由定义中,您没有。 Laravel 不能像这样神奇地提供它,你必须通过 url 提供它,作为参数。

【讨论】:

  • 谢谢,但仍然有错误。查看待处理页面的路由是 Route::get('/approve-vendor', 'VendorController@showNewRegistration');而带有 PUT 方法的两条路由仅用于执行指定的操作。
  • 您刚才所说的问题没有在您的问题中说明,也许它属于另一个问题或更新您的问题。如果我错了,请纠正我,因为附加的图像被我的代理阻止(我无法控制)
  • 我的错……我已经编辑了我的问题。似乎路由器参数需要带有 id 的 url。我试图查看 /approve-vendor ,但由于没有留下任何条目,因此无法返回页面。
【解决方案2】:

因为你的approve 路线是这样的/approve/{id} 你不能去panel/approve 因为你没有通过id

所以试试这个:

vendor.blade.php(删除 put 和您的 id 作为隐藏输入)

<div class="modal-footer">
  <span class="pull-left">
    <form method="POST" action="{{ route('approve') }}">
    <input type="hidden" name="id" value="{{ $id}}">
      @csrf
      <button type="submit" class="btn btn-success">Approve</button>
     </form>
  </span>
  <span class="pull-right">
    <form method="POST" action="{{ route('reject') }}">
      @csrf
      <input type="hidden" name="id" value="{{ $id}}">
      <button type="submit" class="btn btn-danger">Reject</button>
    </form>
  </span>
</div>

ApprovedVendorController.php(去掉所有参数)

<?php

namespace App\Http\Controllers;

use App\User;
use App\Vendor;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class ApproveVendorController extends Controller
{
    public function approve()
    { 
        $id = request('id');

        DB::insert('insert into mides_users(name, email, password) select name,roc_no,password from mides_vendors where id = :id', ['id' => $id]);
        DB::update('update mides_vendors set status = :status where id = :id', ['status' => 'Approved', 'id' => $id]);

        return redirect('/');
    }

    public function reject()
    {
        $id = request('id');
        DB::update('update mides_vendors set status = :status where id = :id', ['status' => 'Rejected', 'id' => $id]);

        return redirect('/');
    }
}

routes/web.php(移除参数)

Route::prefix('/panel')->group(function () {
    Route::get('/dashboard', function () {
        return view('panel.dashboard');
    });
  /* These routes only display the information/modal
    Route::get('/approve-vendor', 'VendorController@showNewRegistration'); // return vendor.blade.php
    Route::get('/vendor-approved', 'VendorController@showApproved'); // return vendor-approve.blade.php
    Route::get('/vendor-reject', 'VendorController@showRejected'); // return vendor-reject.blade.php
  /* These route used to perform the specific action */
    Route::put('/approve', 'ApproveVendorController@approve')->name('approve');
    Route::put('/reject', 'ApproveVendorController@reject')->name('reject');
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多