MOON
Server: Apache
System: Linux server.royaltuning.hu 4.18.0-425.13.1.el8_7.x86_64 #1 SMP Tue Feb 21 04:20:52 EST 2023 x86_64
User: royaltuning (1001)
PHP: 8.2.32
Disabled: exec,passthru,shell_exec,system
Upload Files
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);

    }
}