✏️ 编辑:_form.blade.php
路径:
/home/boguraj1/.trash/_form.blade.php
大小:12.9 KB · 修改:2026-07-23 16:56:14 · 权限:0644 · 可写
← 返回目录
👁 查看
⬇ 下载
<div class="row g-4"> <div class="col-lg-8"> {{-- BASIC INFO --}} <div class="card mb-4"> <div class="card-header">Basic Information</div> <div class="card-body p-4"> <div class="mb-3"> <label class="form-label">Product Name <span class="text-danger">*</span></label> <input type="text" name="name" class="form-control @error('name') is-invalid @enderror" value="{{ old('name', $product->name ?? '') }}" required placeholder="Product name"> @error('name')<div class="invalid-feedback">{{ $message }}</div>@enderror </div> <div class="mb-3"> <label class="form-label">Slug</label> <input type="text" name="slug" class="form-control" value="{{ old('slug', $product->slug ?? '') }}" placeholder="auto-generated"> </div> <div class="mb-3"> <label class="form-label">Short Description</label> <textarea name="short_description" rows="2" class="form-control" placeholder="Brief product summary...">{{ old('short_description', $product->short_description ?? '') }}</textarea> </div> <div class="mb-3"> <label class="form-label">Full Description</label> <textarea name="description" rows="6" class="form-control" placeholder="Full product description...">{{ old('description', $product->description ?? '') }}</textarea> </div> </div> </div> {{-- PRICING --}} <div class="card mb-4"> <div class="card-header">Pricing</div> <div class="card-body p-4"> <div class="row g-3"> <div class="col-sm-4"> <label class="form-label">Regular Price (৳) <span class="text-danger">*</span></label> <input type="number" name="regular_price" step="0.01" min="0" class="form-control @error('regular_price') is-invalid @enderror" value="{{ old('regular_price', $product->regular_price ?? '') }}" required> @error('regular_price')<div class="invalid-feedback">{{ $message }}</div>@enderror </div> <div class="col-sm-4"> <label class="form-label">Sale Price (৳)</label> <input type="number" name="sale_price" step="0.01" min="0" class="form-control" value="{{ old('sale_price', $product->sale_price ?? '') }}" placeholder="Leave empty if no sale"> </div> <div class="col-sm-4"> <label class="form-label">Offer Text</label> <input type="text" name="offer_text" class="form-control" placeholder="e.g. Save 20% today!" value="{{ old('offer_text', $product->offer_text ?? '') }}"> </div> </div> </div> </div> {{-- SHIPPING --}} <div class="card mb-4"> <div class="card-header"><i class="bi bi-truck me-1"></i>Shipping Charge <small class="text-muted">(খালি রাখলে Global Settings এর চার্জ প্রযোজ্য হবে)</small></div> <div class="card-body p-4"> <div class="row g-3"> <div class="col-sm-6"> <label class="form-label"><i class="bi bi-geo-alt-fill me-1 text-success"></i>Inside Dhaka (৳)</label> <div class="input-group"> <span class="input-group-text">৳</span> <input type="number" name="shipping_inside_dhaka" min="0" class="form-control" value="{{ old('shipping_inside_dhaka', $product->shipping_inside_dhaka ?? '') }}" placeholder="Global settings হতে নেবে"> </div> </div> <div class="col-sm-6"> <label class="form-label"><i class="bi bi-geo-alt me-1 text-danger"></i>Outside Dhaka (৳)</label> <div class="input-group"> <span class="input-group-text">৳</span> <input type="number" name="shipping_outside_dhaka" min="0" class="form-control" value="{{ old('shipping_outside_dhaka', $product->shipping_outside_dhaka ?? '') }}" placeholder="Global settings হতে নেবে"> </div> </div> </div> <div class="mt-2"> <small class="text-muted"><i class="bi bi-info-circle me-1"></i>০ (শূন্য) লিখলে Free Shipping হবে। খালি রাখলে Settings এর Default চার্জ apply হবে।</small> </div> </div> </div> {{-- GALLERY --}} <div class="card mb-4"> <div class="card-header">Product Gallery</div> <div class="card-body p-4"> @if(isset($product) && $product->images->count() > 0) <div class="d-flex flex-wrap gap-2 mb-3"> @foreach($product->images as $img) <div class="position-relative"> <img src="{{ $img->image_url }}" style="width:80px;height:80px;object-fit:cover;border-radius:8px" alt=""> <button type="button" class="btn btn-danger btn-sm rounded-circle p-0" style="position:absolute;top:-6px;right:-6px;width:22px;height:22px;font-size:11px" onclick="quickDelete('{{ route('admin.products.images.delete', $img) }}', 'Remove image?')"> <i class="bi bi-x"></i> </button> </div> @endforeach </div> @endif <input type="file" name="images[]" multiple class="form-control" accept="image/*"> <small class="text-muted">You can select multiple images. Max 4MB each.</small> </div> </div> {{-- VARIATIONS --}} <div class="card"> <div class="card-header d-flex justify-content-between align-items-center"> <span>Variations <small class="text-muted">(Size, Color, Weight, etc.)</small></span> <button type="button" class="btn btn-sm btn-outline-danger" onclick="addVariation()">+ Add Variation</button> </div> <div class="card-body p-4"> @if(isset($product) && $product->variations->count() > 0) <div class="mb-3"> <label class="form-label text-muted">Existing Variations</label> @foreach($product->variations as $v) <div class="d-flex align-items-center gap-2 mb-2 p-2 bg-light rounded"> <span class="badge bg-secondary">{{ $v->type }}</span> <span>{{ $v->value }}</span> @if($v->price_adjustment != 0) <span class="text-muted">+৳{{ $v->price_adjustment }}</span> @endif <span class="text-muted ms-auto">Stock: {{ $v->stock }}</span> <button type="button" class="btn btn-sm btn-outline-danger py-0 px-1 ms-2" onclick="quickDelete('{{ route('admin.products.variations.delete', $v) }}', 'Remove variation?')"><i class="bi bi-x"></i></button> </div> @endforeach </div> @endif <div id="variationRows"></div> </div> </div> </div> <div class="col-lg-4"> {{-- THUMBNAIL --}} <div class="card mb-4"> <div class="card-header">Thumbnail Image</div> <div class="card-body p-4"> @if(isset($product) && $product->thumbnail) <img src="{{ $product->thumbnail_url }}" class="w-100 rounded mb-2" style="object-fit:cover;height:180px" alt=""> @endif <input type="file" name="thumbnail" class="form-control" accept="image/*"> </div> </div> {{-- ORGANISATION --}} <div class="card mb-4"> <div class="card-header">Organisation</div> <div class="card-body p-4"> <div class="mb-3"> <label class="form-label">Category</label> <select name="category_id" class="form-select"> <option value="">— None —</option> @foreach($categories as $cat) <option value="{{ $cat->id }}" {{ old('category_id', $product->category_id ?? '') == $cat->id ? 'selected' : '' }}>{{ $cat->name }}</option> @endforeach </select> </div> <div class="mb-3"> <label class="form-label">Tags</label> <div style="max-height:180px;overflow-y:auto;border:1px solid #e0e0e0;border-radius:8px;padding:10px"> @foreach($tags as $tag) <div class="form-check"> <input class="form-check-input" type="checkbox" name="tags[]" value="{{ $tag->id }}" id="tag_{{ $tag->id }}" {{ in_array($tag->id, old('tags', isset($product) ? $product->tags->pluck('id')->toArray() : [])) ? 'checked' : '' }}> <label class="form-check-label" for="tag_{{ $tag->id }}">{{ $tag->name }}</label> </div> @endforeach </div> </div> <div class="mb-3"> <label class="form-label">SKU</label> <input type="text" name="sku" class="form-control" value="{{ old('sku', $product->sku ?? '') }}" placeholder="auto-generated"> </div> <div class="mb-3"> <label class="form-label">Stock Quantity <span class="text-danger">*</span></label> <input type="number" name="stock" min="0" class="form-control @error('stock') is-invalid @enderror" value="{{ old('stock', $product->stock ?? 0) }}" required> @error('stock')<div class="invalid-feedback">{{ $message }}</div>@enderror </div> <div class="form-check form-switch mb-2"> <input class="form-check-input" type="checkbox" name="status" id="status" value="1" {{ old('status', $product->status ?? true) ? 'checked' : '' }}> <label class="form-check-label" for="status">Active (visible on site)</label> </div> <div class="form-check form-switch"> <input class="form-check-input" type="checkbox" name="featured" id="featured" value="1" {{ old('featured', $product->featured ?? false) ? 'checked' : '' }}> <label class="form-check-label" for="featured">Featured Product</label> </div> </div> </div> </div> </div> @section('scripts') <script> function quickDelete(url, message) { if (!confirm(message || 'Remove this?')) return; const form = document.getElementById('quickDeleteForm'); form.action = url; form.submit(); } let varCount = 0; function addVariation() { const i = varCount++; const html = ` <div class="row g-2 align-items-end mb-2 variation-row"> <div class="col-sm-3"> <select name="variation_types[]" class="form-select form-select-sm"> <option value="size">Size</option> <option value="color">Color</option> <option value="weight">Weight</option> <option value="other">Other</option> </select> </div> <div class="col-sm-3"> <input type="text" name="variation_values[]" class="form-control form-control-sm" placeholder="e.g. L, Red, 1kg"> </div> <div class="col-sm-3"> <input type="number" name="variation_prices[]" class="form-control form-control-sm" placeholder="Price ±" step="0.01"> </div> <div class="col-sm-2"> <input type="number" name="variation_stocks[]" class="form-control form-control-sm" placeholder="Stock" min="0"> </div> <div class="col-sm-1"> <button type="button" class="btn btn-sm btn-outline-danger" onclick="this.closest('.variation-row').remove()">×</button> </div> </div>`; document.getElementById('variationRows').insertAdjacentHTML('beforeend', html); } </script> @endsection
💾 保存
取消
保存为 UTF-8,换行统一为 LF