| Current Path : /var/www/html/libraries/noboss/src/Form/Field/ |
| Current File : /var/www/html/libraries/noboss/src/Form/Field/NbRadioThemeField.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\Form\Field;
use Joomla\CMS\Form\Field\RadioField;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Form\FormHelper;
// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects
// Field que permite apenas exibir imagens representativas ou ainda definir preenchimento automatico de outros campos
class NbRadioThemeField extends RadioField {
protected function getInput() {
$app = Factory::getApplication();
$wa = $app->getDocument()->getWebAssetManager();
// Seta classe para ser inserida no fieldset
$this->class = "nobossradiotheme";
// Classe css adicional foi definida, acrescenta junto no fieldset
if(!empty($this->element->attributes()->class)){
$this->class .= " ".$this->element->attributes()->class;
}
// CSS e JS do field
$wa->registerAndUseStyle('nobossradiotheme', Uri::root()."libraries/noboss/src/Form/Field/assets/stylesheets/css/nobossradiotheme.min.css", ['version' => '']);
$wa->registerAndUseScript('nobossradiotheme', Uri::root()."libraries/noboss/src/Form/Field/assets/js/min/nobossradiotheme.min.js", ['version' => '']);
return parent::getInput();
}
protected function getOptions(){
$app = Factory::getApplication();
$options = array();
// Adiciona altura maxima para imagem, caso definido
$styleSize = (!empty($this->element->attributes()->maxheight)) ? ' max-height:'.$this->element->attributes()->maxheight.';' : '';
// Adiciona largura maxima para imagem, caso definido
$styleSize .= (!empty($this->element->attributes()->maxwidth)) ? ' max-width:'.$this->element->attributes()->maxwidth.';' : '';
// Adiciona altura para imagem, caso definido
$styleSize .= (!empty($this->element->attributes()->height)) ? ' height:'.$this->element->attributes()->height.';' : '';
// Adiciona largura para imagem, caso definido
$styleSize .= (!empty($this->element->attributes()->width)) ? ' width:'.$this->element->attributes()->width.';' : '';
// Obtem o tema selecionado (quando definido) em requisicoes de modal
$theme = $app->input->post->get('theme', '', 'STRING');
// Percorre cada option para tratamento
foreach ($this->element->xpath('option') as $option){
// Setado limitacao de tema para o option e temos informacao do tema utilizado
if((!empty($theme)) && (!empty($option['limitationtheme'])) && (!in_array($theme, explode(",", $option['limitationtheme'])))){
continue;
}
$showonOptionConditions = null;
$showonOptionAttr = '';
if ((string) $option['showon']) {
$showonOptionConditions = FormHelper::parseShowOnConditions((string) $option['showon'], $this->formControl, $this->group);
$showonOptionAttr = " data-showon='" . json_encode($showonOptionConditions) . "'";
}
// Obtem o value
$value = (string) $option['value'];
// Opcao manual
if($value == 'manual'){
$contentHtml = "<div class=\"nobossradiotheme__option-manual\" style='{$styleSize}'><i class='fa-solid fa-gears'></i> ".Text::_('NOBOSS_EXTENSIONS_GLOBAL_FIELD_OPT_MANUAL')."</div>";
}
// Imagem
else{
// Obtem a legenda da imagem, caso definida
$text = Text::_(trim((string) $option));
// Obtem o endereco da imagem
$srcImage = (string) $option['src'];
// Url da imagem nao eh completa (nao possui o '://' do 'http://' ou 'https://): adiciona url base do site
$srcImage = (!empty($srcImage) && (strpos($srcImage, '://') === false)) ? Uri::root().$srcImage : $srcImage;
// Monta elemento html da imagem, caso src tenha sido definido
$contentImage = (!empty($srcImage)) ? "<img src='{$srcImage}' style='{$styleSize}' />" : "";
$attrs = "";
// Ha mais atributos no option: organiza eles para ser colocado no html pois sao campos para preenchimento automatico
$optionAttributes = $option->attributes();
if($optionAttributes){
foreach ($optionAttributes as $keyAttr => $valueAttr) {
if(($keyAttr == 'value') || ($keyAttr == 'src') || ($keyAttr == 'limitationtheme') || ($keyAttr == 'showon')){
continue;
}
$attrs .= " data-{$keyAttr}=\"{$valueAttr}\"";
}
}
// Conteudo a ser exibido
$contentHtml = "<div {$showonOptionAttr}><div class=\"nobossradiotheme__option-image\" {$attrs}>{$contentImage}</div><div class=\"nobossradiotheme__option-legend\">{$text}</div></div>";
}
$disabled = (string) $option['disabled'];
$disabled = ($disabled == 'true' || $disabled == 'disabled' || $disabled == '1');
$disabled = $disabled || ($this->readonly && $value != $this->value);
$checked = (string) $option['checked'];
$checked = ($checked == 'true' || $checked == 'checked' || $checked == '1');
$tmp = array(
'value' => $value,
'text' => $contentHtml,
'disable' => $disabled,
'class' => (string) $option['class'],
'checked' => $checked,
);
if ($showonOptionConditions !== null){
$tmp['optionattr'] = " data-showon='" .
json_encode(
$showonOptionConditions
)
. "'";
}
$options[] = (object) $tmp;
}
reset($options);
// echo '<pre>';
// var_dump($options);
// exit;
return $options;
}
}