You are on page 1of 22

Đăng ký tk

Password dùng bcrypt để mã hóa mk tăng bảo mật

Dùng create sẽ gặp lỗi laravel tự thêm 2 cột update và field để fix thì 1 là
chuyển create thành insert, 2 là thêm timestamps vào model Admin

Thêm fillable để chỉ thêm dữ liệu những cột này.

Đăng nhập
dùng attempt() mặc định laravel sẽ check vào model user để chỉnh cho
check vào model Admin thì set guard(‘admin’)
- Cách set guard(‘admin’):
vào config/auth.php thêm đoạn này vào guards

Đoạn này vào provider


- Tạo guard xong mà gặp lỗi not defined. thì chạy lệnh này:

- Thêm Authenticatable vào model để sử dụng hệ thống xác thực


Laravel như Auth::attempt(), với implements

Hiển thị sản phẩm (có truy vấn dữ liệu từ bảng chi tiết sp nữa)
1. Tạo model chiTietSanPham
2. Trong model SanPham tạo funtion chiTietSanPham
controller

Lấy dữ liệu trong view

- Cách 2 Đơn giản hơn thì dùng select với join như Querry Builder
Phân trang

Dùng hàm paginate() có sẵn của LRV, 10 là số lượng sp trên 1 trang

- Trong view

- Hiển thị
Vào app/Providers/AppServiceProvider.php thêm useBootstrap để form
đẹp

Thêm sản phẩm(ràng buộc với bảng ct sản phẩm)


$request->all() trả về 1 mảng chứa tất cả các name được post lên từ
form
Nếu có nhiều trường trong dữ liệu $productData hơn so với các trường
trong sql, Laravel sẽ tự động lọc ra chỉ những trường tương ứng với cấu
trúc bảng và thêm chúng vào cơ sở dữ liệu.
Muốn thay ->id bằng masp thì set primarykey trong model

Trong model SanPham và ChiTietSanPham thêm fillable cho những cột


muốn add. Với $timestamps

Xóa 1 sp (có ràng buộc với ct sản phẩm)


- Trong view tạo form với method DELETE
- Controller dùng destroy() hoặc delete()
Destroy mặc định khóa chính là ‘id’ nên trong model phải set lại
khóa chính của mình

- Tạo funtion boot() trong model SanPham để xóa dữ liệu về


ChiTietSanPham liên quan trước khi xóa SanPham

- Xóa nhiều sp (ràng buộc chi tiết sp)


Tìm kiếm sp
Định dùng phân trang mà cái phân trang nó dùng get còn tìm kiếm dùng
post (đéo fix đc)

- Thêm giỏ hàng


Mặc định là đky tk sẽ tạo giỏ hàng luôn
$cart lấy thông tin giỏ hàng
Vì addCarItem là phương thức không tĩnh nên cần tạo một thể hiện
của GioHang trước khi gọi phương thức addCartItem
khai báo : private $cart;
(new đối tượng ở trong funtion nào cần thoi chứ không viết ở hàm tạo)

$this->cart = new GioHang()


- controller
public function addCart(Request $request)
{
if (auth()->check()) {
$makhachhang = auth()->user()->makhachhang;
$data = $request->all();

$this->cart = new GioHang();


$cart = $this->cart->addCartItem($makhachhang, $data);

return redirect('user/cart');
} else {
return redirect('/user/login');
}
}
- model
- self tham chiếu tới lớp hiện tại (là giohang)
- $cartitem xem có sp trong giohang chưa
- Dùng firstOrNew không hợp lý lắm vì tạo cmn giỏ hàng từ lúc
đky tk rồi nên không cần check xem tk này có giỏ hàng ko, thay
vào đó dùng where()->get() cũng đc

public function addCartItem($makhachhang, $data)

{
$cart = self::firstOrNew(['makhachhang' => $makhachhang]);

$cartItem = ChiTietGioHang::
where('magiohang', $cart->magiohang)
->where('masp', $data['masp'])->first();

if ($cartItem) {
$cartItem->soluong += $data['quantity'];
$cartItem->tongcong = $cartItem->soluong * $data['dongiaban'];
$cartItem->save();
} else {
ChiTietGioHang::create([
'magiohang' => $cart->magiohang,
'masp' => $data['masp'],
'soluong' => $data['quantity'],
'gia' => $data['dongiaban'],
'tongcong' => $data['quantity'] * $data['dongiaban']
]);
}
return $cart;
}

