78 lines
3 KiB
PHP
78 lines
3 KiB
PHP
<?php
|
|
|
|
namespace App\Traits\Controllers;
|
|
|
|
use App\Http\Requests\Bo\UpdateMultiplePartsRequest;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Validator;
|
|
|
|
trait MultipartModel
|
|
{
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*
|
|
* @param \App\Http\Requests\Bo\UpdateMultiplePartsRequest $request
|
|
* @param \Illuminate\Database\Eloquent\Model $model
|
|
* @param \Illuminate\Foundation\Http\FormRequest $formRequest
|
|
* @param string $routeName
|
|
* @param string $name
|
|
* @param string $successMessage
|
|
* @param string $errorMessage
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
protected function saveModelMultipart(
|
|
UpdateMultiplePartsRequest $request,
|
|
Model $model,
|
|
FormRequest $formRequest,
|
|
string $routeName,
|
|
string $name,
|
|
string $successMessage,
|
|
string $errorMessage
|
|
): \Illuminate\Http\RedirectResponse {
|
|
$fields = [];
|
|
$fields['step'] = intval($request->step) + 1;
|
|
foreach ($model->parts[intval($request->step)] as $field) {
|
|
$fields[$field] = $request->{$field};
|
|
}
|
|
Cache::set($name, \array_merge(Cache::get($name) ?? [], $fields));
|
|
if (intval($request->step) < count($model->parts) - 1) {
|
|
return redirect()->route($routeName, $model);
|
|
}
|
|
return DB::transaction(function () use (
|
|
$model,
|
|
$formRequest,
|
|
$routeName,
|
|
$name,
|
|
$successMessage,
|
|
$errorMessage
|
|
) {
|
|
$formRequest->prepareForValidation();
|
|
$validator = Validator::make(
|
|
collect(Cache::get($name))->except('step')->toArray(),
|
|
$formRequest->rules()
|
|
);
|
|
if (count($validator->errors())) {
|
|
foreach ($model->parts as $key => $part) {
|
|
if (array_search($validator->errors()->keys()[0], $part)) {
|
|
$fields['step'] = $key;
|
|
Cache::set($name, \array_replace_recursive(Cache::get($name) ?? [], $fields));
|
|
break;
|
|
}
|
|
}
|
|
return redirect()->route($routeName, $model)->withErrors($validator->errors());
|
|
}
|
|
$model->fill($validator->validated());
|
|
Cache::forget($name);
|
|
if ($model->saveOrFail()) {
|
|
$tableName = $model->getTable();
|
|
return redirect()->route("bo.$tableName.edit", $model)
|
|
->with('success', $successMessage);
|
|
}
|
|
return redirect()->route($routeName, $model)
|
|
->with('error', $errorMessage);
|
|
});
|
|
}
|
|
}
|