Bài 07: Thêm Dữ liệu Sản Phẩm

Bài 07: Thêm Dữ liệu Sản Phẩm

 

-    Vào teminal chạy lệnh : 
        php artisan make:migration add_column_feature_image_name --table=products
-     Vào file :         2021_07_19_060422_add_column_feature_image_name.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddColumnFeatureImageName extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('products', function (Blueprint $table) {
$table->string('feature_image_name')->nullable();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('products', function (Blueprint $table) {
$table->dropColumn('feature_image_name');
});
}
}
-    Vào teminal chạy lệnh : php artisan migrate

-    Vào file AdminProductController
<?php

namespace App\Http\Controllers;

use App\Category;
use App\Components\Recusive;
use App\Product;
use App\Traits\StorageImageTrait;
use Illuminate\Http\Request;
use Storage;
class AdminProductController extends Controller
{
use StorageImageTrait;
private $category;
private $product;
public function __construct(Category $category, Product $product)
{
$this->category = $category;
$this->product = $product;
}

public function index()
{
return view('admin.product.index');
}
public function create()
{
$htmlOption = $this->getCategory($parentId='');
return view('admin.product.add',compact('htmlOption'));
}
public function getCategory($parentId)
{
$data = $this->category->all();
$recusive = new Recusive($data);
$htmlOption = $recusive->categoryRecusive($parentId);
return $htmlOption;
}
public function store(Request $request)
{
$dataProductCreate = [
'name'=>$request->name,
'price' =>$request->price,
'content' => $request->contents,
'user_id' => auth()->id(),
'category_id'=>$request->category_id
];
$dataUploadFeatureImage = $this->storageTraitUpload($request, 'feature_image_path','product');
if (!empty($dataUploadFeatureImage)){
$dataProductCreate['feature_image_name']=$dataUploadFeatureImage['file_name'];
$dataProductCreate['feature_image_path']=$dataUploadFeatureImage['file_path'];
}
$product = $this->product->create($dataProductCreate);
dd($product)
;
}
}
-    Vào file    add.blade.php
<!-- Stored in resources/views/child.blade.php -->

@extends('layouts.admin')

@section('title')
<title>Add product</title>
@endsection

@section('css')
<link href="{{ asset('vendors/select2/select2.min.css') }}" rel="stylesheet" />
<link href="{{ asset('admins/product/add/add.css') }}" rel="stylesheet" />
@endsection

@section('content')
<div class="content-wrapper">
@include('partials.content-header',['name'=>'product', 'key'=>'Add'])
<form action="{{ route("product.store") }}" method="post" enctype="multipart/form-data">
<div class="content">
<div class="container-fluid">
<div class="row">
<div class="col-md-6">

@csrf
<div class="form-group">
<label>Tên sn phm</label>
<input class="form-control"
name="name"
placeholder="Nhp tên sn phm">
</div>

<div class="form-group">
<label>Tên giá sn phm</label>
<input type="text"
class="form-control"
name="price"
placeholder="Nhp giá sn phm">
</div>

<div class="form-group">
<label>nh đi din</label>
<input type="file"
class="form-control-file"
name="feature_image_path">
</div>

<div class="form-group">
<label>nh chi tiết</label>
<input type="file"
multiple
class="form-control-file"
name="image_path[]">
</div>

<div class="form-group">
<label>Chn danh mc</label>
<select class="form-control select2_init"
name="category_id">
<option value="">Chn danh mc</option>
{!! $htmlOption !!}}
</select>
</div>

<div class="form-group">
<label>Nhp tag cho sn phm</label>
<select name="tags[]" class="form-control tags_select_choose" multiple="multiple">

</select>
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<label >Nhp ni dung</label>
<textarea name="contents" class="form-control tinymce_editor_init" rows="10">

</textarea>
</div>
</div>
<div class="col-md-12">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</div>
</div>
</div>
</form>
@endsection

