acf
This commit is contained in:
209
plugins/system/nrframework/NRFramework/Widgets/Widget.php
Normal file
209
plugins/system/nrframework/NRFramework/Widgets/Widget.php
Normal file
@ -0,0 +1,209 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @author Tassos Marinos <info@tassos.gr>
|
||||
* @link https://www.tassos.gr
|
||||
* @copyright Copyright © 2024 Tassos All Rights Reserved
|
||||
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
|
||||
*/
|
||||
|
||||
namespace NRFramework\Widgets;
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Layout\FileLayout;
|
||||
use Joomla\CMS\Session\Session;
|
||||
|
||||
class Widget
|
||||
{
|
||||
protected $widget_options = [];
|
||||
|
||||
/**
|
||||
* Widget's default options
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $options = [
|
||||
// Set whether to load the CSS variables
|
||||
'load_css_vars' => true,
|
||||
|
||||
// Set whether to load the default stylesheet
|
||||
'load_stylesheet' => true,
|
||||
|
||||
// If true, the widget will be rended in read-only mode.
|
||||
'readonly' => false,
|
||||
|
||||
// If true, the widget will be rended in disabled mode.
|
||||
'disabled' => false,
|
||||
|
||||
// Indicates the widget's input field must be filled out before submitting the form.
|
||||
'required' => false,
|
||||
|
||||
// The CSS class to be used on the widget's wrapper
|
||||
'css_class' => '',
|
||||
|
||||
// The CSS class to be used on the input
|
||||
'input_class' => '',
|
||||
|
||||
// The input name
|
||||
'name' => '',
|
||||
|
||||
// The default widget value
|
||||
'value' => '',
|
||||
|
||||
// Extra attributes
|
||||
'atts' => '',
|
||||
|
||||
// Custom CSS
|
||||
'custom_css' => '',
|
||||
|
||||
// A short hint that describes the expected value
|
||||
'placeholder' => '',
|
||||
|
||||
// The name of the layout to be used to render the widget
|
||||
'layout' => 'default',
|
||||
|
||||
// The extension name where the widget is loaded from.
|
||||
'extension' => '',
|
||||
|
||||
// The aria-label attribute
|
||||
'aria_label' => '',
|
||||
|
||||
// Whether we are rendering the Pro version of the widget
|
||||
'pro' => false
|
||||
];
|
||||
|
||||
/**
|
||||
* If no name is provided, this counter is appended to the widget's name to prevent name conflicts
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected static $counter = 0;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct($options = [])
|
||||
{
|
||||
// Merge Widget class default options with given Widget default options
|
||||
$this->options = array_merge($this->options, $this->widget_options, $options);
|
||||
|
||||
// Set ID if none given
|
||||
if (!isset($this->options['id']))
|
||||
{
|
||||
$this->options['id'] = $this->getName() . self::$counter;
|
||||
}
|
||||
|
||||
// Help developers target the whole widget by applying the widget's ID to the CSS class list.
|
||||
// Do not use the id="xx" attribute in the HTML to prevent conflicts with the input's ID.
|
||||
$this->options['css_class'] .= ' ' . $this->options['id'];
|
||||
|
||||
// Set name if none given
|
||||
if (!isset($this->options['name']))
|
||||
{
|
||||
$this->options['name'] = $this->options['id'];
|
||||
}
|
||||
|
||||
// Set disabled class if widget is disabled
|
||||
if ($this->options['disabled'])
|
||||
{
|
||||
$this->options['css_class'] .= ' disabled';
|
||||
}
|
||||
|
||||
self::$counter++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the widget with the given layout
|
||||
*
|
||||
* Layouts can be overriden in the following folder: /templates/TEMPLATE_NAME/html/tassos/WIDGET_NAME/LAYOUT_NAME.php
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
$defaultPath = implode(DIRECTORY_SEPARATOR, [JPATH_PLUGINS, 'system', 'nrframework', 'layouts']);
|
||||
$overridePath = implode(DIRECTORY_SEPARATOR, [JPATH_THEMES, Factory::getApplication()->getTemplate(), 'html', 'tassos']);
|
||||
|
||||
$layout = new FileLayout('widgets.' . $this->getName() . '.' . $this->options['layout'], null, ['debug' => false]);
|
||||
$layout->addIncludePaths($defaultPath);
|
||||
$layout->addIncludePaths($overridePath);
|
||||
|
||||
return $layout->render($this->options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of the widget
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return strtolower((new \ReflectionClass($this))->getShortName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the options key value.
|
||||
*
|
||||
* @param string $key
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getOption($key)
|
||||
{
|
||||
return isset($this->options[$key]) ? $this->options[$key] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Manages ajax requests for the widget.
|
||||
*
|
||||
* @param string $task
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function onAjax($task)
|
||||
{
|
||||
Session::checkToken('request') or die('Invalid Token');
|
||||
|
||||
if (!$task || !is_string($task))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$method = 'ajax_' . $task;
|
||||
|
||||
if (!method_exists($this, $method))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$this->$method();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the options key value.
|
||||
*
|
||||
* @param string $key
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setOption($key, $value)
|
||||
{
|
||||
$this->options[$key] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if an option exists.
|
||||
*
|
||||
* @param string $key
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function optionExists($key)
|
||||
{
|
||||
return isset($this->options[$key]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user