Your IP : 216.73.216.224


Current Path : /var/www/html/libraries/noboss/src/Util/
Upload File :
Current File : /var/www/html/libraries/noboss/src/Util/NbUrlUtil.php

<?php
/**
 * @package			No Boss Extensions
 * @subpackage  	No Boss Library
 * @author			No Boss Technology <contact@nobosstechnology.com>
 * @copyright		Copyright (C) 2026 No Boss Technology. All rights reserved.
 * @license			GNU Lesser General Public License version 3 or later; see <https://www.gnu.org/licenses/lgpl-3.0.en.html>
 */

namespace Noboss\Library\Util;

use Joomla\CMS\Language\LanguageHelper;
use Joomla\CMS\Language\Multilanguage;
// use Joomla\CMS\Language\Associations;
use Joomla\CMS\Factory;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Registry\Registry;

// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects

class NbUrlUtil {
	/**
	*	Função que recebe um item de menu e retorna a URL para ele (ou para um associado) mantendo consistências de idioma
	* analisando qual idioma padrão/idioma atual e idioma do item de menu.
	*
	* @param 	int 		$idMenu 				ID do item de menu para o qual se deseja a URL
	* @param 	boolean		$fullUrl (optional) 	Boolean informando se deve ser retornada a url completa ou apenas o route do item de menu
	* @param 	string		$tagLanguageFixed 		Tag de idioma que deve ser informado na url (quando usuario quiser fixar uma)
	*
	* @return 	mixed 		URL para o item de menu (ou associado) passado via parâmetro ou false caso não encontrado
	**/
	public static function getUrlItemMenu($idMenu, $fullUrl = true, $tagLanguageFixed = '') {
        $config = Factory::getApplication()->getConfig();
		$paramsLanguage = ComponentHelper::getParams("com_languages");
		$app = Factory::getApplication();

		$menu = $app->getMenu('site');
		
        // Carrega dados do item de menu recebido como parametro
		$menuItem = $menu->getItem($idMenu);

		if(!$menuItem) {
			return false;
        }

        // Declara variavel que ira armazenar a url completa a ser retornada
        $urlCompleteReturn = '';       

        // Item de menu nao eh home: armazena alias do menu como url
        if (!$menuItem->home){
            $urlCompleteReturn = $menuItem->route;
        }

        // Plugin de filtro de idioma na url esta ativo no site
        if(PluginHelper::isEnabled('system', 'languagefilter')){
            // Obtem parametros do plugin de filtro de idioma
            $pluginLanguageFilter = PluginHelper::getPlugin('system', 'languagefilter');
            $pluginLanguageFilterParams = json_decode($pluginLanguageFilter->params);
            
            // Idioma default do site
            $languageDefaultWebsite = $paramsLanguage->get("site");

            // Tag do idioma que usuario esta navegando no site
            $languageActiveNavigation = Factory::getApplication()->getLanguage()->getTag();
            
            // Idioma do item de menu
            $languageItemMenu = $menuItem->language;

            /*// Idioma que usuario esta navegando eh o mesmo do item de menu
            if($languageActiveNavigation == $languageItemMenu) {
                // Item de menu nao eh home: armazena alias do menu como url
                if (!$menuItem->home){
                    $urlCompleteReturn = $menuItem->route;
                }
            }
            // Idioma que usuario esta navegando eh diferente do idioma do item de menu
            else {
                // Procura itens de menu associados ao item de menu passado via parametro
                $associatedMenuItens = Associations::getAssociations('com_menus', '#__menu', 'com_menus.item', $idMenu, 'id', 'alias', null);
                
                // Localizado item de menu associado ao idioma que usuario esta navegando
                if(isset($associatedMenuItens[$languageActiveNavigation])) {
                    // Armazena o objeto que contém o idioma do item de menu associado ao idioma + string "id:alias"
                    $currentLanguageMenuItemEquivalent = $associatedMenuItens[$languageActiveNavigation];
                    
                    // Armazena o ID do item de menu associado ao idioma quebrando a string "id:alias"
                    $currentLanguageMenuItemEquivalentID = explode(":", $currentLanguageMenuItemEquivalent->id);
                    $currentLanguageMenuItemEquivalentID = $currentLanguageMenuItemEquivalentID[0];
                    
                    // Armazena na variável agora o objeto completo do item de menu associado ao idioma
                    $currentLanguageMenuItemEquivalent = $menu->getItem($currentLanguageMenuItemEquivalentID);
                    
                    // Item de menu nao eh home: armazena alias do menu como url
                    if (!$currentLanguageMenuItemEquivalent->home){
                        //Armazena o route do item de menu associado ao idioma 
                        $urlCompleteReturn = $currentLanguageMenuItemEquivalent->route;
                    }
                    
                    //Sobrescreve o idioma do menu usando o language do equivalente
                    $languageItemMenu = $currentLanguageMenuItemEquivalent->language;
                } 
                // Nao existe item de menu associado
                else {
                    // Item de menu nao eh home: armazena alias do menu como url
                    if (!$menuItem->home){
                        $urlCompleteReturn = $menuItem->route;
                    }
                }
            }*/

            $SEF = '';

            // Array com todos os idiomas do site
            $languagesWebsiteArray = LanguageHelper::getLanguages('lang_code');

            // Sef do idioma default do site
            $SefDefaultWebsite = $languagesWebsiteArray[$languageDefaultWebsite]->sef;

            // Usuario determinou qual tag deve ser fixada tag de idioma na url
            if ($tagLanguageFixed != ''){
                // Obtem SEF do idioma passado como parametro
                if(isset($languagesWebsiteArray[$tagLanguageFixed])){
                    $SEF = $languagesWebsiteArray[$tagLanguageFixed]->sef;
                }   
            }
            // Idioma que usuario esta navegando eh o mesmo do item de menu ou item de menu esta habilitado para todos idiomas
            else if(($languageActiveNavigation == $languageItemMenu) || ($languageItemMenu == '*')) {
                // Obtem SEF do idioma que usuario esta navegando
                $SEF = $languagesWebsiteArray[$languageActiveNavigation]->sef;
            }

            // Idioma que usuario esta navegando eh diferente do idioma do item de menu
            else{
                // Obtem SEF do idioma do item de menu
                $SEF = $languagesWebsiteArray[$languageItemMenu]->sef;
            }

            // Sef do idioma a adicionar na url eh o mesmo do idioma default do site e esta setado para nao colocar prefixo na url para idioma default
            if(($SEF == $SefDefaultWebsite) && ($pluginLanguageFilterParams->remove_default_prefix == 1)){
                // Nada a fazer, pois nao deve ser colocado prefixo na url
            }
            else{
                // Concatena SEF com a url a ser retornada
                $urlCompleteReturn = $SEF . '/' . $urlCompleteReturn;
            }
        }
		
		// Setado para retornar url completa
		if($fullUrl) {
			// Retira barra do inicio da url armazenada ateh entao, caso possua
			if(!empty($urlCompleteReturn) && ($urlCompleteReturn[0] == "/")){
				$urlCompleteReturn = substr($urlCompleteReturn, 1);
			}

            // URL Rewriting esta habilitado: monta url sem colocar '/index.php/'
            if ($config->get('sef_rewrite') == 1){
                $urlCompleteReturn =  Uri::root() . $urlCompleteReturn;
            }
            else{
                $urlCompleteReturn =  Uri::root() . "index.php/" . $urlCompleteReturn;
            }
		}

		// Se a url terminar com uma barra no final, retira
		if (substr($urlCompleteReturn, -1) == '/'){
			$urlCompleteReturn = substr($urlCompleteReturn, 0, -1);
		}

		return $urlCompleteReturn;
	}