- Show cart
- Model viết 2 function này để kết nối giỏ hàng với ct giỏ hàng,
ct giỏ hàng với sản phẩm

- Controller
chiTietGioHangWithSanPham không sử dụng dấu ngoặc đơn () ở cuối,
nó sẽ được xem xét như một thuộc tính thường (property) thay vì một
phương thức (method). Nếu dùng () thì thêm ‘->get()’ để lấy dữ liệu.
Sửa giỏ hàng
- View đẩy mảng [ mã : số lượng]
<input type="text" name="quantity[{{ $item->mactgiohang }}]"
value="{{ $item->soluong }}">
- controller
public function updateCart(Request $request)

{
$data = $request->quantity;

foreach ($data as $mactgiohang => $quantity) {


$ctgiohang = ChiTietGioHang::where('mactgiohang', $mactgiohang)->first();
$total = $ctgiohang->gia * $quantity;
ChiTietGioHang::where('mactgiohang', $mactgiohang)->update(['soluong' => $quantity,
'tongcong' => $total]);
}
return redirect('user/cart');
}

Xóa giỏ hàng:


- view không để form xóa trong form update được,
1 là để mỗi dòng 1 nút update và xóa, 2 là để thẻ <a> như này
Thẻ <a> chỉ hỗ trợ phương thức GET
Bên controller dùng destroy cũng đc.

Show form thanh toán


Gọi hàm showCart ( chứa ctgh với tổng tiền) ở model GioHang
public function showFormPurchase()

{
$makhachhang = auth()->user()->makhachhang;
$this->cart = new GioHang();
$cartdata = $this->cart->showCart($makhachhang);
return view('User.cart.purchase', compact('cartdata'));
}

Thanh toán
Lấy mã khách hàng với thông tin nhận hàng gửi lên, gọi hàm
addHoaDonBan ( thêm hdb xong thêm cthdb theo ctgh)
public function addHoaDonBan($makhachhang, $data)
{
$giohang = new GioHang();
$allTotal = $giohang->allTotal($makhachhang);
$hdb = HoaDonBan::create([
'makhachhang' => $makhachhang,
'diachi' => $data['diachi'],
'sdt' => $data['sdt'],
'ngayban' => Carbon::now(),
'tongtien' => $allTotal
]);
$hdb_id = $hdb->sohdb;
$cart = GioHang::where('makhachhang', $makhachhang)->first();
$ctgiohang = $cart->chiTietGioHangWithSanPham;

foreach ($ctgiohang as $item) {


ChiTietHoaDonBan::create([
'masp' => $item->masp,
'sohdb' => $hdb_id,
'soluongban' => $item->soluong,
'giaban' => $item->tongcong
]);
}
$cart->chiTietGioHangWithSanPham()->delete();
return $hdb;
}

Gửi mail khi thanh toán


- .env (bật xác minh 2 bước gmail, rồi lấy mk ứng dụng)
- MAIL_MAILER=smtp
- MAIL_HOST=smtp.gmail.com
- MAIL_PORT=587
- MAIL_USERNAME='nguyenhong31081@gmail.com'
- MAIL_PASSWORD='pdccsbbuxvdurvcw'
- MAIL_ENCRYPTION=tls
- MAIL_FROM_ADDRESS="nguyenhong31081@gmail.com"
- MAIL_FROM_NAME='Shop Thái Công'

- Php artisan make:mail tên

- Gọi hàm gửi mail trong function thanh toán, truyền email khách
hàng vào to, thông tin đơn hàng là ctgh và tên khách hàng vào
send
public function purchase(Request $request)

{
$makhachhang = auth()->user()->makhachhang;
$data = $request->all();
$this->cart = new GioHang();
$cartDetail = $this->cart->showCart($makhachhang);

$mail = Mail::to($request->email)
->send(new SendMail($cartDetail, $request->name));

$this->hdb->addHoaDonBan($makhachhang, $data);
return redirect('user/cart');
}

- trong sendMail gọi dữ liệu trong hàm tạo để đẩy sang view
public $cartDetail, $name;

public function __construct($cartDetail, $name)


{
$this->name = $name;
$this->cartDetail = $cartDetail;
}

- Bước cuối là tạo view gửi mail


Quên mật khẩu:
1. Tạo view forgotPassword

