| Current Path : /var/www/html/libraries/noboss/src/Form/Field/ |
| Current File : /var/www/html/libraries/noboss/src/Form/Field/NbEmbedField.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\FormField;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;
// use Joomla\Registry\Registry;
// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects
/*
* Exibe um embed para usuario utilizar para chamar a extensao diretamente
* - Soh funciona a partir da versao 3.9 do Joomla
*/
class NbEmbedField extends FormField {
protected function getInput(){
$app = Factory::getApplication();
$wa = $app->getDocument()->getWebAssetManager();
// JS s CSS do field
$wa->registerAndUseScript('nobossembed', Uri::root()."libraries/noboss/src/Form/Field/assets/js/min/nobossembed.min.js");
$wa->registerAndUseStyle('nobossembed', Uri::root()."libraries/noboss/src/Form/Field/assets/stylesheets/css/nobossembed.min.css");
// Modal onde campo eh carregado esta bloqueado pela licenca: nao permite visualizar campo
if($app->input->post->get('blockModal', 0, 'INT')){
return "<div class='alert' style='padding: 5px; display: inline-block;'>".Text::_('LIB_NOBOSS_BLOCK_FIELD_SIDE_FIELD')."</div>";
}
// Id do registro que esta sendo editado (para quando field eh chamado dentro de modal)
$id = $app->input->get('valuefieldid', 0);
// Nao carrega o campo de embed se registro ainda nao estiver salvo
if(empty($id)){
return '<div class="alert" style="padding: 5px; display: inline-block;">'.Text::_('NOBOSS_EXTENSIONS_EMBED_MSG_NOT_SAVE').'.</div>';
}
// Obtem o tipo de embed a carregar
$embedType = $this->getAttribute('embedtype', 'iframe');
// Url do iframe
$iframeSrc = Uri::root()."index.php?option=com_nobossajax&module-id={$id}";
switch ($embedType) {
// Carrega embed de url pura
case 'url':
$iframeSrc .= '&load-head=1';
//$iframeSrc .= '&load-css=1&load-js=1';
$html = "<div class='noboss-embed'>
<textarea class='noboss-embed__content-copy'>{$iframeSrc}</textarea>
</div>";
break;
// Carrega embed de iframe
case 'iframe':
$iframeSrc .= '&load-head=1';
//$iframeSrc .= '&load-css=1&load-js=1';
$html = "<div class='noboss-embed'>
<textarea class='noboss-embed__content-copy'><iframe src='{$iframeSrc}' frameborder='0' scrolling='no' onload='this.style.height=(this.contentWindow.document.body.scrollHeight)+\"px\";' style='width: 100%;' ></iframe> </textarea>
</div>";
break;
// Carrega embed de iframe c/ correcao de altura via CSS
case 'iframe-height-auto':
$iframeSrc .= '&load-head=1';
//$iframeSrc .= '&load-css=1&load-js=1';
// Conteudo do css que esta minificado mais abaixo dentro da tag '<style>':
/*
[style*='--aspect-ratio'] > :first-child {
width: 100%;
}
[style*='--aspect-ratio'] > img {
height: auto;
}
@supports (--custom:property) {
[style*='--aspect-ratio'] {
position: relative;
}
[style*='--aspect-ratio']::before {
content: '';
display: block;
padding-bottom: calc(100% / (var(--aspect-ratio)));
}
[style*='--aspect-ratio'] > :first-child {
position: absolute;
top: 0;
left: 0;
height: 100%;
}
}
*/
$html = "<div class='noboss-embed'>
<textarea class='noboss-embed__content-copy'><style> [style*='--aspect-ratio'] >:first-child {width: 100%;}[style*='--aspect-ratio'] >img {height: auto;}@supports (--custom:property) {[style*='--aspect-ratio'] {position: relative;}[style*='--aspect-ratio']::before {content: '';display: block;padding-bottom: calc(100% / (var(--aspect-ratio)));}[style*='--aspect-ratio'] >:first-child {position: absolute;top: 0;left: 0;height: 100%;}} </style> <div style='--aspect-ratio: 16/9;'> <iframe src='{$iframeSrc}' width='100%' height='100%' frameborder='0' scrolling='no'> </iframe> </div></textarea>
</div>";
break;
// Carrega embed de jquery
case 'jquery':
$idRandom = uniqid();
$iframeSrc .= '&nb=1'; // Variavel que determina que CSS e JS sejam inseridos no head via JS e nao PHP (qnd ocorrer erro no console do navegador, retirar a chamada desse parametro na url para que carregue via PHP)
$html = "<div class='noboss-embed'>
<textarea class='noboss-embed__content-copy'><div id='nb-embed-{$idRandom}'></div> <script> jQuery.get('{$iframeSrc}', function(data) { jQuery('#nb-embed-{$idRandom}').html(data); }); </script></textarea>
</div>";
break;
// Carrega embed via javascript
/* TODO: a opcao via Javascript nao foi implantada pq tem um problema com os códigos e arquivos Javascripts que são imbutidos via innetHTML. Por questões de segurança, os códigos JS inseridos desta forma nao sao executados. Se um dia quisermos fazer funcionar, será necessario:
- Criar uma funcao JS que pega todos arquivos JS inseridos e reinsira eles na página de outra forma (ver melhor no google: https://www.google.com/search?q=Fun%C3%A7%C3%A3o+javascript+dentro+de+innerHTML+n%C3%A3o+funciona&oq=Fun%C3%A7%C3%A3o+javascript+dentro+de+innerHTML+n%C3%A3o+funciona)
- Essa função a ser criada devera ser inserida no site do cliente junto com o restante do codigo feito abaixo que faz o embed. Para que nao fique um codigo grande para o usuario inserir, podemos colocar a funcao em um arquivo JS que fique hospedado no nosso servidor e no codigo abaixo do embed adicionamos uma chamada para esse arquivo nosso.
- Importante se ligar que nao sao soh os arquivos JS inseridos no innerHTML que nao funcionam, mas tb as chamadas diretas de JS.
*/
// case 'javascript':
// $idRandom = uniqid();
// $html = "<div class='noboss-embed'>
// <textarea class='noboss-embed__content-copy'><div id='nbembed-{$idRandom}'></div> <script>let nbembed = new XMLHttpRequest(); nbembed.open('GET', '{$iframeSrc}', true); nbembed.send(); nbembed.onload = function () { document.getElementById('nbembed-{$idRandom}').innerHTML = nbembed.responseText; }; </script></textarea>
// </div>";
//break;
}
return $html;
}
}