	/**
	 * Em contexto administrativo: se o site é multilíngue (languagefilter) e o idioma atual do admin
	 * existe nos idiomas de conteúdo publicados, acrescenta o parâmetro lang (SEF) à URL interna do site.
	 * Respeita remove_default_prefix do plugin quando o idioma coincide com o padrão do site.
	 *
	 * @param   string  $internalSiteUrl  URL interna do site (ex.: index.php?option=com_example)
	 *
	 * @return  string  URL interna com &lang=... quando aplicável
	 */
	public static function appendAdminMatchingSiteLanguage(string $internalSiteUrl): string
	{
		if (!Multilanguage::isEnabled()) {
			return $internalSiteUrl;
		}

		$app           = Factory::getApplication();
		$languageTag   = $app->getLanguage()->getTag();
		$languagesSite = LanguageHelper::getLanguages('lang_code');

		if (!isset($languagesSite[$languageTag])) {
			return $internalSiteUrl;
		}

		$paramsLanguage           = ComponentHelper::getParams('com_languages');
		$languageDefaultWebsite   = $paramsLanguage->get('site');
		$pluginLanguageFilter     = PluginHelper::getPlugin('system', 'languagefilter');
		$pluginLanguageFilterParams = new Registry($pluginLanguageFilter->params ?? '{}');

		if (!isset($languagesSite[$languageDefaultWebsite])) {
			return $internalSiteUrl;
		}

		$langSef           = $languagesSite[$languageTag]->sef;
		$sefDefaultWebsite = $languagesSite[$languageDefaultWebsite]->sef;

		if (
			$langSef === $sefDefaultWebsite
			&& (int) $pluginLanguageFilterParams->get('remove_default_prefix', 0) === 1
		) {
			return $internalSiteUrl;
		}

		$separator = str_contains($internalSiteUrl, '?') ? '&' : '?';

		return $internalSiteUrl . $separator . 'lang=' . $langSef;
	}