2. Click Button
truy vấn bảng user theo email, nếu tồn tại email thì random Token,
add dữ liệu(token vừa tạo với email của user) vào bảng phụ
gửi token vừa tạo qua mail
public function forgotPassword(Request $request)
{
$user = User::where('email', $request->email)->first();
if ($user) {
$token = Str::random(50);
$tokenData = [
'email' => $request->email,
'token' => $token
];
if (PasswordResetTokens::create($tokenData)) {
Mail::to($request->email)->send(new ForgotPassword($user, $token));
return redirect()
->back()->withErrors(['email' => 'Please check email']);
}
} else {
return redirect()
->back()->withErrors(['email' => 'Undifine email']);
}
}
3. Trong mail gửi token sang view mail
public function __construct($user, $token)
{
$this->user = $user;
$this->token = $token;
}

4. Trong view mail gắn link chuyển tới view (resetPassword) để người
dùng tạo mk mới, đẩy token sang
<body>
<a href="{{ URL::to('/user/reset-password/' . $token) }}">Click</a>
</body>
View ResetPassword

5. Route
Route::get('/reset-password/{token}', [AuthController::class,
'showFormResetPassword']);
Route::post('/reset-password/{token}', [AuthController::class, 'resetPassword']);

6. click reset thì validate(same là không trùng)


$tokenData lấy hàng dữ liệu trong bảng phụ theo token
$user truy vấn từ tokenData tới bảng chính (theo email) để update
password mới
Rồi xóa dữ liệu ở bảng phụ theo email
public function resetPassword(Request $request, $token)
{
$request->validate([
'password' =>'required|min:4',
'confirmpassword' => 'required|same:password'
]);
$tokenData =PasswordResetTokens::where('token', $token)->firstOrFail();
$user = $tokenData->user;
$data = [
'password' => bcrypt($request->password)
];
$check = $user->update($data);
PasswordResetTokens::destroy($tokenData->email);
if ($check) {
return redirect('/user/');
}
return redirect()
->back()->withErrors(['email' => 'Invalid username or password']);
}

XÓA NHIỀU SP CÙNG LÚC


Sử dụng một hình thức của form với checkbox để chọn các sp cần xóa
1. Tạo form method POST
2. Tạo checkbox có name = mảng , value = masp

3.

4. Controller

Khai báo biến $selectedProducts gán bằng mảng chứa các masp
Kiểm tra nếu mảng có giá trị thì dùng whereIn xóa

XÓA 1 SẢN PHẨM


- Truyền đường dẫn và masp

- Nếu muốn hiện thông báo xác nhận trước khi xóa: sử dụng js
o Viết sự kiện onclick gọi đến hàm confirmDelete truyền vào masp

o Trong hàm confirmDelete: dùng confirm hiện ra thông báo

Nếu ấn ok sẽ gọi tới đối tượng có id = delete-form-masp


Action với route và masp

controller

ADD GIỎ HÀNG


Khi ấn add to cart
Tạo form POST masp, số lượng, giá bán

Route

Controller:
 Handle masp, số lượng, đơn giá, mã khách hàng
 $cart kiểm tra xem tk đã có giỏ hàng chưa
 If (nếu tk có giỏ hàng){
Kiểm tra sản phẩm đã có trong ctgiohang chưa (where theo
mã giỏ hàng và mã sp)
If(nếu sp có trong ctgiohang){
Cập nhật lại số lượng và tổng tiền
}else (sp chưa có trong ctgiohang){
Thêm mới vào ctgiohang
}
}else (tk chưa có giỏ hàng){
Thêm mới giỏ hàng
Dùng lastInsertId() để lấy id của giỏ hàng vừa thêm
Thêm mới sp vào ctgiohang
}

UPDATE GIỎ HÀNG


Tạo form POST – trong cột số lượng đặt name là mảng với
key = mã ctgiohang, value = số lượng

Route

Controller
Dùng foreach để update số lượng từng sp theo mactgiohang
$ctgiohang để bên dưới lấy thông tin về giá tiền

----
public function addCartItem($makhachhang, $data)
{
$cart = self::firstOrNew(['makhachhang' => $makhachhang]);
$cartItem = ChiTietGioHang::where('magiohang', $cart->magiohang)
->where('masp', $data['masp'])->first();
if ($cartItem) {
$cartItem->soluong += $data['quantity'];
$cartItem->tongcong = $cartItem->soluong * $data['dongiaban'];
$cartItem->save();
} else {
ChiTietGioHang::create([
'magiohang' => $cart->magiohang,
'masp' => $data['masp'],
'soluong' => $data['quantity'],
'gia' => $data['dongiaban'],
'tongcong' => $data['quantity'] * $data['dongiaban']
]);
}
return $cart;
}

You might also like