2138 lines
82 KiB
PHP
2138 lines
82 KiB
PHP
<?php
|
|
/**
|
|
* @version 6.2.6 tabulizer $
|
|
* @package tabulizer
|
|
* @copyright Copyright © 2011 - All rights reserved.
|
|
* @license GNU/GPL
|
|
* @author Dimitrios Mourloukos
|
|
* @author mail info@alterora.gr
|
|
* @website www.tabulizer.com
|
|
*
|
|
*/
|
|
|
|
|
|
// no direct access
|
|
defined('_JEXEC') or die('Restricted access');
|
|
|
|
jimport('joomla.application.component.controller');
|
|
|
|
class tabulizerController extends JControllerLegacy
|
|
{
|
|
/**
|
|
* Custom Constructor
|
|
*/
|
|
|
|
function __construct() {
|
|
parent::__construct();
|
|
}
|
|
|
|
function display($cachable = false, $urlparams = false) {
|
|
$this->viewRulesetArchives();
|
|
}
|
|
|
|
//=============================================================================================
|
|
// DIALOG
|
|
//=============================================================================================
|
|
|
|
function dialog() {
|
|
TabulizerPath::requireLib('tabdialog','dialog');
|
|
}
|
|
|
|
function convert() {
|
|
TabulizerPath::requireLib('convert','dialog');
|
|
}
|
|
|
|
function dsdata() {
|
|
TabulizerPath::requireLib('dsdata','dialog');
|
|
}
|
|
|
|
function extract_table_data() {
|
|
TabulizerPath::requireLib('extract_table_data','dialog');
|
|
}
|
|
|
|
function extract_excel_data() {
|
|
TabulizerPath::requireLib('extract_excel_data','dialog');
|
|
}
|
|
|
|
function upload_excel_file() {
|
|
TabulizerPath::requireLib('upload_excel_file','dialog');
|
|
}
|
|
|
|
function extract_csv_data() {
|
|
TabulizerPath::requireLib('extract_csv_data','dialog');
|
|
}
|
|
|
|
function upload_csv_file() {
|
|
TabulizerPath::requireLib('upload_csv_file','dialog');
|
|
}
|
|
|
|
function extract_grid_data() {
|
|
TabulizerPath::requireLib('extract_grid_data','dialog');
|
|
}
|
|
|
|
function save_grid_data() {
|
|
TabulizerPath::requireLib('save_grid_data','dialog');
|
|
}
|
|
|
|
function grab_table_data() {
|
|
TabulizerPath::requireLib('grab_table_data','dialog');
|
|
}
|
|
|
|
function dsselect() {
|
|
TabulizerPath::requireLib('dsselect','dialog');
|
|
}
|
|
|
|
function exportdata() {
|
|
TabulizerPath::requireLib('exportdata','dialog');
|
|
}
|
|
|
|
function outputDataSource() {
|
|
TabulizerPath::requireLib('datasource','output');
|
|
}
|
|
|
|
//=============================================================================================
|
|
// RULESET ARCHIVES
|
|
//=============================================================================================
|
|
|
|
function viewRulesetArchives() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
|
|
$model = $this->getModel('rulesetarchives');
|
|
$view = $this->getView('rulesetarchives','html');
|
|
|
|
// Get pagination request variables
|
|
$mainframe = JFactory::getApplication();
|
|
|
|
if (CLIENT_SIDE_PAGINATION) {
|
|
$limit = 0;
|
|
$limitstart = 0;
|
|
} else {
|
|
$limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
|
|
$limitstart = $jinput->getInt('limitstart', 0);
|
|
|
|
// In case limit has been changed, adjust it
|
|
if (empty($limit)) { $limit = $mainframe->getCfg('list_limit'); $limitstart = 0; }
|
|
$limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0);
|
|
}
|
|
|
|
$editor_pugin_installed = TabulizerInfo::isEditorPluginInstalled();
|
|
if ($editor_pugin_installed) {
|
|
$model->loadRulesetArchives($limit, $limitstart);
|
|
|
|
$view->setModel($model, true);
|
|
$view->setLayout('default');
|
|
$view->display();
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_EDITOR_PLUGIN_NOT_INSTALLED');
|
|
TabulizerUserMessage::printInfo($msg);
|
|
}
|
|
}
|
|
|
|
//=============================================================================================
|
|
// USER_PREFERENCES
|
|
//=============================================================================================
|
|
|
|
function editUserPreferences() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$error_msg = null;
|
|
|
|
$model = $this->getModel('rulesetarchives');
|
|
$view = $this->getView('rulesetarchives','html');
|
|
|
|
$editor_pugin_installed = TabulizerInfo::isEditorPluginInstalled();
|
|
if ($editor_pugin_installed) {
|
|
if ($model->loadUserPreferences($error_msg)) {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('user_preferences');
|
|
$view->displayUserPreferences();
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_USER_PREFERENCES_LOAD_FAILURE' ),$error_msg);
|
|
TabulizerUserMessage::printError($msg);
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_EDITOR_PLUGIN_NOT_INSTALLED');
|
|
TabulizerUserMessage::printError($msg);
|
|
}
|
|
}
|
|
|
|
function saveUserPreferences() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'message';
|
|
$error_msg = null;
|
|
|
|
$model = $this->getModel('rulesetarchives');
|
|
if ($model->saveUserPreferences($error_msg)) {
|
|
$msg = JText::_( 'COM_TABULIZER_USER_PREFERENCES_SAVE_SUCCESS' );
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_USER_PREFERENCES_SAVE_FAILURE' ),$error_msg);
|
|
$msg_type = 'error';
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
return;
|
|
}
|
|
|
|
//=============================================================================================
|
|
// USER_PERMISSIONS
|
|
//=============================================================================================
|
|
|
|
function editUserPermissions() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$error_msg = null;
|
|
|
|
$model = $this->getModel('rulesetarchives');
|
|
$view = $this->getView('rulesetarchives','html');
|
|
|
|
if ($model->loadAccessPermissions($error_msg)) {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('user_permissions');
|
|
$view->displayUserPermissions();
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_USER_PERMISSIONS_LOAD_FAILURE' ),$error_msg);
|
|
TabulizerUserMessage::printError($msg);
|
|
}
|
|
|
|
}
|
|
|
|
function saveUserPermissions() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'message';
|
|
$error_msg = null;
|
|
|
|
$model = $this->getModel('rulesetarchives');
|
|
if ($model->saveAccessPermissions($error_msg)) {
|
|
$msg = JText::_( 'COM_TABULIZER_USER_PERMISSIONS_SAVE_SUCCESS' );
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_USER_PERMISSIONS_SAVE_FAILURE' ),$error_msg);
|
|
$msg_type = 'error';
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
return;
|
|
}
|
|
|
|
//=============================================================================================
|
|
// SYSTEM STATUS
|
|
//=============================================================================================
|
|
|
|
function viewStatus() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$model = $this->getModel('rulesetarchives');
|
|
$view = $this->getView('rulesetarchives','html');
|
|
|
|
$editor_pugin_installed = TabulizerInfo::isEditorPluginInstalled();
|
|
if ($editor_pugin_installed) {
|
|
$model->loadStatus();
|
|
$view->setModel($model, true);
|
|
$view->setLayout('status');
|
|
$view->displayStatus();
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_EDITOR_PLUGIN_NOT_INSTALLED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
TabulizerUserMessage::printInfo($msg);
|
|
}
|
|
}
|
|
|
|
//=============================================================================================
|
|
// DATA SOURCES
|
|
//=============================================================================================
|
|
|
|
function viewDataSourcesStart() {
|
|
if (isset($_REQUEST['limitstart'])) $_REQUEST['limitstart'] = 0;
|
|
$this->viewDataSources();
|
|
}
|
|
|
|
function viewDataSources() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$error_msg = null;
|
|
|
|
$model = $this->getModel('datasources');
|
|
$view = $this->getView('datasources','html');
|
|
|
|
// Get pagination request variables
|
|
$mainframe = JFactory::getApplication();
|
|
// We get all data sources as we will paginate them via javascript code on the client's side
|
|
// otherwise: use the default system limit and the given limitstart
|
|
if (CLIENT_SIDE_PAGINATION) {
|
|
$limit = 0;
|
|
$limitstart = 0;
|
|
} else {
|
|
$limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
|
|
$limitstart = $jinput->getInt('limitstart', 0);
|
|
|
|
// In case limit has been changed, adjust it
|
|
if (empty($limit)) { $limit = $mainframe->getCfg('list_limit'); $limitstart = 0; }
|
|
$limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0);
|
|
}
|
|
|
|
$editor_pugin_installed = TabulizerInfo::isEditorPluginInstalled();
|
|
if ($editor_pugin_installed) {
|
|
$model->loadDataSources($limit, $limitstart, $error_msg);
|
|
|
|
$view->setModel($model, true);
|
|
$view->setLayout('default');
|
|
$view->display();
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_EDITOR_PLUGIN_NOT_INSTALLED');
|
|
TabulizerUserMessage::printInfo($msg);
|
|
}
|
|
}
|
|
|
|
function newDataSource() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
|
|
$model = $this->getModel('datasources');
|
|
$view = $this->getView('datasources','html');
|
|
|
|
$view->setModel($model, true);
|
|
$view->setLayout('form');
|
|
$view->displayNew();
|
|
}
|
|
|
|
function previewDataSource() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$id = $jinput->getInt( 'ds_id', null );
|
|
|
|
if (empty($id)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_DATA_SOURCE_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$model = $this->getModel('datasources');
|
|
$view = $this->getView('datasources','html');
|
|
|
|
$data_source = $model->loadDataSource($id);
|
|
if (empty($data_source)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_DATA_SOURCE_IS_EMPTY_OR_NOT_FOUND');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('preview');
|
|
$view->displayPreview();
|
|
}
|
|
}
|
|
}
|
|
|
|
function editDataSource() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$id = $jinput->getInt( 'ds_id', null );
|
|
|
|
if (empty($id)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_DATA_SOURCE_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$model = $this->getModel('datasources');
|
|
$view = $this->getView('datasources','html');
|
|
|
|
$data_source = $model->loadDataSource($id);
|
|
if (empty($data_source)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_DATA_SOURCE_IS_EMPTY_OR_NOT_FOUND');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('form');
|
|
$view->displayEdit();
|
|
}
|
|
}
|
|
}
|
|
|
|
function saveDataSource() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option.'&task=viewDataSources';
|
|
$msg_type = 'error';
|
|
$error_msg = null;
|
|
|
|
$data_source = array();
|
|
$data_source['id'] = $jinput->getInt('ds_id', null);
|
|
$data_source['tag'] = $jinput->getString('ds_tag', null);
|
|
$data_source['title'] = $jinput->getString('ds_title', null);
|
|
$data_source['source_type'] = $jinput->getString('ds_source_type', null);
|
|
$data_source['cache_type'] = $jinput->getInt('ds_cache_type', null);
|
|
$data_source['cache_time'] = $jinput->getInt('ds_cache_time', null);
|
|
|
|
$addcopy = $jinput->getInt('addcopy', 0);
|
|
if ($addcopy) {
|
|
$data_source['id'] = null;
|
|
$data_source['tag'] = TabulizerString::generateRandomString(24);
|
|
$data_source['title'] .= ' - ' . JText::_('COM_TABULIZER_COPY_OF');
|
|
}
|
|
|
|
$model = $this->getModel('datasources');
|
|
$data_source['source_params'] = $model->getDataSourceRequest($data_source['source_type'], 'ds_', $error_msg);
|
|
if (empty($data_source['source_params'])) {
|
|
$msg = JText::_('COM_TABULIZER_INVALID_DATA_SOURCE_SAVE_PARAMS') . $error_msg;
|
|
} else {
|
|
if ($model->saveDataSource($data_source, $error_msg)) {
|
|
$msg = JText::_('COM_TABULIZER_DATA_SOURCE_SAVED_SUCCESSFULLY');
|
|
$msg_type = 'message';
|
|
|
|
$addnew = $jinput->getInt('addnew', 0);
|
|
if ($addnew) {
|
|
$link = 'index.php?option='.$option.'&task=newDataSource';
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_COULD_NOT_SAVE_DATA_SOURCE') . $error_msg;
|
|
}
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function deleteDataSource() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option.'&task=viewDataSources';
|
|
$msg_type = 'error';
|
|
$error_msg = null;
|
|
|
|
$cid = $jinput->get( 'cid', array(), 'array' );
|
|
|
|
if (count( $cid )) {
|
|
$model = $this->getModel('datasources');
|
|
if ($model->deleteDataSource($cid, $error_msg)) {
|
|
$msg = JText::_('COM_TABULIZER_SELECTED_DATA_SOURCES_DELETED_SUCCESSFULLY');
|
|
$msg_type = 'message';
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_DATA_SOURCES_DELETION_FAILED') . ' ' . $error_msg;
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_NO_DATA_SOURCES_SELECTED_FOR_DELETION');
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function editDataSourcePublishingPreferences() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option.'&task=viewDataSources';
|
|
$msg_type = 'error';
|
|
$msg = '';
|
|
|
|
$id = $jinput->getInt( 'ds_id', null );
|
|
|
|
if (empty($id)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_DATA_SOURCE_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$model = $this->getModel('datasources');
|
|
$view = $this->getView('datasources','html');
|
|
|
|
if ($model->loadDataSource($id)) {
|
|
$model->loadPublishingPreferences($msg);
|
|
$view->setModel($model, true);
|
|
$view->setLayout('publishing_preferences');
|
|
$view->editPublishingPreferences();
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_DATA_SOURCE_IS_EMPTY_OR_NOT_FOUND');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function saveDataSourcePublishingPreferences() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option.'&task=viewDataSources';
|
|
$msg_type = 'error';
|
|
$msg = '';
|
|
|
|
$tag = $jinput->getString( 'ds_tag', null );
|
|
|
|
if (empty($tag)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_DATA_SOURCE_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$model = $this->getModel('datasources');
|
|
if ($model->savePublishingPreferences($tag, $msg)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_DATA_SOURCE_IS_EMPTY_OR_NOT_FOUND');
|
|
$msg_type = 'message';
|
|
} else {
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function importDataSource() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option.'&task=viewDataSources';
|
|
$msg_type = 'error';
|
|
|
|
$importFileData = $jinput->getInt( 'import_file', 0);
|
|
$displayForm = ($importFileData)?false:true;
|
|
|
|
$model = $this->getModel('datasources');
|
|
|
|
if ($displayForm) {
|
|
$view = $this->getView('datasources','html');
|
|
$view->setModel($model, true);
|
|
$view->setLayout('import');
|
|
$view->displayImport();
|
|
return;
|
|
}
|
|
|
|
//import joomlas filesystem functions, we will do all the file writing with joomla's functions,
|
|
//so if the ftp layer is on, joomla will write with that, not the apache user, which might
|
|
//not have the correct permissions
|
|
jimport('joomla.filesystem.file');
|
|
jimport('joomla.filesystem.folder');
|
|
|
|
//this is the name of the field in the html form, filedata is the default name for swfupload
|
|
//so we will leave it as that
|
|
$fieldName = 'datasource_filename';
|
|
$file = $jinput->files->get($fieldName);
|
|
|
|
//any errors the server registered on uploading
|
|
$fileError = $file['error'];
|
|
if ($fileError > 0) {
|
|
switch ($fileError) {
|
|
case 1:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_LARGER_THAN_PHP_INI_ALLOWS' );
|
|
break;
|
|
case 2:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_LARGER_THAN_HTML_FORM_ALLOWS' );
|
|
break;
|
|
case 3:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_ERROR_PARTIAL' );
|
|
break;
|
|
case 4:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_ERROR_NO_FILE' );
|
|
break;
|
|
default:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_ERROR_UNKNOWN' );
|
|
break;
|
|
|
|
}
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
//check for filesize
|
|
$fileSize = $file['size'];
|
|
$maxAllowedFileSize = 20000000;
|
|
if($fileSize > $maxAllowedFileSize)
|
|
{
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_LARGER_THAN_COMPONENT_ALLOWS' );
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
//check the file extension is ok
|
|
$fileName = $file['name'];
|
|
$uploadedFileNameParts = explode('.',$fileName);
|
|
$uploadedFileExtension = array_pop($uploadedFileNameParts);
|
|
|
|
$validFileExts = array('xml');
|
|
|
|
//assume the extension is false until we know its ok
|
|
$extOk = false;
|
|
|
|
//go through every ok extension, if the ok extension matches the file extension (case insensitive)
|
|
//then the file extension is ok
|
|
foreach($validFileExts as $key => $value)
|
|
{
|
|
if( preg_match("/$value/i", $uploadedFileExtension ) )
|
|
{
|
|
$extOk = true;
|
|
}
|
|
}
|
|
|
|
if ($extOk == false)
|
|
{
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_INVALID_EXTENSION' ),implode(',',$validFileExts));
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
//the name of the file in PHP's temp directory that we are going to move to our folder
|
|
$fileTemp = $file['tmp_name'];
|
|
|
|
//lose any special characters in the filename
|
|
$fileName = preg_replace("/[^A-Za-z0-9._]/", "-", $fileName);
|
|
|
|
//always use constants when making file paths, to avoid the possibilty of remote file inclusion
|
|
$uploadPath = TabulizerPath::getFilePath($fileName, 'datasources');
|
|
|
|
$overwrite = $jinput->getInt( 'overwrite_file', 0);
|
|
if (file_exists($uploadPath)) {
|
|
if ($overwrite) {
|
|
unlink($uploadPath);
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_FILE_ALREADY_EXISTS' ),$fileName,$uploadPath);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
}
|
|
if(!TabulizerUtils::fileUpload($fileTemp, $uploadPath))
|
|
{
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_FAILURE' ),$fileName);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
$ds_errors = array();
|
|
$model->importDataSourceArchive($uploadPath, $ds_errors);
|
|
if (empty($ds_errors)) {
|
|
$msg = sprintf(JText::_('COM_TABULIZER_DATA_SOURCE_IMPORTED_SUCCESSFULLY'),$fileName);
|
|
$msg_type = 'message';
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
} else {
|
|
$msg = TabulizerUserMessage::printList(JText::_('COM_TABULIZER_DATA_SOURCE_IMPORTATION_ERROR'), $ds_errors, true);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// normally we should never reach this line
|
|
$msg = JText::_('COM_TABULIZER_DATA_SOURCE_IMPORTATION_ERROR_GENERIC');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function exportDataSource() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option . '&task=viewDataSources';
|
|
$msg_type = 'error';
|
|
$error_msg = null;
|
|
|
|
$cid = $jinput->get( 'cid', array(), 'array' );
|
|
|
|
if (count( $cid )) {
|
|
$model = $this->getModel('datasources');
|
|
if (!$model->exportDataSources($cid, $error_msg)) {
|
|
$msg = sprintf(JText::_('COM_TABULIZER_DATA_SOURCE_EXPORT_FAILED'),$error_msg);
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_NO_DATA_SOURCES_SELECTED_FOR_EXPORT');
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function clearDataSourceCache() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option . '&task=viewDataSources';
|
|
$msg_type = 'error';
|
|
$error_msg = null;
|
|
$msg = '';
|
|
$ids = array();
|
|
|
|
$cid = $jinput->get( 'cid', array(), 'array' );
|
|
if (count( $cid )) {
|
|
$ids = $cid;
|
|
} else {
|
|
$id = $jinput->getInt( 'ds_id', null );
|
|
if (!empty($id)) {
|
|
$link .= '&task=editDataSource&ds_id='.$id.'&cid[]='.$id;
|
|
$ids = array($id);
|
|
}
|
|
}
|
|
|
|
$return_url = $jinput->get('data_sources_return_url',null,'raw');
|
|
if (!empty($return_url)) $link .= '&data_sources_return_url='.urlencode($return_url);
|
|
|
|
if (!empty($ids)) {
|
|
$model = $this->getModel('datasources');
|
|
foreach ($ids as $id) {
|
|
if (!$model->clearDataSourceCache($id, $error_msg)) {
|
|
$msg .= JText::_('COM_TABULIZER_DATA_SOURCE_CACHE_CLEARING_FAILED') . ' ' . $error_msg . "<br/>\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!isset($error_msg)) {
|
|
$msg = JText::_('COM_TABULIZER_DATA_SOURCE_CACHE_CLEARED_SUCCESSFULLY');
|
|
$msg_type = 'message';
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function refreshDataSources() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$user_preferences = TabulizerInfo::getUserPreferences($error_msg);
|
|
$error_msg = null;
|
|
|
|
$valid_keyphrase = (isset($user_preferences['datasources_refresh_keyphrase']))?$user_preferences['datasources_refresh_keyphrase']:null;
|
|
$keyphrase = $jinput->getString('keyphrase',null);
|
|
$data_source_tag = $jinput->getString('ds_tag',null);
|
|
if (empty($valid_keyphrase)) {
|
|
$error_msg = JText::_('COM_TABULIZER_DATA_SOURCE_REFRESH_ERROR_NO_KEYPHRASE_SET');
|
|
} else if (empty($keyphrase)) {
|
|
$error_msg = JText::_('COM_TABULIZER_DATA_SOURCE_REFRESH_ERROR_NO_KEYPHRASE_GIVEN');
|
|
} else if ($keyphrase != $valid_keyphrase) {
|
|
$error_msg = JText::_('COM_TABULIZER_DATA_SOURCE_REFRESH_ERROR_INVALID_KEYPHRASE');
|
|
} else {
|
|
TabulizerPath::requireLib('data_source','common');
|
|
TabulizerDataSource::refreshDataSources($data_source_tag);
|
|
jexit("OK");
|
|
}
|
|
|
|
jexit("ERROR: ".$error_msg);
|
|
}
|
|
|
|
function manageDataFiles() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
// Get pagination request variables
|
|
$mainframe = JFactory::getApplication();
|
|
$limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
|
|
$limitstart = $jinput->getInt('limitstart', 0);
|
|
|
|
// We get all data sources as we will paginate them via javascript code on the client's side
|
|
// otherwise: use the default system limit and the given limitstart
|
|
if (CLIENT_SIDE_PAGINATION) {
|
|
$limit = 0;
|
|
$limitstart = 0;
|
|
} else {
|
|
$limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
|
|
$limitstart = $jinput->getInt('limitstart', 0);
|
|
|
|
// In case limit has been changed, adjust it
|
|
if (empty($limit)) { $limit = $mainframe->getCfg('list_limit'); $limitstart = 0; }
|
|
$limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0);
|
|
}
|
|
|
|
$model = $this->getModel('datasources');
|
|
$view = $this->getView('datasources','html');
|
|
$model->loadDataFiles($limit,$limitstart);
|
|
|
|
$view->setModel($model, true);
|
|
$view->setLayout('files');
|
|
$view->displayDataFiles();
|
|
}
|
|
|
|
function deleteDataFile() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option . '&task=manageDataFiles';
|
|
$msg_type = 'error';
|
|
$error_msg = null;
|
|
|
|
$cid = $jinput->get( 'cid', array(), 'array' );
|
|
|
|
if (count( $cid )) {
|
|
$model = $this->getModel('datasources');
|
|
if ($model->deleteDataFile($cid, $error_msg)) {
|
|
$msg = JText::_('COM_TABULIZER_SELECTED_DATA_FILE_DELETED_SUCCESSFULLY');
|
|
$msg_type = 'message';
|
|
} else {
|
|
$msg = sprintf(JText::_('COM_TABULIZER_DATA_FILE_DELETION_FAILED'),$error_msg);
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_NO_DATA_FILE_SELECTED_FOR_DELETION');
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function downloadDataFile() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option . '&task=manageDataFiles';
|
|
$msg_type = 'error';
|
|
$error_msg = null;
|
|
|
|
$cid = $jinput->get( 'cid', array(), 'array' );
|
|
|
|
if (count( $cid )) {
|
|
$model = $this->getModel('datasources');
|
|
if (!$model->outputDataFiles($cid, $error_msg)) {
|
|
$msg = sprintf(JText::_('COM_TABULIZER_DATA_FILE_DOWNLOAD_FAILED'),$error_msg);
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_NO_DATA_FILE_SELECTED_FOR_DOWNLOAD');
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function importDataFile() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option . '&task=manageDataFiles';
|
|
$msg_type = 'error';
|
|
|
|
$importFileData = $jinput->getInt( 'import_file', 0);
|
|
$displayForm = ($importFileData)?false:true;
|
|
|
|
if ($displayForm) {
|
|
$model = $this->getModel('datasources');
|
|
$view = $this->getView('datasources','html');
|
|
$view->setModel($model, true);
|
|
$view->setLayout('files_import');
|
|
$view->displayDataFileImport();
|
|
return;
|
|
}
|
|
|
|
//import joomlas filesystem functions, we will do all the filewriting with joomlas functions,
|
|
//so if the ftp layer is on, joomla will write with that, not the apache user, which might
|
|
//not have the correct permissions
|
|
jimport('joomla.filesystem.file');
|
|
jimport('joomla.filesystem.folder');
|
|
|
|
//this is the name of the field in the html form, filedata is the default name for swfupload
|
|
//so we will leave it as that
|
|
$fieldName = 'data_file';
|
|
$file = $jinput->files->get($fieldName);
|
|
|
|
//any errors the server registered on uploading
|
|
$fileError = $file['error'];
|
|
if ($fileError > 0) {
|
|
switch ($fileError) {
|
|
case 1:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_LARGER_THAN_PHP_INI_ALLOWS' );
|
|
break;
|
|
case 2:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_LARGER_THAN_HTML_FORM_ALLOWS' );
|
|
break;
|
|
case 3:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_ERROR_PARTIAL' );
|
|
break;
|
|
case 4:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_ERROR_NO_FILE' );
|
|
break;
|
|
default:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_ERROR_UNKNOWN' );
|
|
break;
|
|
|
|
}
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
//check for filesize
|
|
$fileSize = $file['size'];
|
|
$maxAllowedFileSize = 20000000;
|
|
if($fileSize > $maxAllowedFileSize)
|
|
{
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_LARGER_THAN_COMPONENT_ALLOWS' );
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
//check the file extension is ok
|
|
$fileName = $file['name'];
|
|
$fileExt = strtolower(pathinfo($fileName,PATHINFO_EXTENSION));
|
|
|
|
$validFileExts = explode(',',ALLOWED_FILE_TYPES_FOR_DATA_IMPORTATION);
|
|
$validFileExts[] = 'zip';
|
|
$extOk = TabulizerValidator::isFilename($fileName, $validFileExts );
|
|
|
|
if ($extOk == false)
|
|
{
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_INVALID_EXTENSION' ),implode(',',$validFileExts));
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
//the name of the file in PHP's temp directory that we are going to move to our folder
|
|
$fileTemp = $file['tmp_name'];
|
|
$overwrite = $jinput->getInt( 'overwrite_file', 0);
|
|
|
|
if ($fileExt != 'zip') {
|
|
$uploadPath = TabulizerPath::getDirPath('data');
|
|
$uploadFilepath = TabulizerPath::getFilePath($fileName, 'data');
|
|
|
|
if (file_exists($uploadFilepath)) {
|
|
if ($overwrite) {
|
|
unlink($uploadFilepath);
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_DATA_FILE_UPLOAD_FILE_ALREADY_EXISTS' ),$fileName,$uploadPath);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if(!TabulizerUtils::fileUpload($fileTemp, $uploadFilepath))
|
|
{
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_UNABLE_TO_UNZIP_FILE' ),$fileName);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_DATA_FILE_UPLOAD_SUCCESS'),$fileName);
|
|
$msg_type = 'message';
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
} else {
|
|
//always use constants when making file paths, to avoid the possibilty of remote file inclusion
|
|
$uploadPath = TabulizerPath::getFilePath($fileName, 'upload');
|
|
$unzipPath = TabulizerPath::getDirPath('data');
|
|
|
|
if (file_exists($uploadPath)) {
|
|
if ($overwrite) {
|
|
unlink($uploadPath);
|
|
} else {
|
|
$path_parts = pathinfo('/path/noextension');
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_DATA_FILE_UPLOAD_FILE_EXTRACT_ALREADY_EXISTS' ),$fileName,$path_parts['basename'],$unzipPath);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
}
|
|
if(!TabulizerUtils::fileUpload($fileTemp, $uploadPath))
|
|
{
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_UNABLE_TO_UNZIP_FILE' ),$fileName);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
// unzip file
|
|
if (!class_exists('ZipArchive')) {
|
|
$data_file_dir = TabulizerPath::getDirPath('data');
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_DATA_FILE_UPLOAD_ZIP_LIBRARY_MISSING'), $data_file_dir);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
$zip = new ZipArchive;
|
|
$return_code = $zip->open($uploadPath);
|
|
if ($return_code === TRUE) {
|
|
$success = true;
|
|
for ($i=0; $i<$zip->numFiles;$i++) {
|
|
$entry_info = $zip->statIndex($i);
|
|
$file_entry = $unzipPath . $entry_info['name'];
|
|
if (file_exists($file_entry) && !$overwrite) {
|
|
if (!is_dir($file_entry)) {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_DATA_FILE_UPLOAD_FILE_EXTRACT_ALREADY_EXISTS' ),$fileName,$entry_info['name'],$unzipPath);
|
|
$success = false;
|
|
break;
|
|
}
|
|
}
|
|
// security check: make sure the included paths in the archive are valid
|
|
$included_folder_name = dirname($entry_info['name']);
|
|
if ($included_folder_name != '.') {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_DATA_FILE_UPLOAD_NO_SUBDIRECTORIES' ),$entry_info['name']);
|
|
$success = false;
|
|
break;
|
|
}
|
|
|
|
// security check: do not allow certain file type to be included and installed on the Joomla site
|
|
// as part of the data archive importation process
|
|
$extension = substr(strrchr($entry_info['name'], "."), 1);
|
|
$allowed_extensions = ALLOWED_FILE_TYPES_FOR_DATA_IMPORTATION;
|
|
if (!empty($extension)) {
|
|
$extension = strtolower($extension);
|
|
if (!TabulizerPermissions::isAllowedImportDataExtension($extension)) {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_DATA_FILE_INVALID_EXTENSION' ),$entry_info['name'],$allowed_extensions);
|
|
$success = false;
|
|
}
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_DATA_FILE_NO_EXTENSION' ),$entry_info['name'],$allowed_extensions);
|
|
$success = false;
|
|
}
|
|
}
|
|
if ($success) {
|
|
if ($zip->extractTo($unzipPath)) {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_SUCCESS'),$fileName);
|
|
$msg_type = 'message';
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_UNABLE_TO_EXTRACT_FILE' ),$fileName,$unzipPath);
|
|
}
|
|
}
|
|
$zip->close();
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_DATA_FILE_UPLOAD_UNABLE_TO_UNZIP_FILE' ),$fileName);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//=============================================================================================
|
|
// RULESET ARCHIVE
|
|
//=============================================================================================
|
|
|
|
function viewRulesetArchive() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$archive_filename = $jinput->getString( 'archive_filename', '' );
|
|
|
|
// Get pagination request variables
|
|
$mainframe = JFactory::getApplication();
|
|
$limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
|
|
$limitstart = $jinput->getInt('limitstart', 0);
|
|
|
|
// We get all data sources as we will paginate them via javascript code on the client's side
|
|
// otherwise: use the default system limit and the given limitstart
|
|
if (CLIENT_SIDE_PAGINATION) {
|
|
$limit = 0;
|
|
$limitstart = 0;
|
|
} else {
|
|
$limit = $mainframe->getUserStateFromRequest('global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int');
|
|
$limitstart = $jinput->getInt('limitstart', 0);
|
|
|
|
// In case limit has been changed, adjust it
|
|
if (empty($limit)) { $limit = $mainframe->getCfg('list_limit'); $limitstart = 0; }
|
|
$limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0);
|
|
}
|
|
|
|
if (empty($archive_filename)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_ARCHIVE_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$model = $this->getModel('rulesetarchive');
|
|
$view = $this->getView('rulesetarchive','html');
|
|
$ruleset_archive = $model->loadRulesetArchive($archive_filename,$limit,$limitstart);
|
|
if (empty($ruleset_archive)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_RULESET_ARCHIVE_IS_EMPTY_OR_NOT_FOUND');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('default');
|
|
$view->display();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function viewRulesetArchivePreview() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$archive_filename = $jinput->getString( 'archive_filename', '' );
|
|
|
|
if (empty($archive_filename)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_ARCHIVE_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$model = $this->getModel('rulesetarchive');
|
|
$view = $this->getView('rulesetarchive','html');
|
|
$ruleset_archive = $model->loadRulesetArchive($archive_filename);
|
|
if (empty($ruleset_archive)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_RULESET_ARCHIVE_IS_EMPTY_OR_NOT_FOUND');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('preview');
|
|
$view->displayPreview();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function newRulesetArchive() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
|
|
$model = $this->getModel('rulesetarchive');
|
|
$view = $this->getView('rulesetarchive','html');
|
|
|
|
$view->setModel($model, true);
|
|
$view->setLayout('form');
|
|
$view->displayNew();
|
|
}
|
|
|
|
function editRulesetArchive() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$ruleset_file = $jinput->getString( 'archive_filename', '' );
|
|
|
|
if (empty($ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_ARCHIVE_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$model = $this->getModel('rulesetarchive');
|
|
$view = $this->getView('rulesetarchive','html');
|
|
|
|
$archive = $model->loadRulesetArchive($ruleset_file);
|
|
if (empty($archive)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_RULESET_ARCHIVE_IS_EMPTY_OR_NOT_FOUND');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('form');
|
|
$view->displayEdit();
|
|
}
|
|
}
|
|
}
|
|
|
|
function saveRulesetArchive() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$ruleset_file = $jinput->getString( 'archive_filename', '' );
|
|
|
|
if (empty($ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_INVALID_ARGS');
|
|
} else {
|
|
if (TabulizerValidator::isFilename($ruleset_file,'xml')) {
|
|
$model = $this->getModel('rulesetarchive');
|
|
$archive_meta = array('compatibility'=>4, 'version'=>$jinput->getString('meta_version', null),'author_name'=>$jinput->getString('meta_author_name', null),'author_email'=>$jinput->getString('meta_author_email', null),'author_url'=>$jinput->getString('meta_author_url', null), 'compatibility'=>$jinput->getString('meta_compatibility', null),'generator'=>$jinput->getString('meta_generator', null),'last_modified'=>$jinput->getString('meta_last_modified', null));
|
|
$ruleset_archive = array('name'=>$jinput->getString('archive_name', null), 'title'=>$jinput->getString('archive_title',null), 'description'=>$jinput->getString('archive_description',null), 'style'=>$jinput->getString('archive_style',null),'meta'=>$archive_meta, 'filename'=>$ruleset_file);
|
|
if ($model->saveRulesetArchive($ruleset_archive)) {
|
|
$msg = JText::_('COM_TABULIZER_RULESET_ARCHIVE_SAVED_SUCCESSFULLY');
|
|
$msg_type = 'message';
|
|
$return_url = str_replace('&','&',JRoute::_('index.php?option='.$option.'&task=viewrulesetarchives'));
|
|
$link = 'index.php?option='. $option.'&task=viewrulesetarchive&archive_filename='.urlencode($ruleset_file).'&archives_return_url='.urlencode($return_url);
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_COULD_NOT_SAVE_RULESET_ARCHIVE');
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_INVALID_RULESET_ARCHIVE_FILENAME');
|
|
}
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function deleteRulesetArchive() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$cid = $jinput->get( 'cid', array(), 'array' );
|
|
|
|
if (count( $cid )) {
|
|
$model = $this->getModel('rulesetarchive');
|
|
if ($model->deleteRulesetArchive($cid)) {
|
|
$msg = JText::_('COM_TABULIZER_SELECTED_RULESET_ARCHIVES_DELETED_SUCCESSFULLY');
|
|
$msg_type = 'message';
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_RULESET_ARCHIVES_DELETION_FAILED');
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_ARCHIVES_SELECTED_FOR_DELETION');
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function importRulesetArchive() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$importFileData = $jinput->getInt( 'import_file', 0);
|
|
$displayForm = ($importFileData)?false:true;
|
|
|
|
if ($displayForm) {
|
|
$model = $this->getModel('rulesetarchives');
|
|
$view = $this->getView('rulesetarchives','html');
|
|
$view->setModel($model, true);
|
|
$view->setLayout('import');
|
|
$view->displayImport();
|
|
return;
|
|
}
|
|
|
|
//import joomlas filesystem functions, we will do all the filewriting with joomlas functions,
|
|
//so if the ftp layer is on, joomla will write with that, not the apache user, which might
|
|
//not have the correct permissions
|
|
jimport('joomla.filesystem.file');
|
|
jimport('joomla.filesystem.folder');
|
|
|
|
//this is the name of the field in the html form, filedata is the default name for swfupload
|
|
//so we will leave it as that
|
|
$fieldName = 'zip_filename';
|
|
$file = $jinput->files->get($fieldName,null,'raw');
|
|
|
|
//any errors the server registered on uploading
|
|
$fileError = $file['error'];
|
|
if ($fileError > 0) {
|
|
switch ($fileError) {
|
|
case 1:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_LARGER_THAN_PHP_INI_ALLOWS' );
|
|
break;
|
|
case 2:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_LARGER_THAN_HTML_FORM_ALLOWS' );
|
|
break;
|
|
case 3:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_ERROR_PARTIAL' );
|
|
break;
|
|
case 4:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_ERROR_NO_FILE' );
|
|
break;
|
|
default:
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_ERROR_UNKNOWN' );
|
|
break;
|
|
|
|
}
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
//check for filesize
|
|
$fileSize = $file['size'];
|
|
$maxAllowedFileSize = 20000000;
|
|
if($fileSize > $maxAllowedFileSize)
|
|
{
|
|
$msg = JText::_( 'COM_TABULIZER_FILE_UPLOAD_LARGER_THAN_COMPONENT_ALLOWS' );
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
//check the file extension is ok
|
|
$fileName = $file['name'];
|
|
|
|
//lose any special characters in the filename
|
|
$fileName = preg_replace("/[^A-Za-z0-9._]/", "-", $fileName);
|
|
|
|
$validFileExts = array('zip');
|
|
$extOk = TabulizerValidator::isFilename($fileName, $validFileExts );
|
|
|
|
if ($extOk == false)
|
|
{
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_INVALID_EXTENSION' ),implode(',',$validFileExts));
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
//the name of the file in PHP's temp directory that we are going to move to our folder
|
|
$fileTemp = $file['tmp_name'];
|
|
|
|
//always use constants when making file paths, to avoid the possibilty of remote file inclusion
|
|
$uploadPath = TabulizerPath::getFilePath($fileName, 'upload');
|
|
$unzipPath = TabulizerPath::getDirPath('archives_root');
|
|
|
|
$overwrite = $jinput->getInt( 'overwrite_file', 0);
|
|
$overwrite_safemode = $jinput->getInt( 'overwrite_safemode', 0);
|
|
if (file_exists($uploadPath)) {
|
|
unlink($uploadPath);
|
|
/*
|
|
if ($overwrite) {
|
|
unlink($uploadPath);
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_FILE_ALREADY_EXISTS' ),$fileName,$uploadPath);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
*/
|
|
}
|
|
if(!TabulizerUtils::fileUpload($fileTemp, $uploadPath))
|
|
{
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_UNABLE_TO_UNZIP_FILE' ),$fileName);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
// unzip file
|
|
if (!class_exists('ZipArchive')) {
|
|
$css_dir = TabulizerPath::getDirPath('css');
|
|
$rules_dir = TabulizerPath::getDirPath('rules');
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_ZIP_LIBRARY_MISSING'), $css_dir, $rules_dir);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
$zip = new ZipArchive;
|
|
$return_code = $zip->open($uploadPath);
|
|
if ($return_code === TRUE) {
|
|
$data_sources = array();
|
|
$success = true;
|
|
for ($i=0; $i<$zip->numFiles;$i++) {
|
|
$entry_info = $zip->statIndex($i);
|
|
$file_entry = $unzipPath . $entry_info['name'];
|
|
if (file_exists($file_entry) && !$overwrite) {
|
|
if (!is_dir($file_entry)) {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_FILE_EXTRACT_ALREADY_EXISTS' ),$fileName,$entry_info['name'],$unzipPath);
|
|
$success = false;
|
|
break;
|
|
}
|
|
}
|
|
// security check: make sure the included paths in the archive are valid
|
|
$included_folder_name = dirname($entry_info['name']);
|
|
if ($included_folder_name == '.') {
|
|
$included_folder_name = basename($entry_info['name']);
|
|
}
|
|
if (TabulizerPath::getDirPath($included_folder_name)===false) {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_INVALID_ARCHIVE_FOLDER' ),$included_folder_name,$entry_info['name']);
|
|
$success = false;
|
|
break;
|
|
}
|
|
|
|
// security check: do not allow certain file type to be included and installed on the Joomla site
|
|
// as part of the ruleset archive importation process
|
|
$extension = substr(strrchr($entry_info['name'], "."), 1);
|
|
if (!empty($extension)) {
|
|
$extension = strtolower($extension);
|
|
// check if you need to import a data source
|
|
if (preg_match('/^datasources(.+)\.xml$/', $entry_info['name'], $matches)) {
|
|
$data_sources[] = $entry_info['name'];
|
|
}
|
|
// check if extension needs special permission
|
|
if (preg_match('#^data[\\\/](.+)$#', $entry_info['name'], $matches)) {
|
|
if (!TabulizerPermissions::isAllowedImportDataExtension($extension)) {
|
|
$allowed_data_extensions = ALLOWED_FILE_TYPES_FOR_DATA_IMPORTATION;
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_DATA_EXTENSION_NOT_ALLOWED' ),$entry_info['name'],$extension, $allowed_data_extensions);
|
|
$success = false;
|
|
break;
|
|
}
|
|
} else if (!TabulizerPermissions::isAllowedImportArchiveExtension($extension, $overwrite_safemode)) {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_FILE_EXTENSION_NOT_ALLOWED' ),$entry_info['name'],$extension);
|
|
$success = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if ($success) {
|
|
if ($zip->extractTo($unzipPath)) {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_SUCCESS'),$fileName);
|
|
$msg_type = 'message';
|
|
|
|
// import data sources, if any
|
|
if (!empty($data_sources)) {
|
|
if (!TabulizerPermissions::isAllowedImportDataSources($overwrite_safemode)) {
|
|
$msg = JText::_('COM_TABULIZER_DATA_SOURCE_IMPORTATION_NOT_ALLOWED');
|
|
$msg_type = 'error';
|
|
} else {
|
|
$ds_model = $this->getModel('datasources');
|
|
$ds_errors = array();
|
|
foreach ($data_sources as $data_source) {
|
|
$data_source_filename = $unzipPath . $data_source;
|
|
$ds_model->importDataSourceArchive($data_source_filename, $ds_errors);
|
|
}
|
|
if (!empty($ds_errors)) {
|
|
$msg = TabulizerUserMessage::printList(JText::_('COM_TABULIZER_DATA_SOURCE_IMPORTATION_ERROR'), $ds_errors, true);
|
|
$msg_type = 'error';
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_UNABLE_TO_EXTRACT_FILE' ),$fileName,$unzipPath);
|
|
}
|
|
}
|
|
$zip->close();
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
} else {
|
|
$msg = sprintf(JText::_( 'COM_TABULIZER_FILE_UPLOAD_UNABLE_TO_UNZIP_FILE' ),$fileName);
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function exportRulesetArchive() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option . '&task=viewRulesetArchives';
|
|
$msg_type = 'error';
|
|
$error_msg = null;
|
|
|
|
$cid = $jinput->get( 'cid', array(), 'array' );
|
|
|
|
if (count( $cid )) {
|
|
$model = $this->getModel('rulesetarchives');
|
|
if (!$model->exportRulesetArchives($cid, $error_msg)) {
|
|
$msg = sprintf(JText::_('COM_TABULIZER_RULESET_ARCHIVE_EXPORT_FAILED'),$error_msg);
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_ARCHIVES_SELECTED_FOR_EXPORT');
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function editCSSFile() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$css_filename = $jinput->getString( 'css_filename', '' );
|
|
$archive_filename = $jinput->getString( 'archive_filename', '' );
|
|
$ruleset_name = $jinput->getString( 'ruleset_name', '' );
|
|
|
|
if (empty($css_filename)) {
|
|
$msg = JText::_('COM_TABULIZER_INVALID_ARGS');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
if (TabulizerValidator::isFilename($css_filename, 'css')) {
|
|
$model = $this->getModel('rulesetarchive');
|
|
$view = $this->getView('rulesetarchive','html');
|
|
|
|
$model->loadCSSFile($css_filename, $archive_filename, $ruleset_name);
|
|
$view->setModel($model, true);
|
|
$view->setLayout('edit_css');
|
|
$view->displayCSSEdit();
|
|
} else {
|
|
$msg = sprintf(JText::_('COM_TABULIZER_INVALID_CSS_FILENAME'),$css_filename);
|
|
$msg_type = 'error';
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
}
|
|
}
|
|
|
|
function applyCSSFile() {
|
|
$this->saveCSSFile(true);
|
|
}
|
|
|
|
function saveCSSFile($apply = false) {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$css_filename = $jinput->getString( 'css_filename', '' );
|
|
$css_contents = $jinput->getString( 'css_contents', '' );
|
|
$ruleset_name = $jinput->getString( 'ruleset_name', '' );
|
|
$archive_filename = $jinput->getString( 'archive_filename', '' );
|
|
|
|
if (empty($css_filename) && empty($css_contents)) {
|
|
$msg = JText::_('COM_TABULIZER_INVALID_ARGS');
|
|
} else {
|
|
if (TabulizerValidator::isFilename($css_filename, 'css')) {
|
|
$model = $this->getModel('rulesetarchive');
|
|
if ($model->saveCSSFile($css_filename, $css_contents)) {
|
|
$msg = sprintf(JText::_('COM_TABULIZER_CSS_FILE_SAVED_SUCCESSFULLY'),$css_filename);
|
|
$msg_type = 'message';
|
|
if ($apply) {
|
|
$link = 'index.php?option='. $option . '&task=editCSSFile&css_filename='.$css_filename.'&archive_filename='.$archive_filename.'&ruleset_name='.$ruleset_name;
|
|
}
|
|
} else {
|
|
$msg = sprintf(JText::_('COM_TABULIZER_COULD_NOT_SAVE_CSS_FILE'),$css_filename);
|
|
}
|
|
} else {
|
|
$msg = sprintf(JText::_('COM_TABULIZER_INVALID_CSS_FILENAME'),$css_filename);
|
|
}
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
//=============================================================================================
|
|
// RULESET
|
|
//=============================================================================================
|
|
|
|
function getRulesetArgs(&$ruleset_name, &$ruleset_file) {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$ruleset_name = $jinput->getString( 'ruleset_name', '' );
|
|
$ruleset_file = $jinput->getString( 'archive_filename', '' );
|
|
|
|
if (empty($ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_ARCHIVE_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else if (empty($ruleset_name)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_NAME_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function viewRuleset() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
if ($this->getRulesetArgs($ruleset_name, $ruleset_file)) {
|
|
$model = $this->getModel('ruleset');
|
|
$view = $this->getView('ruleset','html');
|
|
$ruleset = $model->loadRuleset($ruleset_name, $ruleset_file);
|
|
if (empty($ruleset)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_RULESET_IS EMPTY_OR_NOT_FOUND');
|
|
} else {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('default');
|
|
$view->display();
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_INVALID_ARGS');
|
|
}
|
|
|
|
}
|
|
|
|
function viewRulesetPreview() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
if ($this->getRulesetArgs($ruleset_name, $ruleset_file)) {
|
|
$model = $this->getModel('ruleset');
|
|
$view = $this->getView('ruleset','html');
|
|
$ruleset = $model->loadRuleset($ruleset_name, $ruleset_file);
|
|
if (empty($ruleset)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_RULESET_IS_EMPTY_OR_NOT_FOUND');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('preview');
|
|
$view->displayPreview();
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_INVALID_ARGS');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
}
|
|
|
|
function newRuleset() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$ruleset_file = $jinput->getString( 'archive_filename', '' );
|
|
|
|
if (empty($ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_ARCHIVE_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$model = $this->getModel('rulesetarchive');
|
|
$view = $this->getView('ruleset','html');
|
|
$archive = $model->loadRulesetArchive($ruleset_file);
|
|
if (empty($archive)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_RULESET_ARCHIVE_IS_EMPTY_OR_NOT_FOUND');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('form');
|
|
$view->displayNew();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function editRuleset() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
if ($this->getRulesetArgs($ruleset_name, $ruleset_file)) {
|
|
$model = $this->getModel('ruleset');
|
|
$view = $this->getView('ruleset','html');
|
|
|
|
$ruleset = $model->loadRuleset($ruleset_name, $ruleset_file);
|
|
if (empty($ruleset)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_RULESET_IS_EMPTY_OR_NOT_FOUND');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('form');
|
|
$view->displayEdit();
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_INVALID_ARGS');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
}
|
|
|
|
function saveRuleset() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
if ($this->getRulesetArgs($ruleset_name, $ruleset_file)) {
|
|
$model = $this->getModel('ruleset');
|
|
|
|
$link = 'index.php?option='.$option.'&task=viewrulesetarchive&archive_filename='.$ruleset_file;
|
|
$ruleset = array('name'=> $jinput->getString('ruleset_name', null), 'title'=>$jinput->getString('ruleset_title', null), 'description'=>$jinput->getString('ruleset_description', null), 'suffix'=> $jinput->getString('ruleset_suffix', null), 'style'=> $jinput->getString('ruleset_style', null), 'preselected' => $jinput->getString('ruleset_preselected', null), 'filename' => $ruleset_file);
|
|
|
|
$addcopy = $jinput->getInt('addcopy', 0);
|
|
if ($addcopy) {
|
|
TabulizerPath::requireLib('ruleset','admin');
|
|
$ruleset_obj = new Ruleset();
|
|
$source_name = $ruleset['name'];
|
|
$ruleset['name'] = $ruleset_obj->getRecommendedName($ruleset['name'].'_copy_');
|
|
$exclude_titles = array();
|
|
$all_ruleset_titles = $ruleset_obj->getAllRulesetTitles($exclude_titles,$ruleset_file);
|
|
if (in_array($ruleset['title'], $all_ruleset_titles)) {
|
|
for ($i = 1; $i < 1024; $i++) {
|
|
$title = $ruleset['title'] . ' - ' . sprintf(JText::_('COM_TABULIZER_COPY_OF_NUM'), $i);
|
|
if (!in_array($title, $all_ruleset_titles)) {
|
|
$ruleset['title'] = $title;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
// copy rules, if any
|
|
if (empty($ruleset_obj->rulesets)) {
|
|
$ruleset_obj->loadRulesets($ruleset['filename'],0,0,$total_count);
|
|
}
|
|
if (isset($ruleset_obj->rulesets)) {
|
|
foreach ($ruleset_obj->rulesets as $archive_name => $ruleset_archive) {
|
|
if (!empty($ruleset['filename']) && ($ruleset_archive['filename'] != $ruleset['filename'])) continue;
|
|
foreach ($ruleset_archive['rulesets'] as $ruleset_entry) {
|
|
if ($source_name == $ruleset_entry['name']) {
|
|
if (isset($ruleset_entry['rules'])) $ruleset['rules'] = $ruleset_entry['rules'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$ruleset['preselected'] = null;
|
|
}
|
|
|
|
$sample_date = $jinput->getInt('sample_data_check', 0);
|
|
if (!empty($sample_date)) {
|
|
$sample_data_caption = $jinput->getString('sample_data_caption', null);
|
|
$sample_data_text = (isset($_REQUEST['sample_data_text']))?$_REQUEST['sample_data_text']:null; // allow HTML code
|
|
$sample_data_sep = $jinput->getString('sample_data_sep', null);
|
|
$sample_data_enc = $jinput->getString('sample_data_enc', null);
|
|
if (!empty($sample_data_text) && !empty($sample_data_sep)) {
|
|
$ruleset['sample_data'] = 1;
|
|
$ruleset['sample_data_caption'] = $sample_data_caption;
|
|
$ruleset['sample_data_text'] = $sample_data_text;
|
|
$ruleset['sample_data_sep'] = $sample_data_sep;
|
|
$ruleset['sample_data_enc'] = $sample_data_enc;
|
|
}
|
|
}
|
|
|
|
if ($model->saveRuleset($ruleset, $ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_RULESET_SAVED_SUCCESSFULLY');
|
|
$msg_type = 'message';
|
|
$return_url = str_replace('&','&',JRoute::_('index.php?option='.$option.'&task=viewrulesetarchive&archive_filename='.$ruleset_file));
|
|
$link = 'index.php?option='.$option.'&task=viewRuleset&ruleset_name='.$ruleset['name'].'&archive_filename='.$ruleset_file.'&archive_return_url='.urlencode($return_url);
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_COULD_NOT_SAVE_RULESET');
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_INVALID_ARGS');
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function deleteRuleset() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$cid = $jinput->get( 'cid', array(), 'array' );
|
|
|
|
if (count( $cid )) {
|
|
$ruleset_file = $jinput->getString( 'archive_filename', '' );
|
|
if (empty($ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_ARCHIVE_IS_SPECIFIED');
|
|
} else {
|
|
$model = $this->getModel('ruleset');
|
|
if ($model->deleteRuleset($cid, $ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_SELECTED_RULESETS_DELETED_SUCCESSFULLY');
|
|
$link = 'index.php?option='.$option.'&task=viewrulesetarchive&archive_filename='.$ruleset_file;
|
|
$msg_type = 'message';
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_RULESETS_DELETION_FAILED');
|
|
}
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESETS_SELECTED_FOR_DELETION');
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
|
|
//=============================================================================================
|
|
// RULE
|
|
//=============================================================================================
|
|
|
|
function getRuleArgs(&$rule_id, &$ruleset_name, &$ruleset_file) {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$rule_id = $jinput->getString( 'rule_id', '' );
|
|
$ruleset_name = $jinput->getString( 'ruleset_name', '' );
|
|
$ruleset_file = $jinput->getString( 'archive_filename', '' );
|
|
|
|
if (empty($ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_ARCHIVE_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else if (empty($ruleset_name)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_NAME_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else if (!is_numeric($rule_id)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULE_ID_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function viewRule() {
|
|
jexit('viewRule: Not yet implemented!');
|
|
|
|
}
|
|
|
|
function newRule() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$ruleset_name = $jinput->getString( 'ruleset_name', '' );
|
|
$ruleset_file = $jinput->getString( 'archive_filename', '' );
|
|
|
|
if (empty($ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_ARCHIVE_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else if (empty($ruleset_name)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_NAME_IS_SPECIFIED');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$model = $this->getModel('ruleset');
|
|
$view = $this->getView('rule','html');
|
|
$ruleset = $model->loadRuleset($ruleset_name, $ruleset_file);
|
|
if (empty($ruleset)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_RULESET_IS_EMPTY_OR_NOT_FOUND');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('form');
|
|
$view->displayNew();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function editRule() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
if ($this->getRuleArgs($rule_id, $ruleset_name, $ruleset_file)) {
|
|
$model = $this->getModel('rule');
|
|
$view = $this->getView('rule','html');
|
|
$rule = $model->loadRule($rule_id, $ruleset_name, $ruleset_file);
|
|
if (empty($rule)) {
|
|
$msg = JText::_('COM_TABULIZER_SPECIFIED_RULE_IS_EMPTY_OR_NOT_FOUND');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
} else {
|
|
$view->setModel($model, true);
|
|
$view->setLayout('form');
|
|
$view->displayEdit();
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_INVALID_ARGS');
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
}
|
|
|
|
function saveRule() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
$return_urls = null;
|
|
|
|
if ($this->getRuleArgs($rule_id, $ruleset_name, $ruleset_file)) {
|
|
$addnew = $jinput->getInt('addnew', 0);
|
|
if ($addnew) {
|
|
$model = $this->getModel('ruleset');
|
|
if ($model->loadRuleset($ruleset_name, $ruleset_file)) {
|
|
$model->getReturnURLs($return_urls);
|
|
$link = 'index.php?option='.$option.'&task=viewruleset&task=newRule'.
|
|
'&ruleset_name='.urlencode($ruleset_name).
|
|
'&archive_filename='.urlencode($ruleset_file).'&archives_return_url='.urlencode($return_urls['archives']).
|
|
'&archive_return_url='.urlencode($return_urls['archive']);
|
|
}
|
|
} else {
|
|
$link = 'index.php?option='.$option.'&task=viewruleset&ruleset_name='.$ruleset_name.'&archive_filename='.$ruleset_file;
|
|
}
|
|
|
|
$rule = array('element'=> $jinput->getString('element', null),
|
|
'element_section'=> $jinput->get('element_section', null, 'raw'),
|
|
'range'=> $jinput->get('range', null, 'raw'),
|
|
'range_key'=> $jinput->getInt('range_key', null),
|
|
'priority'=> $jinput->getInt('priority', null),
|
|
'style'=> $jinput->getString('style', null),
|
|
'autospan'=> $jinput->getString('autospan', null),
|
|
'th_tag'=> $jinput->getString('th_tag', null),
|
|
'remove'=> $jinput->getString('remove', null),
|
|
'format'=> $jinput->get('format_data_type', null, 'raw'),
|
|
'prepend'=> $jinput->get('table_prepend', '', 'raw' ),
|
|
'append'=> $jinput->get('table_append', '', 'raw' ),
|
|
'add_files' => $jinput->getString('add_files',null),
|
|
'calculation' => $jinput->getString('calculation',null),
|
|
'modification' => $jinput->getString('modification',null),
|
|
'split' => $jinput->getString('table_split', null),
|
|
'pagination' => $jinput->getString('table_pagination', null),
|
|
'scroll' => $jinput->getString('table_scroll', null),
|
|
'filter' => $jinput->getString('table_filter', null),
|
|
'column_filter' => $jinput->getString('table_column_filter', null),
|
|
'sort' => $jinput->getString('table_sort', null),
|
|
'theme' => $jinput->getString('table_theme', null),
|
|
'responsive' => $jinput->getString('table_responsive', null),
|
|
'graph' => $jinput->getString('table_graph', null),
|
|
'export_table' => $jinput->getString('table_export_table', null));
|
|
|
|
// unset some values that do not make sense for the selected element
|
|
$element = strtolower(trim($rule['element']));
|
|
switch ($element) {
|
|
case 'table':
|
|
$unset_keys = array('element_section','range_key','autospan');
|
|
break;
|
|
case 'row':
|
|
case 'column':
|
|
$unset_keys = array('prepend','append','add_files','modification','split','pagination','scroll','filter','column_filter','sort','responsive','graph','export_table');
|
|
break;
|
|
case 'cell':
|
|
$unset_keys = array('element_section','range_key','autospan','prepend','append','add_files','calculation','modification','split','pagination','scroll','filter','column_filter','sort','responsive','graph','export_table');
|
|
break;
|
|
default:
|
|
$unset_keys = array();
|
|
}
|
|
if (!empty($unset_keys)) {
|
|
foreach ($unset_keys as $unset_key) {
|
|
$rule[$unset_key] = null;
|
|
}
|
|
}
|
|
|
|
// attribute
|
|
# We give the use free access to html tags, include img that would be strips form $jinput->get function
|
|
$attribute_name = $jinput->post->get('attribute_name', '', 'raw' );
|
|
$attribute_value = $jinput->post->get('attribute_value', '', 'raw' );
|
|
if ((!empty($attribute_name))&&($attribute_value!='')) {
|
|
$rule['attribute'] = $attribute_name . ATTRIBUTE_SEPARATOR . $attribute_value;
|
|
}
|
|
|
|
// replacement
|
|
# We give the use free access to html tags, include img that would be strips form $jinput->get function
|
|
$replace_from = $jinput->post->get('replace_from', '', 'raw' );
|
|
$replace_to = $jinput->post->get('replace_to', '', 'raw' );
|
|
$replace_cs = $jinput->getInt('replace_cs', 0);
|
|
if ((!empty($replace_from))||(!empty($replace_from))) {
|
|
$rule['replacement'] = $replace_cs . REPLACEMENT_SEPARATOR . $replace_from . REPLACEMENT_SEPARATOR . $replace_to;
|
|
}
|
|
|
|
if ($rule['format']) {
|
|
$data_type_params = $jinput->get('format_data_type_params','','raw');
|
|
if (!empty($data_type_params)) {
|
|
$rule['format'] = $rule['format'] . DATA_TYPE_SEPARATOR . $data_type_params;
|
|
} else {
|
|
unset($rule['format']);
|
|
}
|
|
}
|
|
|
|
$model = $this->getModel('rule');
|
|
if ($model->saveRule($rule, $rule_id, $ruleset_name, $ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_RULE_SAVED_SUCCESSFULLY');
|
|
$msg_type = 'message';
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_COULD_NOT_SAVE_RULE');
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_INVALID_ARGS');
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function deleteRule() {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg_type = 'error';
|
|
|
|
$cid = $jinput->get( 'cid', array(), 'array' );
|
|
JArrayHelper::toInteger($cid);
|
|
if (count( $cid )) {
|
|
$ruleset_name = $jinput->getString( 'ruleset_name', '' );
|
|
$ruleset_file = $jinput->getString( 'archive_filename', '' );
|
|
|
|
if (empty($ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_ARCHIVE_IS_SPECIFIED');
|
|
} else if (empty($ruleset_name)) {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULESET_NAME_IS_SPECIFIED');
|
|
} else {
|
|
$model = $this->getModel('rule');
|
|
if ($model->deleteRule($cid, $ruleset_name, $ruleset_file)) {
|
|
$msg = JText::_('COM_TABULIZER_SELECTED_RULES_DELETED_SUCCESSFULLY');
|
|
$link = 'index.php?option='.$option.'&task=viewruleset&ruleset_name='.$ruleset_name.'&archive_filename='.$ruleset_file;
|
|
$msg_type = 'message';
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_RULES_DELETION_FAILED');
|
|
}
|
|
}
|
|
} else {
|
|
$msg = JText::_('COM_TABULIZER_NO_RULES_SELECTED_FOR_DELETION');
|
|
}
|
|
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
|
|
function isAllowed($task, &$user_msg) {
|
|
|
|
$allowed = 1; // unless otherwise proven
|
|
|
|
switch ($task) {
|
|
case 'dsdata':
|
|
case 'outputDataSource':
|
|
case 'exportdata':
|
|
$allowed = 1;
|
|
break;
|
|
|
|
case 'dialog':
|
|
case 'convert':
|
|
case 'dsselect':
|
|
case 'extract_table_data':
|
|
case 'extract_grid_data':
|
|
case 'save_grid_data':
|
|
case 'grab_table_data':
|
|
case 'viewStatus':
|
|
case 'editUserPreferences':
|
|
case 'saveUserPreferences':
|
|
$allowed = (TabulizerPermissions::isAllowed('ruleset-use'))?1:0;
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_RULESET_USE');
|
|
break;
|
|
|
|
case 'viewRulesetArchives':
|
|
case 'viewDataSources':
|
|
case 'viewRulesetArchive':
|
|
case 'viewRulesetArchivePreview':
|
|
case 'viewRuleset':
|
|
case 'viewRulesetPreview':
|
|
case 'viewRule':
|
|
$allowed = (TabulizerPermissions::isAllowed('ruleset-view'))?1:0;
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_RULESET_VIEW');
|
|
break;
|
|
|
|
case 'newRulesetArchive':
|
|
case 'editRulesetArchive':
|
|
case 'saveRulesetArchive':
|
|
case 'deleteRulesetArchive':
|
|
case 'getRulesetArgs':
|
|
case 'newRuleset':
|
|
case 'editRuleset':
|
|
case 'saveRuleset':
|
|
case 'deleteRuleset':
|
|
case 'getRuleArgs':
|
|
case 'newRule':
|
|
case 'editRule':
|
|
case 'saveRule':
|
|
case 'deleteRule':
|
|
case 'editCSSFile':
|
|
case 'applyCSSFile':
|
|
case 'saveCSSFile':
|
|
$allowed = (TabulizerPermissions::isAllowed('ruleset-edit'))?1:0;
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_RULESET_EDIT');
|
|
break;
|
|
|
|
case 'importRulesetArchive':
|
|
$allowed = (TabulizerPermissions::isAllowed('ruleset-import'))?1:0;
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_RULESET_IMPORT');
|
|
break;
|
|
|
|
case 'exportRulesetArchive':
|
|
$allowed = (TabulizerPermissions::isAllowed('ruleset-export'))?1:0;
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_RULESET_EXPORT');
|
|
break;
|
|
|
|
case 'previewDataSource':
|
|
case 'viewDataSourcesStart':
|
|
$allowed = (TabulizerPermissions::isAllowed('data-source-view'))?1:0;
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_DATA_SOURCE_VIEW');
|
|
break;
|
|
|
|
case 'newDataSource':
|
|
case 'editDataSource':
|
|
case 'saveDataSource':
|
|
case 'deleteDataSource':
|
|
case 'clearDataSourceCache':
|
|
$allowed = (TabulizerPermissions::isAllowed('data-source-edit'))?1:0;
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_DATA_SOURCE_EDIT');
|
|
break;
|
|
|
|
case 'importDataSource':
|
|
$allowed = (TabulizerPermissions::isAllowed('data-source-import'))?1:0;
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_DATA_SOURCE_IMPORT');
|
|
break;
|
|
|
|
case 'editDataSourcePublishingPreferences':
|
|
case 'saveDataSourcePublishingPreferences':
|
|
case 'exportDataSource':
|
|
$allowed = (TabulizerPermissions::isAllowed('data-source-export'))?1:0;
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_DATA_SOURCE_EXPORT');
|
|
break;
|
|
|
|
case 'extract_excel_data':
|
|
case 'upload_excel_file':
|
|
case 'extract_csv_data':
|
|
case 'upload_csv_file':
|
|
$allowed = (TabulizerPermissions::isAllowed('data-import'))?1:0;
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_EXCEL_IMPORT');
|
|
break;
|
|
|
|
case 'manageDataFiles':
|
|
case 'deleteDataFile':
|
|
case 'downloadDataFile':
|
|
case 'importDataFile':
|
|
$allowed = (TabulizerPermissions::isAllowed('data-import'))?1:0;
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_DATA_FILE');
|
|
break;
|
|
|
|
case 'editUserPermissions':
|
|
case 'saveUserPermissions':
|
|
$allowed = TabulizerPermissions::isAdmin();
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_USER_PERMISSIONS_SAVE');
|
|
break;
|
|
|
|
case 'system-save':
|
|
$allowed = TabulizerPermissions::isAdmin();
|
|
$user_msg = JText::_('COM_TABULIZER_PERMISSION_REQUIRED_FOR_USER_SYSTEM_PREFERENCES_SAVE');
|
|
break;
|
|
}
|
|
|
|
return $allowed;
|
|
}
|
|
|
|
function checkSessionTokenValidity($task) {
|
|
$jinput = JFactory::getApplication()->input;
|
|
$option = $jinput->getCmd('option');
|
|
$link = 'index.php?option='. $option;
|
|
$msg = JText::_('COM_TABULIZER_SESSION_TOKEN_INVALID');
|
|
$msg_type = 'error';
|
|
$valid = false;
|
|
|
|
switch ($task) {
|
|
case 'saveRulesetArchive':
|
|
case 'saveRuleset':
|
|
case 'saveRule':
|
|
$valid = JSession::checkToken();
|
|
if (!$valid) {
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
break;
|
|
|
|
case 'deleteRulesetArchive':
|
|
case 'deleteRuleset':
|
|
case 'deleteRule':
|
|
// token in URL
|
|
$valid = JSession::checkToken( 'get' );
|
|
// token in form (hidden field)
|
|
if (!$valid) $valid = JSession::checkToken();
|
|
if (!$valid) {
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
break;
|
|
|
|
case 'importRulesetArchive':
|
|
$importFileData = $jinput->getInt( 'import_file', 0);
|
|
$displayForm = ($importFileData)?false:true;
|
|
if ($displayForm) $valid = true;
|
|
else $valid = JSession::checkToken();
|
|
if (!$valid) {
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
break;
|
|
|
|
case 'exportDataSource':
|
|
case 'exportRulesetArchive':
|
|
$valid = JSession::checkToken();
|
|
if (!$valid) {
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
break;
|
|
|
|
case 'importDataFile':
|
|
case 'deleteDataFile':
|
|
// token in URL
|
|
$valid = JSession::checkToken( 'get' );
|
|
// token in form (hidden field)
|
|
if (!$valid) $valid = JSession::checkToken();
|
|
if (!$valid) {
|
|
$this->setRedirect($link, $msg, $msg_type);
|
|
}
|
|
break;
|
|
|
|
case 'extract_table_data':
|
|
case 'extract_excel_data':
|
|
case 'upload_excel_file':
|
|
$valid = JSession::checkToken();
|
|
if (!$valid) {
|
|
$output = json_encode(array("error_msg" => $msg));
|
|
jexit($output);
|
|
}
|
|
break;
|
|
|
|
case 'convert':
|
|
$valid = JSession::checkToken();
|
|
if (!$valid) {
|
|
$html = ERROR_CODE_PREFIX;
|
|
$html .= '<error>'.$msg.'</error>';
|
|
jexit($msg);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
$valid = true;
|
|
break;
|
|
}
|
|
|
|
return $valid;
|
|
}
|
|
|
|
function printWarning($msg, $use_html = true) {
|
|
if ($use_html) {
|
|
TabulizerUserMessage::printError($msg);
|
|
} else {
|
|
echo $msg;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
?>
|