Files
conservatorio-tomadini/plugins/system/nrframework/nrframework.php
2024-12-31 11:07:09 +01:00

495 lines
11 KiB
PHP

<?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
*/
defined( '_JEXEC' ) or die( 'Restricted access' );
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\String\StringHelper;
use NRFramework\HTML;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Language\Text;
use Joomla\Filesystem\File;
use Joomla\Registry\Registry;
// Initialize Tassos Library
require_once __DIR__ . '/autoload.php';
class plgSystemNRFramework extends CMSPlugin
{
/**
* Auto load plugin language
*
* @var boolean
*/
protected $autoloadLanguage = true;
/**
* The Joomla Application object
*
* @var object
*/
protected $app;
/**
* Update UpdateSites after the user has entered a Download Key
*
* @param string $context The component context
* @param string $table
* @param boolean $isNew
*
* @return void
*/
public function onExtensionAfterSave($context, $table, $isNew)
{
// Run only on Tassos Framework edit form
if (
$this->app->isClient('site')
|| $context != 'com_plugins.plugin'
|| $table->element != 'nrframework'
|| !isset($table->params)
)
{
return;
}
// Set Download Key & fix Update Sites
$upds = new NRFramework\Updatesites();
$upds->update();
}
/**
* Handling of PRO for extensions
* Throws a notice message if the Download Key is missing before downloading the package
*
* @param string &$url Update Site URL
* @param array &$headers
*/
public function onInstallerBeforePackageDownload(&$url, &$headers)
{
$uri = Uri::getInstance($url);
$host = $uri->getHost();
// This is not a Tassos.gr extension
if (strpos($host, 'tassos.gr') === false)
{
return true;
}
// If it's a Free version. No need to check for the Download Key.
if (strpos($url, 'free') !== false)
{
return true;
}
// This is a Pro version. Let's validate the Download Key.
$download_id = $this->params->get('key', '');
// Append it to the URL
if (!empty($download_id))
{
$uri->setVar('dlid', $download_id);
$url = $uri->toString();
return true;
}
$this->app->enqueueMessage('To be able to update the Pro version of this extension via the Joomla updater, you will need enter your Download Key in the settings of the <a href="' . Uri::base() . 'index.php?option=com_plugins&view=plugins&filter_search=tassos">Tassos Framework System Plugin</a>');
return true;
}
/**
* Listens to AJAX requests on ?option=com_ajax&format=raw&plugin=nrframework
*
* @return void
*/
public function onAjaxNrframework()
{
Session::checkToken('request') or jexit(Text::_('JINVALID_TOKEN'));
// Check if we have a valid task
$task = $this->app->input->get('task', null);
$non_admin_tasks = [
'include'
];
// Only in backend
if (!in_array(strtolower($task), $non_admin_tasks) && !$this->app->isClient('administrator'))
{
return;
}
// Check if we have a valid method task
$taskMethod = 'ajaxTask' . $task;
if (!method_exists($this, $taskMethod))
{
die('Task not found');
}
$this->$taskMethod();
}
/**
* Handles the Widgets AJAX requests.
*
* @return void
*/
public function onAjaxWidgets()
{
Session::checkToken('request') or jexit(Text::_('JINVALID_TOKEN'));
$widget = $this->app->input->get('widget', null);
$class = '\NRFramework\Widgets\\' . $widget;
if (!class_exists($class))
{
return;
}
$task = $this->app->input->get('task');
(new $class)->onAjax($task);
}
private function ajaxTaskInclude()
{
$input = $this->app->input;
$file = $input->get('file');
$path = JPATH_SITE . '/' . $input->get('path', '', 'RAW');
$class = $input->get('class');
$file_to_include = $path . $file . '.php';
if (!file_exists($file_to_include))
{
die('FILE_ERROR');
}
@include_once $file_to_include;
if (!class_exists($class))
{
die('CLASS_ERROR');
}
if (!method_exists($class, 'onAJAX'))
{
die('METHOD_ERROR');
}
(new $class())->onAJAX($input->getArray());
}
/**
* Notices AJAX requests.
*
* @return void
*/
private function ajaxTaskNotices()
{
if (!Session::checkToken('request'))
{
echo json_encode([
'error' => true,
'message' => Text::_('JINVALID_TOKEN')
]);
die();
}
$input = $this->app->input;
$action = $input->get('action', null);
$allowed_actions = [
'downloadkey',
'ajaxnotices'
];
if (!in_array($action, $allowed_actions))
{
echo json_encode([
'error' => true,
'response' => 'Invalid action.'
]);
die();
}
$error = false;
$response = '';
switch ($action)
{
case 'downloadkey':
// Get Download Key
if (!$download_key = $input->get('download_key', null, 'string'))
{
echo json_encode([
'error' => true,
'response' => 'Missing download key.'
]);
die();
}
// Try and update the Download Key
if (!\NRFramework\Functions::updateDownloadKey($download_key))
{
echo json_encode([
'error' => true,
'response' => 'Cannot update download key.'
]);
die();
}
$response = Text::_('NR_DOWNLOAD_KEY_UPDATED');
break;
case 'ajaxnotices':
// Get element
if (!$ext_element = $input->get('ext_element', null, 'string'))
{
echo json_encode([
'error' => true,
'response' => 'Missing extension element.'
]);
die();
}
// Get xml
if (!$ext_xml = $input->get('ext_xml', null, 'string'))
{
echo json_encode([
'error' => true,
'response' => 'Missing extension xml.'
]);
die();
}
// Get type
if (!$ext_type = $input->get('ext_type', null, 'string'))
{
echo json_encode([
'error' => true,
'response' => 'Missing extension type.'
]);
die();
}
// Current URL
if (!$current_url = $input->get('current_url', null, 'string'))
{
echo json_encode([
'error' => true,
'response' => 'Missing current URL.'
]);
die();
}
// Get excluded notices
$exclude = $input->get('exclude', null, 'string');
$exclude = array_filter(explode(',', $exclude));
$notices = \NRFramework\Notices\Notices::getInstance([
'ext_element' => $ext_element,
'ext_xml' => $ext_xml,
'ext_type' => $ext_type,
'exclude' => $exclude,
'current_url' => $current_url
])->getNotices();
echo json_encode([
'error' => false,
'notices' => $notices
]);
die();
break;
}
echo json_encode([
'error' => $error,
'response' => $response
]);
}
/**
* Templates Library AJAX requests.
*
* @return void
*/
private function ajaxTaskTemplatesLibrary()
{
if (!Session::checkToken('request'))
{
echo json_encode([
'error' => true,
'message' => Text::_('JINVALID_TOKEN')
]);
die();
}
$action = $this->app->input->get('action', null);
$input = new Registry(json_decode(file_get_contents('php://input')));
$template_id = $input->get('template_id', '');
$allowed_actions = [
'get_templates',
'refresh_templates',
'insert_template',
'favorites_toggle'
];
if (!in_array($action, $allowed_actions))
{
echo json_encode([
'error' => true,
'message' => 'Cannot validate request.'
]);
die();
}
if (!$options = json_decode($input->get('options', []), true))
{
echo json_encode([
'error' => true,
'message' => 'Cannot validate request.'
]);
die();
}
$class = '';
$method = 'tf_library_ajax_' . $action;
switch ($action) {
case 'get_templates':
case 'refresh_templates':
case 'insert_template':
$class = 'templates';
if ($action === 'insert_template')
{
// Ensure a template ID is given
if (empty($template_id))
{
echo json_encode([
'error' => true,
'message' => 'Cannot process request.'
]);
die();
}
$options['template_id'] = $template_id;
}
break;
case 'favorites_toggle':
$class = 'favorites';
// Ensure a template ID is given
if (empty($template_id))
{
echo json_encode([
'error' => true,
'message' => 'Cannot process request.'
]);
die();
}
$options['template_id'] = $template_id;
break;
}
$library = new \NRFramework\Library\Library($options);
echo json_encode($library->$class->$method());
}
/**
* Conditional Builder AJAX requests.
*
* @return void
*/
private function ajaxTaskConditionBuilder()
{
if (!Session::checkToken('request'))
{
echo json_encode([
'error' => true,
'message' => Text::_('JINVALID_TOKEN')
]);
die();
}
$input = new Registry(json_decode(file_get_contents('php://input')));
switch ($input->get('subtask', null))
{
// Adding a condition item or group
case 'add':
$conditionItemGroup = $input->get('conditionItemGroup', null);
$groupKey = intval($input->get('groupKey'));
$conditionKey = intval($input->get('conditionKey'));
$include_rules = $input->get('include_rules', null);
$exclude_rules = $input->get('exclude_rules', null);
$exclude_rules_pro = $input->get('exclude_rules_pro', null) === '1';
$conditionItem = NRFramework\Conditions\ConditionBuilder::add($conditionItemGroup, $groupKey, $conditionKey, null, $include_rules, $exclude_rules, $exclude_rules_pro);
// Adding a single condition item
if (!$input->get('addingNewGroup', false)) {
echo $conditionItem;
break;
}
$payload = [
'name' => $conditionItemGroup,
'groupKey' => $groupKey,
'groupConditions' => ['enabled' => 1],
'include_rules' => $include_rules,
'exclude_rules' => $exclude_rules,
'exclude_rules_pro' => $exclude_rules_pro,
'condition_items_parsed' => [$conditionItem],
];
// Adding a condition group
echo NRFramework\Conditions\ConditionBuilder::getLayout('conditionbuilder_group', $payload);
break;
case 'options':
$conditionItemGroup = $input->get('conditionItemGroup', null);
$name = $input->get('name', null);
echo NRFramework\Conditions\ConditionBuilder::renderOptions($name, $conditionItemGroup);
break;
case 'init_load':
$payload = [
'data' => $input->get('data', []),
'name' => $input->get('name', null),
'include_rules' => $input->get('include_rules', null),
'exclude_rules' => $input->get('exclude_rules', null),
'exclude_rules_pro' => $input->get('exclude_rules_pro', null) === '1'
];
echo NRFramework\Conditions\ConditionBuilder::initLoad($payload);
break;
}
}
/**
* Remains for backwards compatibility.
*
* @deprecated 4.9.50
*/
private function ajaxTaskUpdateNotification()
{
echo HTML::updateNotification($this->app->input->get('element'));
}
}