HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/Eurotools/euro-tools.nl/app/KommaApp/Languages/LanguageService.php
<?php


namespace App\KommaApp\Languages;

use App\KommaApp\Languages\Models\Language;
use App\KommaApp\Kms\Core\AbstractTranslatableModel;
use App\KommaApp\Pages\Models\Page;
use App\KommaApp\Routes\Models\Route;
use App\KommaApp\Shop\Categories\Models\Category;
use App\KommaApp\Shop\Categories\Models\CategoryTranslation;
use App\KommaApp\Shop\Products\Product\Product;
use App\KommaApp\Shop\Products\Product\ProductTranslation;

/**
 * Can fill some models with their respective translation models.
 * And in the future will be able to set and change the users site language
 *
 * Class LanguageService
 * @package App\KommaApp\Core
 */
class LanguageService
{

    /**
     * @param Page $page
     * @param AbstractTranslatableModel|null $model
     * @return object
     */
    public function getOtherLanguagesRoutes(Page $page, AbstractTranslatableModel $model = null)
    {
        // Load route because we want to use the route column to get all related routes
        $page->load('translation.route');

        $languageSwitch = (object)[
            'metaTranslationRoutes' => [],
            'languageMenuRoutes' => []
        ];

        $availableTranslationIds = [];

        // First inject language route on available site languages into the language switch
        foreach (\App::getSite()->languages as $language) {
            $alias = '';
            if ($language->id == \App::getSite()->default_language_id) {
                $alias = '';
            } else {
                $alias = $language->iso_2;
            }

            $languageSwitch->languageMenuRoutes[$language->id] = (object)[
                'iso' => $language->iso_2,
                'route' => $alias
            ];
            $availableTranslationIds[] = $language->id;
        }

        // Then inject page route

        if($page->translation->route) {
            $pageTranslationRoutes = Route::where('route', $page->translation->route->route)
                ->whereIn('language_id', $availableTranslationIds)
                ->get();
        } else {
            $pageTranslationRoutes = [];
        }

        foreach ($pageTranslationRoutes as $translationRoute) {
            $languageSwitch->languageMenuRoutes[$translationRoute->language_id]->route = $translationRoute->alias;
        }

        // Check if a subModel is defined like a product or a post
        if ($model) {
            //dd($languageSwitch->languageMenuRoutes);
            switch (get_class($model)) {
                case Category::class:

                    $parentModel = $model->getParent();

                    foreach (\App::getSite()->languages as $language) {
                        if ($categoryTranslation = CategoryTranslation::where('category_id', '=', $model->id)->where('language_id', '=', $language->id)->first()) {
                            $routeString = $language->iso_2.'/';
                            if ($parentModel->lft > 1 && $parentCategoryTranslation = CategoryTranslation::where('category_id',
                                    '=', $parentModel->id)->where('language_id', '=', $language->id)->first()) {
                                $routeString .= $parentCategoryTranslation->slug . '/';
                            }
                            $routeString .= $categoryTranslation->slug;
                            $languageSwitch->languageMenuRoutes[$language->id]->route = $routeString;
                        }
                    }
                    break;
                case Product::class:
                    foreach (\App::getSite()->languages as $language) {
                        if ($productTranslation = ProductTranslation::where('product_id', '=', $model->id)->where('language_id', '=', $language->id)->first()) {
                            if(empty($productTranslation->slug)) continue;
                            $routeString = $languageSwitch->languageMenuRoutes[$language->id]->route;

                            $routeString .= '/'.$productTranslation->slug;
                            $languageSwitch->languageMenuRoutes[$language->id]->route = $routeString;
                        }
                    }
                    break;
            }
        } // If not then we are on a page so the metaTranslation are the same as available page translations
        else {
            // Loop through page translations again and look up the found translations in the language menu routes
            // so now only the defined translation of the page will be add to the meta routes
            foreach ($pageTranslationRoutes as $translationRoute) {
                if (isset($languageSwitch->languageMenuRoutes[$translationRoute->language_id])) {
                    $languageSwitch->metaTranslationRoutes[$translationRoute->language_id] = $languageSwitch->languageMenuRoutes[$translationRoute->language_id];
                }
            }
        }

        return $languageSwitch;
    }
}