Files
conservatorio-tomadini/plugins/system/acf/ACF/Previewer/Field.php
2024-12-31 11:07:09 +01:00

235 lines
4.4 KiB
PHP

<?php
/**
* @author Tassos Marinos <info@tassos.gr>
* @link http://www.tassos.gr
* @copyright Copyright © 2021 Tassos Marinos All Rights Reserved
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
*/
namespace ACF\Previewer;
defined('_JEXEC') or die;
use Joomla\Registry\Registry;
use Joomla\CMS\Uri\Uri;
class Field
{
/**
* The field framework widget name.
*
* @var string
*/
protected $field = '';
/**
* Field Editor Form Data.
*
* @var array
*/
protected $data = [];
/**
* Field Params.
*
* @var object
*/
protected $fieldParams = [];
/**
* The field payload used to render the field.
*
* @var array
*/
protected $payload;
/**
* The Framework Widget.
*
* @var Widget
*/
protected $widget = null;
public function __construct($data = [], $payload = [])
{
$this->data = new Registry($data);
$fieldParams = isset($data['fieldparams']) ? $data['fieldparams'] : [];
$this->fieldParams = new Registry($fieldParams);
if ($payload)
{
$this->payload = $payload;
}
}
/**
* Saves the field's JSON data for previewer to render it.
*
* @return void
*/
protected function saveJSON()
{
// Get path to file
$file = implode(DIRECTORY_SEPARATOR, [\ACF\Helpers\Previewer::getJsonDirectory(), $this->data->get('type') . '.json']);
// Save JSON file
file_put_contents($file, $this->getHTML());
}
/**
* Setup the field.
*
* @return string
*/
public function setup()
{
if (method_exists($this, 'onSetup'))
{
$this->onSetup();
}
$this->saveJSON();
}
/**
* Render the field.
*
* @return string
*/
public function render()
{
return $this->widget->render();
}
/**
* Field HTML output.
*
* @return string
*/
private function getHTML()
{
return '<html><head>' . $this->getHead() . '</head><body>' . $this->render() . '</body></html>';
}
/**
* Returns the head of the preview HTML.
*
* @return string
*/
private function getHead()
{
if (!$assets = $this->getAssets())
{
return;
}
// Add Reset CSS
$head = '<style>' . $this->getResetCSS() . '</style>';
// Add Custom CSS
if (isset($assets['custom_css']) && !empty($assets['custom_css']))
{
$head .= '<style>' . $assets['custom_css'] . '</style>';
}
$base_url = Uri::root();
// Add CSS
if (isset($assets['css']) && is_array($assets['css']) && count($assets['css']))
{
foreach ($assets['css'] as $css)
{
$css = str_replace('plg_system_nrframework/', 'plg_system_nrframework/css/', $css);
$link = $base_url . 'media/' . $css;
$head .= '<link href="' . $link . '" rel="stylesheet" />';
}
}
// Add Core JS
$head .= '<script src="' . $base_url . 'media/system/js/core.js"></script>';
// Add JS
if (isset($assets['js']) && is_array($assets['js']) && count($assets['js']))
{
foreach ($assets['js'] as $js)
{
$js = str_replace('plg_system_nrframework/', 'plg_system_nrframework/js/', $js);
$link = $base_url . 'media/' . $js;
$head .= '<script src="' . $link . '"></script>';
}
}
return $head;
}
/**
* Returns the field reset CSS.
*
* @return string
*/
private function getResetCSS()
{
$reset_css = '
body {
border: 0 !important;
background: #fff !important;
padding: 0 !important;
margin: 0 !important;
overflow-x: hidden !important;
font-family: Arial;
font-size: 16px;
}
';
return $reset_css . $this->getFieldPreviewerCSS();
}
/**
* Adds some extra CSS to the previewer's body.
*
* @return string
*/
protected function getFieldPreviewerCSS()
{
}
/**
* The CSS/JS assets that are required for the field to run.
*
* @return void
*/
public function getAssets()
{
return [
'css' => $this->getFieldCSS(),
'js' => $this->getFieldJS(),
'custom_css' => $this->widget->getOption('css_vars') . $this->widget->getOption('custom_css')
];
}
/**
* Returns the field CSS files.
*
* @return array
*/
private function getFieldCSS()
{
return $this->widget && method_exists($this->widget, 'getCSS') ? $this->widget->getCSS() : [];
}
/**
* Returns the field JS files.
*
* @return array
*/
private function getFieldJS()
{
return $this->widget && method_exists($this->widget, 'getJS') ? $this->widget->getJS() : [];
}
}