| Current Path : /var/www/html/libraries/noboss/src/Util/ |
| 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;
}
}