Please show some code. It's impossible to guess the error without it
"trying to access array offset on value of type null ['subtotal']".
Hello Guys i've been following this Laravel/livewire E-Commerce series and i ecountered this frustrating error. Everything seems to be oky with the code but each time i click on the place order button from my checkout page, it raises a "trying to access array offset on value of type null ['subtotal']". i really dont know what to do. i am kinda a newbie. will really appreciate if someone helps me out. thanks.
this is how my checkout compopnent looks like
@Sinnbeck my appologies i just updated the post
@joshua_bognet ok?
@joshua_bognet Hello sir.. I have the same problem. If you solved this problem please kindly tell me what I want to do. this is my email [email protected]
or if anyone can solve this problem please help me
Still same error
@joshua_bognet yes. But you haven't shown any code?
this is how my checkout compopnent looks like
To add code you add ``` on the line before and after your code
@Sinnbeck hello sir or can I give you a Link to my repo? So you can help me check it out?
<?php
namespace App\Http\Livewire;
use Cart;
use App\Models\Order;
use Livewire\Component;
use App\Models\Shipping;
use App\Models\OrderItem;
use App\Models\Transaction;
use Illuminate\Support\Facades\Auth;
class CheckoutComponent extends Component
{
public $ship_to_different;
public $firstname;
public $lastname;
public $email;
public $mobile;
public $line1;
public $line2;
public $city;
public $state;
public $country;
public $zipcode;
public $s_firstname;
public $s_lastname;
public $s_email;
public $s_mobile;
public $s_line1;
public $s_line2;
public $s_city;
public $s_state;
public $s_country;
public $s_zipcode;
public $paymentmode;
public $thankyou;
public function updated($fields)
{
$this->validateOnly($fields, [
'firstname' => 'required',
'lastname' => 'required',
'email' => 'required|email',
'mobile' => 'required|numeric',
'line1' => 'required',
'city' => 'required',
'state' => 'required',
'country' => 'required',
'zipcode' => 'required',
'paymentmode' => 'required'
]);
if ($this->ship_to_different)
{
$this->validateOnly($fields, [
's_firstname' => 'required',
's_lastname' => 'required',
's_email' => 'required|email',
's_mobile' => 'required|numeric',
's_line1' => 'required',
's_city' => 'required',
's_state' => 'required',
's_country' => 'required',
's_zipcode' => 'required'
]);
}
}
public function placeOrder()
{
$this->validate([
'firstname' => 'required',
'lastname' => 'required',
'email' => 'required|email',
'mobile' => 'required|numeric',
'line1' => 'required',
'city' => 'required',
'state' => 'required',
'country' => 'required',
'zipcode' => 'required',
'paymentmode' => 'required'
]);
$order = new Order();
$order->user_id = Auth::user()->id;
$order->subtotal = session()->get('checkout')['subtotal'];
$order->discount = session()->get('checkout')['discount'];
$order->tax = session()->get('checkout')['tax'];
$order->total = session()->get('checkout')['total'];
$order->firstname = $this->firstname;
$order->lastname = $this->lastname;
$order->email = $this->email;
$order->mobile = $this->mobile;
$order->line1 = $this->line1;
$order->line2 = $this->line2;
$order->city = $this->city;
$order->state = $this->state;
$order->country = $this->country;
$order->zipcode = $this->zipcode;
$order->status = 'ordered';
$order->is_shipping_different = $this->ship_to_different ? 1:0;
$order->save();
foreach (Cart::instance('cart')->content() as $item) {
$orderItem = new OrderItem();
$orderItem->product_id = $item->id;
$orderItem->order_id = $order->id;
$orderItem->price = $item->price;
$orderItem->quantity = $item->qty;
$orderItem->save();
}
if ($this->ship_to_different) {
$this->validate([
's_firstname' => 'required',
's_lastname' => 'required',
's_email' => 'required|email',
's_mobile' => 'required|numeric',
's_line1' => 'required',
's_city' => 'required',
's_state' => 'required',
's_country' => 'required',
's_zipcode' => 'required'
]);
$shipping = new Shipping();
$shipping->order_id = $order->id;
$shipping->firstname = $this->s_firstname;
$shipping->lastname = $this->s_lastname;
$shipping->email = $this->s_email;
$shipping->mobile = $this->s_mobile;
$shipping->line1 = $this->s_line1;
$shipping->line2 = $this->s_line2;
$shipping->city = $this->s_city;
$shipping->state = $this->s_state;
$shipping->country = $this->s_country;
$shipping->zipcode = $this->s_zipcode;
$shipping->save();
}
if ($this->paymentmode == 'cod') {
$transaction = new Transaction();
$transaction->user_id = Auth::user()->id;
$transaction->order_id = $order->id;
$transaction->mode = 'cod';
$transaction->status = 'pending';
$transaction->save();
}
$this->thankyou = 1;
Cart::instance('cart')->destroy();
session()->forget('checkout');
}
public function verifyForCheckout()
{
if(!Auth::check())
{
return redirect()->route('login');
}
else if($this->thankyou)
{
return redirect()->route('thankyou');
}
else if(!session()->get('checkout'))
{
return redirect()->route('product.cart');
}
}
public function render()
{
// $this->verifyForCheckout();
return view('livewire.checkout-component')->layout('layouts.master');
}
}
the checkout component blade
<main id="main" class="main-site">
<div class="container">
<div class=" main-content-area">
<form wire:submit.prevent="placeOrder">
<div class="row">
<div class="col-md-12">
<div class="wrap-address-billing">
<h3 class="box-title">Billing Address</h3>
<div class="billing-address">
<p class="row-in-form">
<label for="fname">first name<span>*</span></label>
<input type="text" name="fname" value="" placeholder="Your name"
wire:model="firstname">
@error('firstname')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="lname">last name<span>*</span></label>
<input type="text" name="lname" value=""
placeholder="Your last name"wire:model="lastname">
@error('lastname')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="email">Email Addreess:</label>
<input type="email" name="email" value=""
placeholder="Type your email" wire:model="email">
@error('email')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="phone">Phone number<span>*</span></label>
<input type="number" name="phone" value=""
placeholder="10 digits format" wire:model="mobile">
@error('mobile')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="add">Line 1:</label>
<input type="text" name="add" value=""
placeholder="Street at apartment number" wire:model="line1">
@error('line1')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="add">Line 2:</label>
<input type="text" name="add" value=""
placeholder="Street at apartment number" wire:model="line2">
</p>
<p class="row-in-form">
<label for="country">Country<span>*</span></label>
<input type="text" name="country" value=""
placeholder="United States" wire:model="country">
@error('country')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="city">State<span>*</span></label>
<input type="text" name="state" value="" placeholder="State name"
wire:model="state">
@error('state')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="city">Town / City<span>*</span></label>
<input type="text" name="city" value="" placeholder="City name"
wire:model="city">
@error('city')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="zip-code">Postcode / ZIP:</label>
<input type="number" name="zip-code" value=""
placeholder="Your postal code" wire:model="zipcode">
@error('zipcode')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form fill-wife">
<label class="checkbox-field">
<input name="different-add" id="different-add" value="1"
type="checkbox" wire:model="ship_to_different">
<span>Ship to a different address?</span>
</label>
</p>
</div>
</div>
</div>
@if($ship_to_different)
<div class="col-md-12">
<div class="wrap-address-billing">
<h3 class="box-title">Shipping Address</h3>
<div class="billing-address">
<p class="row-in-form">
<label for="fname">first name<span>*</span></label>
<input type="text" name="fname" value=""
placeholder="Your name" wire:model="s_firstname">
@error('s_firstname')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="lname">last name<span>*</span></label>
<input type="text" name="lname" value=""
placeholder="Your last name"wire:model="s_lastname">
@error('s_lastname')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="email">Email Addreess:</label>
<input type="email" name="email" value=""
placeholder="Type your email" wire:model="s_email">
@error('s_email')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="phone">Phone number<span>*</span></label>
<input type="number" name="phone" value=""
placeholder="10 digits format" wire:model="s_mobile">
@error('s_mobile')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="add">Line 1:</label>
<input type="text" name="add" value=""
placeholder="Street at apartment number" wire:model="s_line1">
@error('s_line1')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="add">Line 2:</label>
<input type="text" name="add" value=""
placeholder="Street at apartment number" wire:model="s_line2">
</p>
<p class="row-in-form">
<label for="country">Country<span>*</span></label>
<input type="text" name="country" value=""
placeholder="United States" wire:model="s_country">
@error('s_country')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="city">State<span>*</span></label>
<input type="text" name="state" value=""
placeholder="State name" wire:model="s_state">
@error('s_state')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="city">Town / City<span>*</span></label>
<input type="text" name="city" value=""
placeholder="City name" wire:model="s_city">
@error('s_city')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
<p class="row-in-form">
<label for="zip-code">Postcode / ZIP:</label>
<input type="number" name="zip-code" value=""
placeholder="Your postal code" wire:model="s_zipcode">
@error('s_zipcode')
<span class="text-danger">{{ $message }}</span>
@enderror
</p>
</div>
</div>
</div>
@endif
</div>
<div class="summary summary-checkout">
<div class="summary-item payment-method">
<h4 class="title-box">Payment Method</h4>
<p class="summary-info"><span class="title">Check / Money order</span></p>
<p class="summary-info"><span class="title">Credit Cart (saved)</span></p>
<div class="choose-payment-methods">
<label class="payment-method">
<input name="payment-method" id="payment-method-bank" value="cod"
type="radio" wire:model="paymentmode">
<span>Cash On Delivery</span>
<span class="payment-desc">Order Now And Pay On Delivery</span>
</label>
<label class="payment-method">
<input name="payment-method" id="payment-method-visa" value="card"
type="radio" wire:model="paymentmode">
<span>Debit/Credit Card</span>
<span class="payment-desc">There are many variations of passages of Lorem Ipsum
available</span>
</label>
<label class="payment-method">
<input name="payment-method" id="payment-method-paypal" value="paypal"
type="radio" wire:model="paymentmode">
<span>Paypal</span>
<span class="payment-desc">You can pay with your credit</span>
<span class="payment-desc">card if you don't have a paypal account</span>
</label>
@error('paymentmode')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
@if(Session::has('checkout'))
<p class="summary-info grand-total"><span>Grand Total</span> <span
class="grand-total-price">₦{{ Session::get('checkout')['total'] }}</span>
</p>
@endif
<button type="submit" class="btn btn-medium" >Place order now</button>
</div>
<div class="summary-item shipping-method">
<h4 class="title-box f-title">Shipping method</h4>
<p class="summary-info"><span class="title">Flat Rate</span></p>
<p class="summary-info"><span class="title">Fixed ₦0</span></p>
</div>
</div>
</form>
</div>
</div>
</main>
@joshua_bognet This line
$order->subtotal = session()->get('checkout')['subtotal'];
If session()->get('checkout') does not return an array with that key it all fails. So add a fallback
$order->subtotal = session()->get('checkout')['subtotal'] ?? 100000000000000000000000000000;
@Sinnbeck Thank you very much
@Sinnbeck Sir, I add a fallback to my code and after that it didn't show any error. but I noticed that when I make a new order, The total and subtotal didn't update in database.
this is the code,
$order = new Order(); $order->user_id = Auth::user()->id; $order->subtotal = session()->get('checkout')['subtotal']?? 100000000000000000000000000000; $order->total = session()->get('checkout')['total']?? 100000000000000000000000000000; $order->firstname = $this->firstname; $order->lastname = $this->lastname; $order->email = $this->email; $order->mobile = $this->mobile; $order->line1 = $this->line1; $order->line2 = $this->line2; $order->city = $this->city; $order->province = $this->province; $order->country = $this->country; $order->zipcode = $this->zipcode; $order->status = 'ordered'; $order->is_shipping_different = $this->ship_to_different ? 1:0; $order->save();
other fields (firstname,lastname,mobile, ...) are updated without any error. Please can you give any solution?
@Salman98 try this code below
Here the checkoutcomponent.php file
https://drive.google.com/drive/folders/1VXCvZdmVCODpStetW6iLsLYxzxZk66IP?usp=sharing
$order = new Order();
if(session()->has('coupon'))
{
$order->user_id = Auth::user()->id;
$order->subtotal = session()->get('checkout')['subtotal'];
$order->discount = session()->get('checkout')['discount'] ?? True;
$order->tax = session()->get('checkout')['tax'] ?? True;
$order->total = session()->get('checkout')['total'] ?? True;
$order->firstname = $this->firstname;
$order->lastname = $this->lastname;
$order->email = $this->email;
$order->mobile = $this->mobile;
$order->line1 = $this->line1;
$order->line2 = $this->line2;
$order->city = $this->city;
$order->state = $this->state;
$order->country = $this->country;
$order->zipcode = $this->zipcode;
$order->status = 'ordered';
$order->is_shipping_different = $this->ship_to_different ? 1 : 0;
$order->save();
}
else
{
$order->user_id = Auth::user()->id;
$order->subtotal = session()->get('checkout', Cart::instance('cart')->subtotal());
$order->discount = session()->get('checkout')['discount'] ?? True;
$order->tax = session()->get('checkout', Cart::instance('cart')->tax());
$order->total = session()->get('checkout', Cart::instance('cart')->total());
$order->firstname = $this->firstname;
$order->lastname = $this->lastname;
$order->email = $this->email;
$order->mobile = $this->mobile;
$order->line1 = $this->line1;
$order->line2 = $this->line2;
$order->city = $this->city;
$order->state = $this->state;
$order->country = $this->country;
$order->zipcode = $this->zipcode;
$order->status = 'ordered';
$order->is_shipping_different = $this->ship_to_different ? 1 : 0;
$order->save();
}
Please or to participate in this conversation.