@section('js')
<script src="{{ asset('vendors/select2/select2.min.js') }}"></script>
<script src="https://cdn.tiny.cloud/1/no-api-key/tinymce/5/tinymce.min.js" referrerpolicy="origin"></script>
<script src="{{ asset('admins/product/add/add.js') }}"></script>
@endsection
-    Vào file Traits =>  Product.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
protected $guarded = [];
}
kết quả :
-    Vào teminal chạy lệnh : 
php artisan make:migration add_column_image_name_to_table_product_image --table=product_images
-    Vào file 2021_07_19_063505_add_column_image_name_to_table_product_image.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddColumnImageNameToTableProductImage extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('product_images', function (Blueprint $table) {
$table->string('image_name');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('product_images', function (Blueprint $table) {
$table->dropColumn('image_name');
});
}
}
-    Vào teminal chạy lệnh :     php artisan migrate-    Vào file AdminProductController
<?php

namespace App\Http\Controllers;

use App\Category;
use App\Components\Recusive;
use App\Product;
use App\ProductImage;
use App\Traits\StorageImageTrait;
use Illuminate\Http\Request;
use phpDocumentor\Reflection\Types\This;
use Storage;
class AdminProductController extends Controller
{
use StorageImageTrait;
private $category;
private $product;
private $productImage;
public function __construct(Category $category,Product $product ,ProductImage $productImage)
{
$this->category = $category;
$this->product = $product;
$this->productImage = $productImage;
}

public function index()
{
return view('admin.product.index');
}
public function create()
{
$htmlOption = $this->getCategory($parentId='');
return view('admin.product.add',compact('htmlOption'));
}
public function getCategory($parentId)
{
$data = $this->category->all();
$recusive = new Recusive($data);
$htmlOption = $recusive->categoryRecusive($parentId);
return $htmlOption;
}
public function store(Request $request)
{
$dataProductCreate = [
'name'=>$request->name,
'price' =>$request->price,
'content' => $request->contents,
'user_id' => auth()->id(),
'category_id'=>$request->category_id
];
$dataUploadFeatureImage = $this->storageTraitUpload($request, 'feature_image_path','product');
if (!empty($dataUploadFeatureImage)){
$dataProductCreate['feature_image_name']=$dataUploadFeatureImage['file_name'];
$dataProductCreate['feature_image_path']=$dataUploadFeatureImage['file_path'];
}
$product = $this->product->create($dataProductCreate);

//Insert data -> product_images
if ( $request->hasFile('image_path') ) {
foreach ($request->image_path as $fileItem){
$dataProductImageDetall = $this->storageTraitUploadMutiple($fileItem,'`product_images');
$product->images()->create([
'image_path'=> $dataProductImageDetall['file_path'],
'image_name'=> $dataProductImageDetall['file_name']
]);
}
}

}
}
-    Vào StorageImageTrait.php
<?php

namespace App\Traits;

use Illuminate\Http\Request;
use Storage;

trait StorageImageTrait{
public function storageTraitUpload(Request $request,$fielName, $foderName)
{
if($request->hasFile($fielName)){
$file = $request->$fielName;
$fileNameOrigin = $file->getClientOriginalName();
$fileNameHash = str_random(20) . '.' .$file->getClientOriginalExtension();
$filePath = $request->file($fielName)->storeAs('public/' . $foderName. '/' .auth()->id(),$fileNameHash);
$dataUploadTrait = [
'file_name' => $fileNameOrigin,
'file_path' => Storage::url($filePath)
];
return $dataUploadTrait;
}
return null;

}
public function storageTraitUploadMutiple($file, $foderName)
{
$fileNameOrigin = $file->getClientOriginalName();
$fileNameHash = str_random(20) . '.' .$file->getClientOriginalExtension();
$filePath = $file->storeAs('public/' . $foderName. '/' .auth()->id(),$fileNameHash);
$dataUploadTrait = [
'file_name' => $fileNameOrigin,
'file_path' => Storage::url($filePath)
];
return $dataUploadTrait;

}
}
-    Vào    ProductImage.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ProductImage extends Model
{
protected $guarded = [];
}
-    Vào   Product.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
protected $guarded = [];
public function images(){
return $this->hasMany(ProductImage::class, 'product_id');
}
}
kết quả :

-    Vào file AdminProductController
<?php

namespace App\Http\Controllers;

