File: //var/www/html/Modules/Product/Http/Controllers/ProductController.php
<?php
namespace Modules\Product\Http\Controllers;
use EonVisualMedia\LaravelKlaviyo\Klaviyo;
use EonVisualMedia\LaravelKlaviyo\TrackEvent;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use Modules\Category\Entities\Category;
use Modules\Page\Entities\Page;
use Modules\Review\Entities\Review;
use Modules\Product\Entities\Product;
use Modules\Product\Events\ProductViewed;
use Modules\Product\Filters\ProductFilter;
use Modules\Product\Http\Middleware\SetProductSortOption;
use Spatie\Sitemap\Sitemap;
class ProductController extends Controller
{
use ProductSearch;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware(SetProductSortOption::class)->only('index');
}
/**
* Display a listing of the resource.
*
* @param \Modules\Product\Entities\Product $model
* @param \Modules\Product\Filters\ProductFilter $productFilter
* @return \Illuminate\Http\Response
*/
public function index(Product $model, ProductFilter $productFilter)
{
$user = Auth::user();
if (isset($user->email)) {
if (request()->category) {
$category = Category::findBySlug(request()->category);
Klaviyo::track(TrackEvent::make(
'Viewed Category',
[
'AddedTitle' => $category->name
],
[
'$email' => $user->email,
'$first_name' => $user->first_name,
'$last_name' => $user->last_name
],
));
}
}
if (request()->expectsJson()) {
return $this->searchProducts($model, $productFilter);
}
return view('public.products.index');
}
/**
* Show the specified resource.
*
* @param string $slug
* @return \Illuminate\Http\Response
*/
public function show($slug)
{
$product = Product::findBySlug($slug);
$relatedProducts = $product->relatedProducts()->forCard()->get();
$upSellProducts = $product->upSellProducts()->forCard()->get();
$review = $this->getReviewData($product);
$user = Auth::user();
if (isset($user->email)) {
Klaviyo::track(TrackEvent::make(
'Viewed Product',
[
'$value' => (int)$product->selling_price->convertToCurrentCurrency()->amount(),
'Viewed Product Value' => (int)$product->selling_price->convertToCurrentCurrency()->amount(),
'Title' => $product->name,
'ItemId' => $product->sku,
"ProductID" => $product->id,
'Url' => "https://royaltuning.hu/termek/" . $product->slug,
'ImageUrl' => $product->base_image->path
],
[
'$email' => $user->email,
'$first_name' => $user->first_name,
'$last_name' => $user->last_name
],
));
}
event(new ProductViewed($product));
return view('public.products.show', compact('product', 'relatedProducts', 'upSellProducts', 'review'));
}
/**
* Show the specified resource.
*
* @param int $id
* @return \Modules\Product\Entities\Product
*/
public function findById($id)
{
$product = Product::findById($id);
return $product;
}
private function getReviewData(Product $product)
{
if (!setting('reviews_enabled')) {
return;
}
return Review::countAndAvgRating($product);
}
public function generateProductSitemap()
{
$sitemapIndexPath = "sitemap_product.xml";
$products = Product::where("is_active", 1)->get();
$sitemap = Sitemap::create();
foreach ($products as $product) {
$sitemap->add('termek/' . $product->slug);
}
$sitemap->writeToFile($sitemapIndexPath);
}
}