File: //home/armgroup/libs/app/Http/Livewire/Admin/Option/Edit.php
<?php
namespace App\Http\Livewire\Admin\Option;
use App\Http\Livewire\ConvertEmptyStringsToNull;
use App\Http\Livewire\General;
use App\Models\Option;
use App\Models\OptionValue;
use Illuminate\Support\Facades\DB;
use Livewire\Component;
class Edit extends Component
{
use ConvertEmptyStringsToNull, General;
public Option $option;
public $values = [];
public $deleteIds = [];
public function mount()
{
$this->values = $this->option
->values()
->select('id', 'option_id', 'name', 'sort_order', 'color')
->get()
->toArray();
}
public function render()
{
return view('livewire.admin.option.edit');
}
protected function rules()
{
return [
'option.name' => 'required|max:250|string',
'option.label' => 'nullable|max:250|string',
'option.sort_order' => 'nullable|integer|min:0|max:10000',
'option.type' => 'required|integer|min:0|max:'.(count(Option::TYPE_TRANSLATE) - 1),
'values.*.name' => 'required|max:250|string|distinct',
'values.*.color' => ['nullable', 'regex:/^(#(?:[0-9a-f]{2}){2,4}|#[0-9a-f]{3}|(?:rgba?|hsla?)\((?:\d+%?(?:deg|rad|grad|turn)?(?:,|\s)+){2,3}[\s\/]*[\d\.]+%?\))$/i'],
'values.*.sort_order' => 'nullable|integer|min:0|max:10000',
];
}
protected $validationAttributes = [
'values.*.name' => 'مقدار',
'values.*.color' => 'رنگ',
'values.*.sort_order' => 'ترتیپ',
];
public function addItem()
{
$this->values[] = [
'id' => null,
'option_id' => $this->option->id,
'name' => null,
'sort_order' => null,
'color' => null,
];
}
public function removeItem($index)
{
if ($this->values[$index]['id']) {
$this->deleteIds[] = $this->values[$index]['id'];
}
unset($this->values[$index]);
}
public function update()
{
if (count($this->deleteIds)) {
$count = DB::table('option_product')->whereIn('value_id', $this->deleteIds)->distinct('product_id')->count();
if ($count) {
$this->ajaxDoneMessage("تعداد {$count} محصول دارای گزینه با مقادیر حذف شده میباشند و امکان حذف این موارد نیست، لطفا ابتدا محصولات را ویرایش نمایید.", 'error');
return;
}
}
$this->validate();
DB::transaction(function () {
$this->option->update([
'name' => $this->option->name,
'label' => $this->option->label,
'sort_order' => $this->option->sort_order,
'type' => $this->option->type,
]);
if (! count($this->values)) {
$this->option->values()->delete();
} else {
if (count($this->deleteIds)) {
OptionValue::whereIn('id', $this->deleteIds)->delete();
}
OptionValue::upsert(
$this->values,
['id', 'option_id'],
['name', 'sort_order', 'color']
);
}
saveActivity("گزینه {$this->option->name} ویرایش شد", $this->option);
});
$this->doneMessage();
return redirect()->route('admin.options.index');
}
}