use App\Category;
use App\Components\Recusive;
use App\Product;
use App\ProductImage;
use App\ProductTag;
use App\Tag;
use App\Traits\StorageImageTrait;
use Illuminate\Http\Request;
use Storage;

class AdminProductController extends Controller
{
use StorageImageTrait;
private $category;
private $product;
private $productImage;
private $tag;
private $productTag;
public function __construct(Category $category,Product $product ,ProductImage $productImage,
Tag $tag,ProductTag $productTag)
{
$this->category = $category;
$this->product = $product;
$this->productImage = $productImage;
$this->tag = $tag;
$this->productTag = $productTag;
}

public function index()
{
return view('admin.product.index');
}
public function create()
{
$htmlOption = $this->getCategory($parentId='');
return view('admin.product.add',compact('htmlOption'));
}
public function getCategory($parentId)
{
$data = $this->category->all();
$recusive = new Recusive($data);
$htmlOption = $recusive->categoryRecusive($parentId);
return $htmlOption;
}
public function store(Request $request)
{
$dataProductCreate = [
'name'=>$request->name,
'price' =>$request->price,
'content' => $request->contents,
'user_id' => auth()->id(),
'category_id'=>$request->category_id
];
$dataUploadFeatureImage = $this->storageTraitUpload($request, 'feature_image_path','product');
if (!empty($dataUploadFeatureImage)){
$dataProductCreate['feature_image_name']=$dataUploadFeatureImage['file_name'];
$dataProductCreate['feature_image_path']=$dataUploadFeatureImage['file_path'];
}
$product = $this->product->create($dataProductCreate);

//Insert data -> product_images
if ( $request->hasFile('image_path') ) {
foreach ($request->image_path as $fileItem){
$dataProductImageDetall = $this->storageTraitUploadMutiple($fileItem,'`product_images');
$product->images()->create([
'image_path'=> $dataProductImageDetall['file_path'],
'image_name'=> $dataProductImageDetall['file_name']
]);
}
}
//Insert tags -> product
foreach ($request->tags as $tagItem){

//Insert to Tags
$tagInstance = $this->tag->firstOrCreate(['name' => $tagItem]);
$tagIds[] = $tagInstance->id;
}
$product->tags()->attach($tagIds)
;
}
}
-    Vào   Product.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
protected $guarded = [];
public function images(){
return $this->hasMany(ProductImage::class, 'product_id');
}
public function tags(){
return $this->belongsToMany(Tag::class,'product_tags','product_id','tag_id')
->withTimestamps();
}
}
-    Vào   Tag.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
protected $guarded=[];
}
-    Vào  ProductTag.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ProductTag extends Model
{
protected $guarded=[];
}
-    add.js:
$(function () {
$(".tags_select_choose").select2({
tags: true,
tokenSeparators: [',']
});
$(".select2_init").select2({
placeholder: "Chn danh mc",
allowClear:true
});

let editor_config = {
path_absolute : "/",
selector: 'textarea.tinymce_editor_init',
relative_urls: false,
plugins: [
"advlist autolink lists link image charmap print preview hr anchor pagebreak",
"searchreplace wordcount visualblocks visualchars code fullscreen",
"insertdatetime media nonbreaking save table directionality",
"emoticons template paste textpattern"
],
toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image media",
file_picker_callback : function(callback, value, meta) {
let x = window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth;
let y = window.innerHeight|| document.documentElement.clientHeight|| document.getElementsByTagName('body')[0].clientHeight;

let cmsURL = editor_config.path_absolute + 'filemanager?editor=' + meta.fieldname;
if (meta.filetype == 'image') {
cmsURL = cmsURL + "&type=Images";
} else {
cmsURL = cmsURL + "&type=Files";
}

tinyMCE.activeEditor.windowManager.openUrl({
url : cmsURL,
automatic_uploads: true,
title : 'Filemanager',
width : x * 0.8,
height : y * 0.8,
resizable : "yes",
close_previous : "no",
onMessage: (api, message) => {
callback(message.content);
}
});
}
};

tinymce.init(editor_config);
});

Đăng nhận xét

0 Nhận xét

myadcash