	/**
	*	Função que retorna a url base da plataforma No Boss Extensions para a realizacao de requisicoes
    * @param 	int  $isHom	Boolean informando que requisicao a considerar deve ser feita para HOM
	*
	* 	@return 	String 		Url base da plataforma
	**/
	public static function getUrlNbExtensions($isHom = 0){
		// Objeto com dados do config
		$config = Factory::getApplication()->getConfig();

        // Obtem a tag do idioma que esta sendo navegado
        $languageActiveNavigation = Factory::getApplication()->getLanguage()->getTag();
		$languages = LanguageHelper::getLanguages('lang_code');
		
        $langSef = '';

        // Language definido para navegacao no site: obtem sef do idioma
        if(!empty($languages[$languageActiveNavigation])){
            $langSef = $languages[$languageActiveNavigation]->sef;
        }
        // Pega o sef do idioma default
        else{
            //Pega parametros do componente "com_language"
            $paramsLanguage = ComponentHelper::getParams("com_languages");
            //Armazena idioma default do front-end.
            $languageDefaultWebsite = $paramsLanguage->get("site");
            
            if(isset($languages[$languageDefaultWebsite]->sef)){
                $langSef = $languages[$languageDefaultWebsite]->sef;
            }
        }

        // Se idioma nao for pt ou de, forca que fique em ingles
        // TODO: qnd colocaramos um novo idioma no site, precisamos acrescentar ele aqui no in_array
        if(!in_array($langSef, array('pt', 'de'))){
            $langSef = '';
        }
		
        // Se a extensao receber parametro isHom como 1, forca que olhe para HOM
        if($isHom == 1){
            $urlNbExtensions = 'https://hom.nobossextensions.com/';
        }   
        else{
            $urlNbExtensions = $config->get('url_nb_extensions');
        }

        // Url refinida no config: retorna ela mesmo
		if (isset($urlNbExtensions) && !empty($urlNbExtensions)){
			return $urlNbExtensions."/".$langSef;
        }

		// Retorna url do ambiente de producao
        return 'https://www.nobossextensions.com/'.$langSef;
	}
}