Professional Documents
Culture Documents
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
Đă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
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
- Cách 2 Đơn giản hơn thì dùng select với join như Querry Builder
Phân trang
- Trong view
- Hiển thị
Vào app/Providers/AppServiceProvider.php thêm useBootstrap để form
đẹp
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
{
$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;
{
$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;
- 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;
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']);
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
- 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
controller
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
}
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;
}