* @copyright Copyright © 2019 Delo Design & NorrNext. All rights reserved. * @license GNU General Public License version 3 or later; see license.txt * @link https://www.norrnext.com */ use Joomla\CMS\Application\CMSApplication; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Form\Form; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Table\Table; use Joomla\CMS\Toolbar\Toolbar; use Joomla\CMS\Uri\Uri; use Joomla\Database\DatabaseDriver; use Joomla\Registry\Registry; defined('_JEXEC') or die; /** * Quantummanagerconfig plugin. * * @package quantumyoothemepro * @since 1.0.0 */ class plgSystemQuantummanagerconfig extends CMSPlugin { /** * Application object * * @var CMSApplication * @since 1.0.0 */ protected $app; /** * Database object * * @var DatabaseDriver * @since 1.0.0 */ protected $db; /** * Affects constructor behavior. If true, language files will be loaded automatically. * * @var boolean * @since 1.0.0 */ protected $autoloadLanguage = true; /** * List of allowed list extensions * * @var string[][] * @since version */ protected $elements = [ [ 'type' => 'component', 'element' => 'com_quantummanager' ], [ 'type' => 'plugin', 'element' => 'quantummanagerbutton' ], [ 'type' => 'plugin', 'element' => 'quantummanagermedia' ] ]; /** * @param Form $form * @param $data * * * @since version */ public function onContentPrepareForm(Form $form, $data) { $admin = $this->app->isClient('administrator'); if(!$admin) { return; } $element = ''; $find = false; $option = $this->app->input->get('option'); if($option === 'com_config') { $view = $this->app->input->get('view'); $component = $this->app->input->get('component'); $components = []; foreach ($this->elements as $element) { if($element['type'] === 'component') { $components[] = $element['element']; } } if($view === 'component' && in_array($component, $components)) { $element = $component; $find = true; } } if($option === 'com_plugins') { $view = $this->app->input->get('view'); if($view !== 'plugin') { return; } $extension_id = $this->app->input->getInt('extension_id'); $plugins = []; $plugin = ''; $table = Table::getInstance('extension'); $table->load($extension_id); if(!empty($table->element)) { $plugin = $table->element; } else { return; } foreach ($this->elements as $element) { if($element['type'] === 'plugin') { $plugins[] = $element['element']; } } if(in_array($plugin, $plugins)) { $element = $plugin; $find = true; } } if(!$find) { return; } HTMLHelper::_('script', 'plg_system_quantummanagerconfig/importexport.js', [ 'version' => filemtime(__FILE__), 'relative' => true ]); $toolbar = Toolbar::getInstance('toolbar'); $root = Uri::getInstance()->toString(array('scheme', 'host', 'port')); $url = $root . '/administrator/index.php?' . http_build_query([ 'option' => 'com_ajax', 'plugin' => 'quantummanagerconfig', 'group' => 'system', 'format' => 'raw', 'task' => 'export', 'element' => $element ]); Factory::getDocument()->addStyleDeclaration('#toolbar-quantum-config-button-position{float:right}'); Factory::getDocument()->addScriptDeclaration("window.QuantummanagerConfig = {alert: '" . htmlspecialchars(Text::_('PLG_QUANTUMMANAGERCONFIG_ALERT'), ENT_QUOTES) . "'}"); $button = '' . '' . Text::_('PLG_QUANTUMMANAGERCONFIG_BUTTON_EXPORT') . ''; $toolbar->appendButton('Custom', $button, 'quantum-config-button-position'); $button = ''; $toolbar->appendButton('Custom', $button, 'quantum-config-button-position'); } /** * Ajax for import/export * * @throws Exception * @since version */ public function onAjaxQuantummanagerconfig() { $admin = $this->app->isClient('administrator'); if(!$admin) { return; } $task = $this->app->input->get('task'); if($task === 'export') { $this->export(); } if($task === 'import') { $this->import(); } } /** * Check element from list * * @param $element_check * * * @since version */ private function checkElement($element_check) { $find = false; foreach ($this->elements as $element) { if($element['element'] === $element_check) { $find = true; } } if(!$find) { $this->app->close(401); } } /** * Export params com_quantummanager * * @throws Exception */ private function export() { $app = Factory::getApplication(); $input = $this->app->input; $element = $this->app->input->get('element'); $this->checkElement($element); $table = Table::getInstance('extension'); $table->load(['element' => $element]); $params = new Registry($table->params); $file = 'export_' . $element . '.json'; $this->app->setHeader('Content-Disposition', 'attachment; filename=' . basename($file)); $this->app->setHeader('Content-Transfer-Encoding', 'binary'); $this->app->setHeader('Expires', '0'); $this->app->setHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0'); $this->app->setHeader('Pragma', 'public'); $this->app->setHeader('Content-Length', filesize($file)); $this->app->sendHeaders(); ob_clean(); flush(); echo json_encode($params); $this->app->close(); } /** * Import params for com_quantummanager * * @throws Exception * @since version */ private function import() { $input = $this->app->input; $files = $input->files->getArray(); $element = $this->app->input->get('element'); $this->checkElement($element); if(isset($files['params'])) { if($files['params']['error'] === 0) { $table = Table::getInstance('extension'); $table->load(['element' => $element]); $params_new = file_get_contents($files['params']['tmp_name']); if(!is_array(json_decode($params_new, JSON_OBJECT_AS_ARRAY))) { $this->app->enqueueMessage('PLG_QUANTUMMANAGERCONFIG_IMPORTEXPORT_ERROR_FILE_UPLOAD', 'error'); return; } $params = new Registry($table->params); $params->merge(new Registry($params_new)); $table->bind(['params' => $params->toString()]); if (!$table->check()) { $this->app->enqueueMessage('PLG_QUANTUMMANAGERCONFIG_IMPORTEXPORT_ERROR_DATABASE', 'error'); return; } if (!$table->store()) { $this->app->enqueueMessage('PLG_QUANTUMMANAGERCONFIG_IMPORTEXPORT_ERROR_DATABASE', 'error'); return; } JLoader::register('QuantummanagerHelper', JPATH_SITE . '/administrator/components/com_quantummanager/helpers/quantummanager.php'); QuantummanagerHelper::cleanCache('_system', 0); QuantummanagerHelper::cleanCache('_system', 1); $this->app->enqueueMessage('PLG_QUANTUMMANAGERCONFIG_IMPORTEXPORT_UPLOAD_SUCCESS', 'success'); } else { $this->app->enqueueMessage('PLG_QUANTUMMANAGERCONFIG_IMPORTEXPORT_ERROR_FILE_UPLOAD', 'error'); } } else { $this->app->enqueueMessage('PLG_QUANTUMMANAGERCONFIG_IMPORTEXPORT_ERROR_FILE_NOTFOUND', 'error'); } } }