if you only allow status change then use a form request that only allows contains status, then only set status in controller. Don't rely on the read only attribute
Jun 19, 2023
3
Level 3
facing problems updating the status field in my blade
i have set all other fields to readonly beacause i only want to be able to update status i am using laravel and splade .when i click submit the page does not redirect anywhere this began when i added status in the update request previously i did not put status in the request and i could update all other fields but status remained the same even if i changed it
my controller
<?php
namespace App\Http\Controllers;
use App\Models\CardReplacement;
use App\Http\Requests\StoreCardReplacementRequest;
use App\Http\Requests\UpdateCardReplacementRequest;
use App\Tables\CardReplacements;
use Dompdf\Dompdf;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\View;
use ProtoneMedia\Splade\Facades\Toast;
use Spatie\QueryBuilder\AllowedFilter;
use Spatie\QueryBuilder\QueryBuilder;
use Carbon\Carbon;
class CardReplacementController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$dateFilter = AllowedFilter::callback('date', function (
$query,
$value
) {
$now = Carbon::now();
if ($value === 'today') {
$query->whereDate('created_at', $now->toDateString());
} elseif ($value === 'this_week') {
$query->whereBetween('created_at', [
$now->startOfWeek()->toDateTimeString(),
$now->endOfWeek()->toDateTimeString(),
]);
} elseif ($value === 'this_month') {
$query->whereBetween('created_at', [
$now->startOfMonth()->toDateTimeString(),
$now->endOfMonth()->toDateTimeString(),
]);
}
});
$globalSearch = AllowedFilter::callback('global', function (
$query,
$value
) {
$query->where(function ($query) use ($value) {
Collection::wrap($value)->each(function ($value) use ($query) {
$query
->orWhere('cardType', 'LIKE', "%{$value}%")
->orWhere('accountNumber', 'LIKE', "%{$value}%")
->orWhere('collectionPoint', 'LIKE', "%{$value}%")
->orWhere('mobileNumber', 'LIKE', "%{$value}%");
});
});
});
$cardReplacements = QueryBuilder::for(CardReplacement::class)
->defaultSort('cardType')
->allowedFilters([
'cardType',
'accountNumber',
'reason',
'collectionPoint',
'mobileNumber',
'Name',
'status',
$globalSearch,
$dateFilter,
])
->allowedSorts([
'id',
'cardType',
'accountNumber',
'reason',
'collectionPoint',
'Name',
'mobileNumber',
])
->paginate(6)
->withQueryString();
return view('cardReplacements.index', [
'cardReplacements' => CardReplacements::class,
]);
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
return view('cardReplacements.create');
}
/**
* Store a newly created resource in storage.
*/
public function store(StoreCardReplacementRequest $request)
{
CardReplacement::create($request->validated());
Toast::title('Card Replacement Created')
->message('Created Successfully')
->success()
->leftTop()
->backdrop()
->autoDismiss(5);
return redirect()->route('card-replacements.index');
}
/**
* Display the specified resource.
*/
public function show(CardReplacement $cardReplacement)
{
return view('card-replacements.show', [
'cardReplacement' => $cardReplacement,
]);
}
/**
* Show the form for editing the specified resource.
*/
public function edit(CardReplacement $cardReplacement)
{
return view('cardReplacements.edit', [
'cardReplacement' => $cardReplacement,
]);
}
/**
* Update the specified resource in storage.
*/
public function update(
UpdateCardReplacementRequest $request,
CardReplacement $cardReplacement
) {
$cardReplacement->update($request->validated());
Toast::title('Card Replacement Updated')
->message('Updated Successfully')
->info()
->leftTop()
->backdrop()
->autoDismiss(5);
return redirect()->route('card-replacements.index');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(CardReplacement $cardReplacement)
{
$cardReplacement->delete();
Toast::title('Card Replacement deleted')
->message('Deleted successfully')
->warning()
->leftTop()
->backdrop()
->autoDismiss(5);
return redirect()->route('card-replacements.index');
}
public function downloadPdf(CardReplacement $cardReplacement)
{
$pdf = new Dompdf();
$view = View::make(
'cardReplacements.pdf',
compact('cardReplacement')
)->render();
$pdf->loadHtml($view);
$pdf->render();
return Response::stream(
function () use ($pdf) {
echo $pdf->output();
},
200,
[
'Content-Type' => 'application/pdf',
'Content-Disposition' =>
'attachment; filename="card-replacement.pdf"',
]
);
}
}
my edit.blade file
<x-layout>
<x-splade-form confirm="are you sure" :default="$cardReplacement" :action="route('card-replacements.update', $cardReplacement)" method="PUT"
class="w-full md:w-4/12 justify-center mx-auto mt-16 space-y-4 px-5 py-5 bg-white">
<h1 class="text-xl font-semibold text-center">Card Replacement, {{ $cardReplacement->Name }}</h1>
<div class="grid grid-cols-2 gap-4">
<x-splade-input name="Name" label="Name" :default="$cardReplacement->Name" readonly />
<x-splade-input name="cardType" label="Card Type" :default="$cardReplacement->cardType" readonly />
<x-splade-input name="accountNumber" label="Account Number" :default="$cardReplacement->accountNumber" readonly="" />
<x-splade-input name="reason" label="Reason" :default="$cardReplacement->reason" readonly />
<x-splade-input name="collectionPoint" label="Collection Point" :default="$cardReplacement->collectionPoint" readonly />
<x-splade-input name="mobileNumber" label="Mobile Number" :default="$cardReplacement->mobileNumber" readonly />
<div class="col-span-2">
<label for="status" class="block text-sm font-medium text-gray-700">Status</label>
<select name="status" id="status"
class="mt-1 block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
@foreach (\App\Enums\CardReplacementStatusEnum::getValues() as $value)
<option value="{{ $value }}" {{ $cardReplacement->status == $value ? 'selected' : '' }}>
{{ $value }}</option>
@endforeach
</select>
</div>
</div>
<x-splade-button type="submit"
class="hover:bg-gray-200 hover:text-black transition w-full md:w-28 bg-gray-800 h-10 px-2 text-white font-semibold rounded font-sans">
Submit
</x-splade-button>
</x-splade-form>
</x-layout>
my updateequest
<?php
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class UpdateCardReplacementRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
return [
'cardType' => ['required', 'string', 'max:255'],
'accountNumber' => ['required', 'string', 'max:255'],
'reason' => ['required', 'string', 'max:255'],
'collectionPoint' => ['required', 'string', 'max:255'],
'Name' => ['required', 'string', 'max:255'],
'mobileNumber' => ['required', 'string', 'max:255'],
'status' => ['required', 'string', 'in:pending,approved,rejected'],
];
}
}
my migration file
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('card_replacements', function (Blueprint $table) {
$table->id();
$table->string('cardType');
$table->string('accountNumber');
$table->string('reason');
$table->string('collectionPoint');
$table->string('mobileNumber');
$table->string('Name');
$table->string('status')->default('pending');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('card_replacements');
}
};
my model
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class CardReplacement extends Model
{
use HasFactory;
protected $fillable = [
'cardType',
'accountNumber',
'reason',
'collectionPoint',
'mobileNumber',
'Name',
'status',
];
}
Please or to participate in this conversation.