FleetCart/Themes/Storefront/Http/ViewComposers/HomePageComposer.php
2023-06-11 13:14:03 +01:00

183 lines
6.2 KiB
PHP

<?php
namespace Themes\Storefront\Http\ViewComposers;
use Themes\Storefront\Banner;
use Themes\Storefront\Feature;
use Modules\Brand\Entities\Brand;
use Illuminate\Support\Collection;
use Modules\Slider\Entities\Slider;
use Illuminate\Support\Facades\Cache;
use Modules\Category\Entities\Category;
class HomePageComposer
{
/**
* Bind data to the view.
*
* @param \Illuminate\View\View $view
* @return void
*/
public function compose($view)
{
$view->with([
'slider' => Slider::findWithSlides(setting('storefront_slider')),
'sliderBanners' => Banner::getSliderBanners(),
'features' => Feature::all(),
'featuredCategories' => $this->featuredCategoriesSection(),
'threeColumnFullWidthBanners' => $this->threeColumnFullWidthBanners(),
'productTabsOne' => $this->productTabsOne(),
'topBrands' => $this->topBrands(),
'flashSaleAndVerticalProducts' => $this->flashSaleAndVerticalProducts(),
'twoColumnBanners' => $this->twoColumnBanners(),
'productGrid' => $this->productGrid(),
'threeColumnBanners' => $this->threeColumnBanners(),
'tabProductsTwo' => $this->tabProductsTwo(),
'oneColumnBanner' => $this->oneColumnBanner(),
]);
}
private function featuredCategoriesSection()
{
if (! setting('storefront_featured_categories_section_enabled')) {
return;
}
return [
'title' => setting('storefront_featured_categories_section_title'),
'subtitle' => setting('storefront_featured_categories_section_subtitle'),
'categories' => $this->getFeaturedCategories(),
];
}
private function getFeaturedCategories()
{
$categoryIds = Collection::times(6, function ($number) {
if (! is_null(setting("storefront_featured_categories_section_category_{$number}_product_type"))) {
return setting("storefront_featured_categories_section_category_{$number}_category_id");
}
})->filter();
return Category::with('files')
->whereIn('id', $categoryIds)
->when($categoryIds->isNotEmpty(), function ($query) use ($categoryIds) {
$query->orderByRaw("FIELD(id, {$categoryIds->filter()->implode(',')})");
})
->get()
->map(function ($category) {
return [
'name' => $category->name,
'logo' => $category->logo,
];
});
}
private function threeColumnFullWidthBanners()
{
if (setting('storefront_three_column_full_width_banners_enabled')) {
return Banner::getThreeColumnFullWidthBanners();
}
}
private function productTabsOne()
{
if (! setting('storefront_product_tabs_1_section_enabled')) {
return;
}
return Collection::times(4, function ($number) {
if (! is_null(setting("storefront_product_tabs_1_section_tab_{$number}_product_type"))) {
return setting("storefront_product_tabs_1_section_tab_{$number}_title");
}
})->filter();
}
private function topBrands()
{
if (! setting('storefront_top_brands_section_enabled')) {
return collect();
}
$topBrandIds = setting('storefront_top_brands', []);
return Cache::rememberForever(md5('storefront_top_brands:' . serialize($topBrandIds)), function () use ($topBrandIds) {
return Brand::with('files')
->whereIn('id', $topBrandIds)
->when(! empty($topBrandIds), function ($query) use ($topBrandIds) {
$topBrandIdsString = collect($topBrandIds)->filter()->implode(',');
$query->orderByRaw("FIELD(id, {$topBrandIdsString})");
})
->get()
->map(function (Brand $brand) {
return [
'url' => $brand->url(),
'logo' => $brand->getLogoAttribute(),
];
});
});
}
private function flashSaleAndVerticalProducts()
{
return [
'flash_sale_title' => setting('storefront_flash_sale_title'),
'vertical_products_1_title' => setting('storefront_vertical_products_1_title'),
'vertical_products_2_title' => setting('storefront_vertical_products_2_title'),
'vertical_products_3_title' => setting('storefront_vertical_products_3_title'),
];
}
private function twoColumnBanners()
{
if (setting('storefront_two_column_banners_enabled')) {
return Banner::getTwoColumnBanners();
}
}
private function productGrid()
{
if (! setting('storefront_product_grid_section_enabled')) {
return;
}
return Collection::times(4, function ($number) {
if (! is_null(setting("storefront_product_grid_section_tab_{$number}_product_type"))) {
return setting("storefront_product_grid_section_tab_{$number}_title");
}
})->filter();
}
private function threeColumnBanners()
{
if (setting('storefront_three_column_banners_enabled')) {
return Banner::getThreeColumnBanners();
}
}
private function tabProductsTwo()
{
if (! setting('storefront_product_tabs_2_section_enabled')) {
return;
}
$tabs = Collection::times(4, function ($number) {
if (! is_null(setting("storefront_product_tabs_2_section_tab_{$number}_product_type"))) {
return setting("storefront_product_tabs_2_section_tab_{$number}_title");
}
})->filter();
return [
'title' => setting('storefront_product_tabs_2_section_title'),
'tabs' => $tabs,
];
}
private function oneColumnBanner()
{
if (setting('storefront_one_column_banner_enabled')) {
return Banner::getOneColumnBanner();
}
}
}