mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
@@ -0,0 +1 @@
|
||||
|
||||
Executable → Regular
+1
@@ -208,6 +208,7 @@ $config['fhc_acl'] = array
|
||||
'system.tbl_webservicerecht' => 'basis/webservicerecht',
|
||||
'system.tbl_webservicetyp' => 'basis/webservicetyp',
|
||||
'system.tbl_udf' => 'system/udf',
|
||||
'system.tbl_extensions' => 'system/extensions',
|
||||
'testtool.tbl_ablauf' => 'basis/ablauf',
|
||||
'testtool.tbl_antwort' => 'basis/antwort',
|
||||
'testtool.tbl_frage' => 'basis/frage',
|
||||
|
||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
@@ -31,9 +31,6 @@ class Redirect extends FHC_Controller
|
||||
|
||||
// Loads model MessageTokenModel
|
||||
$this->load->model('system/MessageToken_model', 'MessageTokenModel');
|
||||
|
||||
// Loads library OrganisationseinheitLib
|
||||
$this->load->library('OrganisationseinheitLib');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -55,10 +52,23 @@ class Redirect extends FHC_Controller
|
||||
|
||||
if ($oe_kurzbz != null && $oe_kurzbz != '')
|
||||
{
|
||||
$rootOE = $this->organisationseinheitlib->getRoot($oe_kurzbz);
|
||||
if ($rootOE->error)
|
||||
$organisationRoot = null;
|
||||
$getOERoot = $this->MessageTokenModel->getOERoot($oe_kurzbz);
|
||||
if ($getOERoot) // If no errors occurred
|
||||
{
|
||||
show_error($rootOE->retval);
|
||||
// If data are present
|
||||
if (is_array($getOERoot->result()) && count($getOERoot->result()) > 0)
|
||||
{
|
||||
$organisationseinheit = $getOERoot->result()[0];
|
||||
if ($organisationseinheit->oe_kurzbz == null)
|
||||
{
|
||||
show_error('No organisation unit present in the message');
|
||||
}
|
||||
else
|
||||
{
|
||||
$organisationRoot = $organisationseinheit->oe_kurzbz;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$addonAufnahmeUrls = $this->config->item('addons_aufnahme_url');
|
||||
@@ -66,10 +76,10 @@ class Redirect extends FHC_Controller
|
||||
if (isset($token)
|
||||
&& hasData($msg)
|
||||
&& is_array($addonAufnahmeUrls)
|
||||
&& hasData($rootOE)
|
||||
&& isset($addonAufnahmeUrls[$rootOE->retval[0]->oe_kurzbz]))
|
||||
&& $organisationRoot != null
|
||||
&& isset($addonAufnahmeUrls[$organisationRoot]))
|
||||
{
|
||||
redirect($addonAufnahmeUrls[$rootOE->retval[0]->oe_kurzbz] . '?token=' . $token);
|
||||
redirect($addonAufnahmeUrls[$organisationRoot] . '?token=' . $token);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Executable → Regular
Executable → Regular
@@ -0,0 +1 @@
|
||||
|
||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Manager extends VileSci_Controller
|
||||
{
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Load helpers to upload files
|
||||
$this->load->helper(array('form', 'url'));
|
||||
|
||||
// Loads the extensions library
|
||||
$this->load->library('ExtensionsLib');
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$viewData = array(
|
||||
'extensions' => $this->extensionslib->getInstalledExtensions()
|
||||
);
|
||||
|
||||
$this->load->view('system/extensions/manager.php', $viewData);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function toggleExtension()
|
||||
{
|
||||
$toggleExtension = false;
|
||||
|
||||
$extension_id = $this->input->post('extension_id');
|
||||
$enabled = $this->input->post('enabled');
|
||||
|
||||
if ($enabled === 'true')
|
||||
{
|
||||
$toggleExtension = $this->extensionslib->enableExtension($extension_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
$toggleExtension = $this->extensionslib->disableExtension($extension_id);
|
||||
}
|
||||
|
||||
$this->output
|
||||
->set_content_type('application/json')
|
||||
->set_output(json_encode($toggleExtension));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function delExtension()
|
||||
{
|
||||
$delExtension = false;
|
||||
|
||||
$extension_id = $this->input->post('extension_id');
|
||||
|
||||
$delExtension = $this->extensionslib->delExtension($extension_id);
|
||||
|
||||
$this->output
|
||||
->set_content_type('application/json')
|
||||
->set_output(json_encode($delExtension));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function uploadExtension()
|
||||
{
|
||||
$this->extensionslib->installExtension();
|
||||
}
|
||||
}
|
||||
Executable → Regular
@@ -0,0 +1 @@
|
||||
|
||||
Executable → Regular
@@ -0,0 +1 @@
|
||||
|
||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
if (! defined("BASEPATH")) exit("No direct script access allowed");
|
||||
|
||||
/**
|
||||
* Enhanced printf utility library
|
||||
* Usefull to print messages in a fancy and cool way from CLI and web interface
|
||||
*/
|
||||
class EPrintfLib
|
||||
{
|
||||
// Prefixes and separator for messages
|
||||
const MSG_PREFIX = "[-]";
|
||||
const INFO_PREFIX = "[I]";
|
||||
const ERROR_PREFIX = "[E]";
|
||||
const SEPARATOR = "------------------------------";
|
||||
// Console colors codes
|
||||
const ERROR_COLOR = 31;
|
||||
const INFO_COLOR = 33;
|
||||
|
||||
const PRINT_QUERY_LEN = 60;
|
||||
|
||||
// HTML colors names
|
||||
private $HTML_COLORS = array(31 => "red", 33 => "orange");
|
||||
// Used to set if the migration process is called via command line or via browser
|
||||
private $cli;
|
||||
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// Get code igniter instance
|
||||
$this->ci =& get_instance();
|
||||
|
||||
$this->setCli();
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
* Prints a formatted message
|
||||
*/
|
||||
public function printMessage($message)
|
||||
{
|
||||
$this->_print(EPrintfLib::MSG_PREFIX, $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a formatted info
|
||||
*/
|
||||
public function printInfo($info)
|
||||
{
|
||||
$this->_print(EPrintfLib::INFO_PREFIX, $info, EPrintfLib::INFO_COLOR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a formatted error
|
||||
*/
|
||||
public function printError($error)
|
||||
{
|
||||
$this->_print(EPrintfLib::ERROR_PREFIX, $error, EPrintfLib::ERROR_COLOR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print only the end of line
|
||||
*/
|
||||
public function printEOL()
|
||||
{
|
||||
echo $this->getEOL();
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
// Private methods
|
||||
|
||||
/**
|
||||
* Set property cli to false if the migration process is called via command line
|
||||
* otherwise to false if it's called via browser
|
||||
*/
|
||||
private function setCli()
|
||||
{
|
||||
if ($this->ci->input->is_cli_request())
|
||||
{
|
||||
$this->cli = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->cli = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character of end of line
|
||||
* PHP_EOL platform dependent if cli is true
|
||||
* Tag <br> if cli is false
|
||||
*/
|
||||
private function getEOL()
|
||||
{
|
||||
if ($this->cli === true)
|
||||
{
|
||||
return PHP_EOL;
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<br>";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the string needed to color the output
|
||||
*/
|
||||
private function getColored($color)
|
||||
{
|
||||
$colored = "%s";
|
||||
|
||||
if (!is_null($color))
|
||||
{
|
||||
if ($this->cli === true)
|
||||
{
|
||||
$colored = "\033[".$color."m%s\033[37m";
|
||||
}
|
||||
else
|
||||
{
|
||||
$colored = "<font color=\"".$this->HTML_COLORS[$color]."\">%s</font>";
|
||||
}
|
||||
}
|
||||
|
||||
return $colored;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a message, even colored if specified
|
||||
*/
|
||||
private function _print($prefix, $text, $color = null)
|
||||
{
|
||||
printf($this->getColored($color), sprintf("%s %s".$this->getEOL(), $prefix, $text));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,884 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
* Library to manage core extensions
|
||||
*/
|
||||
class ExtensionsLib
|
||||
{
|
||||
const SQL_DIRECTORY = 'sql'; // directory where to retrive SQL scripts
|
||||
const SQL_FILE_EXTENSION = '.sql'; // SQL scripts file extension
|
||||
|
||||
const FILE_INPUT_NAME = 'extension'; // name of the HTTP parameter containing the archive data
|
||||
const ARCHIVE_EXTENSIONS = array('.tgz', '.tbz2'); // accepted file extensions for an uploaded extension
|
||||
|
||||
const EXTENSION_JSON_NAME = 'extension.json'; // file that contains extension data
|
||||
|
||||
const UPLOAD_PATH = APPPATH.'tmp/'; // temporary directory to store the upload file and checks the archive
|
||||
const EXTENSIONS_PATH = APPPATH.'extensions/'; // directory where all the extensions are
|
||||
const EXTENSIONS_DIR_NAME = 'extensions'; // name of the directories where will be created the symlinks
|
||||
|
||||
// Directories that are part of the extension archive
|
||||
const SOFTLINK_TARGET_DIRECTORIES = array('config', 'controllers', 'helpers', 'hooks', 'libraries', 'models', 'views', 'widgets');
|
||||
|
||||
private $_errorOccurred; // boolean, true if an error occurred while installing an extension
|
||||
private $_currentInstalledExtensionVersion; // contains the version of the current installation of an extension
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// Get code igniter instance
|
||||
$this->ci =& get_instance();
|
||||
|
||||
// Loads message configurationx
|
||||
$this->ci->config->load('message');
|
||||
|
||||
// Loads EPrintfLib
|
||||
$this->ci->load->library('EPrintfLib');
|
||||
|
||||
// Loading models
|
||||
$this->ci->load->model('system/Extensions_model', 'ExtensionsModel');
|
||||
|
||||
// Set default values fot class properties
|
||||
$this->_errorOccurred = false;
|
||||
$this->_currentInstalledExtensionVersion = 0;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
* Main method to install an extension
|
||||
*/
|
||||
public function installExtension()
|
||||
{
|
||||
$extensionDB = null; // contains data from DB about an extension
|
||||
$extensionJson = null; // contains the extension.json data
|
||||
|
||||
$this->_printInfo('WARNING!!! Please do not change page or stop this procedure before it is finished');
|
||||
|
||||
$this->_loadUploadLibrary(); // loads CI upload library
|
||||
|
||||
$uploadData = $this->_uploadExtension(); // perform the upload of the file and returns info about it
|
||||
|
||||
if ($uploadData != null) // if no error occurred
|
||||
{
|
||||
$this->_extractExtension($uploadData->fullPath); // extract the archive of the uploaded extension
|
||||
|
||||
if (!$this->_errorOccurred) // if no error occurred
|
||||
{
|
||||
// Retives data about any previous installation of this extension
|
||||
$extensionDB = $this->_loadPreviousInstallation($uploadData->extensionName);
|
||||
}
|
||||
|
||||
if (!$this->_errorOccurred) // if no error occurred
|
||||
{
|
||||
// Checks the structure of the uploaded extension
|
||||
$this->_chkFSStructure($uploadData->extensionName);
|
||||
}
|
||||
|
||||
if (!$this->_errorOccurred) // if no error occurred
|
||||
{
|
||||
// Checks file extension.json and returns its content
|
||||
$extensionJson = $this->_chkExtensionJson($uploadData->extensionName, $extensionDB);
|
||||
}
|
||||
|
||||
if ($extensionJson != null) // if no error occurred
|
||||
{
|
||||
$this->_printStart('Proceding with the installation of the extension: '.$extensionJson->name);
|
||||
$this->_printEnd();
|
||||
|
||||
$this->_cleanPreviousInstallation($extensionJson); // cleans any previous installation
|
||||
|
||||
$this->_installExtension($extensionJson); // records extension data in DB
|
||||
|
||||
if (!$this->_errorOccurred) // if no error occurred
|
||||
{
|
||||
// Loads and executes neede SQL scripts
|
||||
$this->_loadSQLs(
|
||||
ExtensionsLib::UPLOAD_PATH.$extensionJson->name.'/'.ExtensionsLib::SQL_DIRECTORY,
|
||||
$extensionJson
|
||||
);
|
||||
}
|
||||
|
||||
if (!$this->_errorOccurred) // if no error occurred
|
||||
{
|
||||
// Move the extracted extension from the temporary directory to the extensions install directory
|
||||
$this->_moveExtension($extensionJson->name);
|
||||
}
|
||||
|
||||
if (!$this->_errorOccurred) // if no error occurred
|
||||
{
|
||||
// Create the symlinks to the installed extension
|
||||
$this->_createSymLinks($extensionJson->name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_errorOccurred = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_errorOccurred = true;
|
||||
}
|
||||
|
||||
if ($this->_errorOccurred === false) // if no errors occurred
|
||||
{
|
||||
if (!$this->_rrm($uploadData->fullPath)) // removes uploaded file
|
||||
{
|
||||
$this->_printInfo('Error while cleaning upload directory. Not a blocking error');
|
||||
}
|
||||
|
||||
$this->_printMessage('Extension correctly installed, you can safely close this page');
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_printError('There was a blocking error while installing/updating an extension, rolling back');
|
||||
|
||||
$this->_rollback($uploadData, $extensionDB, $extensionJson); // rock & rollback!
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an installed extension using the extension_id stored in the DB
|
||||
*/
|
||||
public function delExtension($extensionId)
|
||||
{
|
||||
$delExtension = false;
|
||||
|
||||
// Loads data about this extension from the DB
|
||||
$result = $this->ci->ExtensionsModel->load($extensionId);
|
||||
if (hasData($result)) // if something was found
|
||||
{
|
||||
$extensionName = $result->retval[0]->name; // extension name
|
||||
$this->_delSoftLinks($extensionName); // not to be checked, could fail if the extension is disabled
|
||||
// remove the extension from the extensions installation directory
|
||||
$delExtension = $this->_rrm(ExtensionsLib::EXTENSIONS_PATH.$extensionName);
|
||||
|
||||
// Select all the version of this extension
|
||||
$this->ci->ExtensionsModel->addSelect('extension_id');
|
||||
$result = $this->ci->ExtensionsModel->loadWhere(array('name' => $extensionName));
|
||||
if (hasData($result)) // if something was found
|
||||
{
|
||||
$extsArray = array();
|
||||
foreach ($result->retval as $key => $extension) // loops on them
|
||||
{
|
||||
// Remove them all
|
||||
$result = $this->ci->ExtensionsModel->delete($extension->extension_id);
|
||||
if (isSuccess($result))
|
||||
{
|
||||
$delExtension = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $delExtension;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrive the list of all the installed extensions
|
||||
*/
|
||||
public function getInstalledExtensions()
|
||||
{
|
||||
return $this->ci->ExtensionsModel->getInstalledExtensions();
|
||||
}
|
||||
|
||||
/**
|
||||
* To enable an extension
|
||||
*/
|
||||
public function enableExtension($extensionId)
|
||||
{
|
||||
return $this->_toggleExtension($extensionId, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* To disable an extension
|
||||
*/
|
||||
public function disableExtension($extensionId)
|
||||
{
|
||||
return $this->_toggleExtension($extensionId, false);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
// Private methods
|
||||
|
||||
/**
|
||||
* Loads the upload library of CI
|
||||
*/
|
||||
private function _loadUploadLibrary()
|
||||
{
|
||||
$this->ci->load->library(
|
||||
'upload',
|
||||
array(
|
||||
'upload_path' => ExtensionsLib::UPLOAD_PATH,
|
||||
'allowed_types' => '*',
|
||||
'overwrite' => true
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform the upload of an extension archive and returns its data
|
||||
*/
|
||||
private function _uploadExtension()
|
||||
{
|
||||
$_uploadExtension = null;
|
||||
|
||||
$this->_printStart('Uploading extension');
|
||||
|
||||
// If the upload was a success
|
||||
if ($this->ci->upload->do_upload(ExtensionsLib::FILE_INPUT_NAME))
|
||||
{
|
||||
$uploadData = $this->ci->upload->data(); // retrives data about the uploaded file
|
||||
// Checks the file extension
|
||||
$uploadedFileExtension = '.'.pathinfo($uploadData['full_path'], PATHINFO_EXTENSION);
|
||||
if (!in_array($uploadedFileExtension, ExtensionsLib::ARCHIVE_EXTENSIONS))
|
||||
{
|
||||
$this->_printFailure('file extension must be tgz OR tbz2');
|
||||
|
||||
// Remove the uploaded file
|
||||
if (isset($uploadData['full_path']) && file_exists($uploadData['full_path']))
|
||||
{
|
||||
$this->_rrm($uploadData['full_path']);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Returns the extension name and the full path of the uploaded file
|
||||
$_uploadExtension = new stdClass();
|
||||
$_uploadExtension->extensionName = str_replace(ExtensionsLib::ARCHIVE_EXTENSIONS, '', $uploadData['file_name']);
|
||||
$_uploadExtension->fullPath = $uploadData['full_path'];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_printFailure($this->ci->upload->display_errors('', ''));
|
||||
}
|
||||
|
||||
$this->_printSuccess($_uploadExtension != null);
|
||||
|
||||
$this->_printEnd();
|
||||
|
||||
return $_uploadExtension;
|
||||
}
|
||||
|
||||
/**
|
||||
* To extract the extension archive
|
||||
*/
|
||||
private function _extractExtension($uploadPath)
|
||||
{
|
||||
$this->_printStart('Extracting extension');
|
||||
|
||||
try
|
||||
{
|
||||
// Extracts the uploaded file
|
||||
$pd = new PharData($uploadPath);
|
||||
|
||||
$pd->extractTo(ExtensionsLib::UPLOAD_PATH, null, true);
|
||||
}
|
||||
catch (UnexpectedValueException $uva)
|
||||
{
|
||||
$this->_errorOccurred = true;
|
||||
$this->_printFailure('provided an invalid archive');
|
||||
}
|
||||
catch (PharException $pe)
|
||||
{
|
||||
$this->_errorOccurred = true;
|
||||
$this->_printFailure('generic error occurred, check logs');
|
||||
}
|
||||
|
||||
$this->_printSuccess(!$this->_errorOccurred);
|
||||
|
||||
$this->_printEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads any previous installations of the given extension from DB
|
||||
*/
|
||||
private function _loadPreviousInstallation($extensionName)
|
||||
{
|
||||
$extensionDB = null;
|
||||
|
||||
$this->_printStart('Loads any previous installation data');
|
||||
|
||||
// Loads the last version of the previous installation of this extension
|
||||
$this->ci->ExtensionsModel->addOrder('version', 'DESC');
|
||||
$this->ci->ExtensionsModel->addLimit(1);
|
||||
$result = $this->ci->ExtensionsModel->loadWhere(array('name' => $extensionName));
|
||||
if (isError($result))
|
||||
{
|
||||
$this->_errorOccurred = true;
|
||||
$this->_printFailure('data base error');
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hasData($result)) // if found
|
||||
{
|
||||
$extensionDB = $result->retval[0]; // return it!
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_printMessage('not found');
|
||||
}
|
||||
}
|
||||
|
||||
$this->_printSuccess(!$this->_errorOccurred);
|
||||
|
||||
$this->_printEnd();
|
||||
|
||||
return $extensionDB;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the structure of the extension archive
|
||||
*/
|
||||
private function _chkFSStructure($extensionName)
|
||||
{
|
||||
$this->_printStart('Checking extension file system structure');
|
||||
|
||||
// Checks if the root directory of this archive has the same name of the extension
|
||||
if (is_dir(ExtensionsLib::UPLOAD_PATH.$extensionName))
|
||||
{
|
||||
// Checks if file extension.json exists inside the uploaded archive
|
||||
if (!file_exists(ExtensionsLib::UPLOAD_PATH.$extensionName.'/'.ExtensionsLib::EXTENSION_JSON_NAME))
|
||||
{
|
||||
$this->_errorOccurred = true;
|
||||
$this->_printFailure('missing extension.json');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_errorOccurred = true;
|
||||
$this->_printFailure('the root directory of the archive must have the same extension name');
|
||||
}
|
||||
|
||||
$this->_printSuccess(!$this->_errorOccurred);
|
||||
|
||||
$this->_printEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if extension.json is correct
|
||||
*/
|
||||
private function _chkExtensionJson($extensionName, $extensionDB)
|
||||
{
|
||||
$this->_printStart('Parsing and checking extension.json');
|
||||
|
||||
// Decodes extension.json
|
||||
$extensionJson = json_decode(
|
||||
file_get_contents(ExtensionsLib::UPLOAD_PATH.$extensionName.'/'.ExtensionsLib::EXTENSION_JSON_NAME)
|
||||
);
|
||||
|
||||
// Checks if the parameter name of the extension.json has the same value of the extension name
|
||||
if ($extensionJson != null && isset($extensionJson->name) && $extensionJson->name == $extensionName)
|
||||
{
|
||||
// Checks if the parameter version of the extension.json file exists
|
||||
if (isset($extensionJson->version))
|
||||
{
|
||||
$extensionJson->currentInstalledVersion = 0; // default current installed version of this extension
|
||||
|
||||
if ($extensionDB != null) // if no previous installation was found in DB
|
||||
{
|
||||
$extensionJson->extension_id = $extensionDB->extension_id; // get the extension_id from DB
|
||||
$extensionJson->currentInstalledVersion = $extensionDB->version; // get the current installed version from DB
|
||||
|
||||
$this->_printMessage('Extension already installed!');
|
||||
$this->_printMessage('Current version: '.$extensionDB->version);
|
||||
$this->_printMessage('Version of the uploaded extension: '.$extensionJson->version);
|
||||
|
||||
if ($extensionJson->version == $extensionDB->version)
|
||||
{
|
||||
$this->_printMessage('Updating the same version!');
|
||||
}
|
||||
elseif ($extensionJson->version > $extensionDB->version)
|
||||
{
|
||||
$this->_printMessage('Updating to a new version!');
|
||||
}
|
||||
else // downgrade is not possible
|
||||
{
|
||||
$extensionJson = null;
|
||||
$this->_printFailure('downgrade must be performed manually');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_printMessage('Version of the uploaded extension: '.$extensionJson->version);
|
||||
}
|
||||
|
||||
// If no errors occurred
|
||||
if ($extensionJson != null)
|
||||
{
|
||||
require_once('version.php'); // get the core version
|
||||
// Checks if the required core version of the extension is the same of this system
|
||||
if (isset($extensionJson->core_version) && $extensionJson->core_version == $fhcomplete_version)
|
||||
{
|
||||
$this->_printMessage('Required core version: '.$extensionJson->core_version);
|
||||
$this->_printMessage('Current core version: '.$fhcomplete_version);
|
||||
|
||||
// Checks parameter dependencies of the extension.json
|
||||
if (isset($extensionJson->dependencies)
|
||||
&& is_array($extensionJson->dependencies)
|
||||
&& count($extensionJson->dependencies) > 0)
|
||||
{
|
||||
// Gets the required dependencies
|
||||
$result = $this->ci->ExtensionsModel->getDependencies($extensionJson->dependencies);
|
||||
// If they are matcheds
|
||||
if (hasData($result) && count($result->retval) == count($extensionJson->dependencies))
|
||||
{
|
||||
if (isset($extensionJson->dependencies))
|
||||
{
|
||||
$extensionJson->dependencies = str_replace('[', '{', json_encode($extensionJson->dependencies));
|
||||
$extensionJson->dependencies = str_replace(']', '}', $extensionJson->dependencies);
|
||||
|
||||
$this->_printMessage('Required dependencies: '.$extensionJson->dependencies);
|
||||
}
|
||||
else
|
||||
{
|
||||
$extensionJson->dependencies = '';
|
||||
|
||||
$this->_printMessage('No dependencies are required');
|
||||
}
|
||||
}
|
||||
else // Otherwise not to be installed
|
||||
{
|
||||
$extensionJson = null;
|
||||
$this->_printFailure('dependencies are missing, install them to proceed');
|
||||
}
|
||||
}
|
||||
// Malformed dependencies parameter
|
||||
elseif (isset($extensionJson->dependencies) && !is_array($extensionJson->dependencies))
|
||||
{
|
||||
$extensionJson = null;
|
||||
$this->_printFailure('dependencies parameter must be an array');
|
||||
}
|
||||
// No dependencies required
|
||||
elseif (!isset($extensionJson->dependencies))
|
||||
{
|
||||
$this->_printMessage('No dependencies are required');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$extensionJson = null;
|
||||
$this->_printFailure('core_version parameter is missing or it is not equal to the versione of the core');
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$extensionJson = null;
|
||||
$this->_printFailure('version is missing');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$extensionJson = null;
|
||||
$this->_printFailure('name is missing or not equal to extension name');
|
||||
}
|
||||
|
||||
$this->_printSuccess($extensionJson != null);
|
||||
|
||||
$this->_printEnd();
|
||||
|
||||
return $extensionJson;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean any previous installations of the given archive
|
||||
*/
|
||||
private function _cleanPreviousInstallation($extensionJson)
|
||||
{
|
||||
$this->_printStart('Cleaning any previous installations in DB and file system');
|
||||
|
||||
// If a previous installation of this extension was found
|
||||
if (isset($extensionJson->extension_id))
|
||||
{
|
||||
// Off with their heads!
|
||||
if ($this->delExtension($extensionJson->extension_id))
|
||||
{
|
||||
$this->_printSuccess(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_printFailure('please check logs');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_printMessage('No need to clean, no previous installations found');
|
||||
}
|
||||
|
||||
$this->_printEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert extension's data into the DB
|
||||
*/
|
||||
private function _installExtension($extensionJson)
|
||||
{
|
||||
$this->_printStart('Adding new entry in the DB');
|
||||
|
||||
$result = $this->ci->ExtensionsModel->insert(
|
||||
array(
|
||||
'name' => $extensionJson->name,
|
||||
'description' => isset($extensionJson->description) ? $extensionJson->description : null,
|
||||
'version' => $extensionJson->version,
|
||||
'license' => isset($extensionJson->license) ? $extensionJson->license : null,
|
||||
'url' => isset($extensionJson->url) ? $extensionJson->url : null,
|
||||
'core_version' => $extensionJson->core_version,
|
||||
'dependencies' => isset($extensionJson->dependencies) ? $extensionJson->dependencies : null
|
||||
)
|
||||
);
|
||||
if (isSuccess($result))
|
||||
{
|
||||
$this->_printSuccess(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_errorOccurred = true;
|
||||
$this->_printFailure('error while saving extension into DB');
|
||||
}
|
||||
|
||||
$this->_printEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all the SQL scripts from the extension archive and executes them
|
||||
*/
|
||||
private function _loadSQLs($pkgSQLsPath, $extensionJson)
|
||||
{
|
||||
$this->_printStart('Loading and executing SQL files');
|
||||
$this->_printInfo('WARNING: if this step will fail, the database and all the directories');
|
||||
$this->_printInfo('have to be clean manually before install again this extension');
|
||||
|
||||
$startVersion = $extensionJson->currentInstalledVersion; // current installed version extension
|
||||
|
||||
// If the current installed version extension is less then the uploaded extension
|
||||
if ($extensionJson->currentInstalledVersion < $extensionJson->version)
|
||||
{
|
||||
$startVersion++; // +1
|
||||
}
|
||||
|
||||
// Loops through the versions
|
||||
for ($sqlDir = $startVersion; $sqlDir <= $extensionJson->version; $sqlDir++)
|
||||
{
|
||||
// If a directory with the same value of the version is present in the sql scripts directory
|
||||
if (($files = glob($pkgSQLsPath.'/'.$sqlDir.'/*'.ExtensionsLib::SQL_FILE_EXTENSION)) != false)
|
||||
{
|
||||
// Loads every sql files
|
||||
foreach ($files as $file)
|
||||
{
|
||||
$sql = file_get_contents($file); // gets the entire content of the file
|
||||
|
||||
$this->_printMessage('Executing query:');
|
||||
$this->_printMessage($sql);
|
||||
|
||||
// Try to execute that
|
||||
if (!isSuccess($result = @$this->ci->ExtensionsModel->executeQuery($sql)))
|
||||
{
|
||||
$this->_errorOccurred = true;
|
||||
$this->_printFailure(' error occurred while executing the query');
|
||||
$this->_printInfo('Is not possible to rollback the DB changes, must be done manually');
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_printMessage('Query result:');
|
||||
var_dump($result->retval); // KEEP IT!!!
|
||||
$this->ci->eprintflib->printEOL();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->_printSuccess(!$this->_errorOccurred);
|
||||
|
||||
$this->_printEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
* Move the extension extracted archive from the temporary directory to the extensions install directory
|
||||
*/
|
||||
private function _moveExtension($extensionName)
|
||||
{
|
||||
$this->_printStart('Moving the upload extension from upload folder to extension folder');
|
||||
|
||||
$this->_printMessage('Current extension directory: '.ExtensionsLib::UPLOAD_PATH.$extensionName);
|
||||
$this->_printMessage('Directory where it will be moved: '.ExtensionsLib::EXTENSIONS_PATH.$extensionName);
|
||||
|
||||
if (rename(ExtensionsLib::UPLOAD_PATH.$extensionName.'/', ExtensionsLib::EXTENSIONS_PATH.$extensionName))
|
||||
{
|
||||
$this->_printSuccess(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_errorOccurred = true;
|
||||
$this->_printFailure('error while moving');
|
||||
}
|
||||
|
||||
$this->_printEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the symlinks to the installed extension
|
||||
* Wrapper method to check the result of the operation and to print out info
|
||||
*/
|
||||
private function _createSymLinks($extensionName)
|
||||
{
|
||||
$this->_printStart('Creating symlinks');
|
||||
|
||||
if ($this->_addSoftLinks($extensionName))
|
||||
{
|
||||
$this->_printSuccess(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_errorOccurred = true;
|
||||
$this->_printFailure('error while creating sym links');
|
||||
}
|
||||
|
||||
$this->_printEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all the symlinks to the installed extension
|
||||
*/
|
||||
private function _delSoftLinks($extensionName)
|
||||
{
|
||||
$_delSoftLinks = false;
|
||||
|
||||
foreach (ExtensionsLib::SOFTLINK_TARGET_DIRECTORIES as $key => $targetDirectory)
|
||||
{
|
||||
if (file_exists(APPPATH.$targetDirectory.'/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName))
|
||||
{
|
||||
$_delSoftLinks = unlink(APPPATH.$targetDirectory.'/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName);
|
||||
}
|
||||
}
|
||||
|
||||
return $_delSoftLinks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursive remove of a file or a directory
|
||||
*/
|
||||
private function _rrm($dir)
|
||||
{
|
||||
if (!file_exists($dir))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!is_dir($dir))
|
||||
{
|
||||
return unlink($dir);
|
||||
}
|
||||
|
||||
foreach (scandir($dir) as $item)
|
||||
{
|
||||
if ($item == '.' || $item == '..')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$this->_rrm($dir.DIRECTORY_SEPARATOR.$item))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return rmdir($dir);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the symlinks to the installed extension
|
||||
*/
|
||||
private function _addSoftLinks($extensionName)
|
||||
{
|
||||
$_addSoftLinks = false;
|
||||
$extensionPath = ExtensionsLib::EXTENSIONS_PATH.$extensionName.'/';
|
||||
|
||||
// For every target directory
|
||||
foreach (ExtensionsLib::SOFTLINK_TARGET_DIRECTORIES as $key => $targetDirectory)
|
||||
{
|
||||
// If destination of the symlink does not exist
|
||||
if (!file_exists(APPPATH.$targetDirectory.'/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName))
|
||||
{
|
||||
// If the target directory does not exist than creates that
|
||||
if (!is_dir($extensionPath.$targetDirectory))
|
||||
{
|
||||
mkdir($extensionPath.$targetDirectory);
|
||||
}
|
||||
|
||||
// Create the symlink
|
||||
$_addSoftLinks = symlink(
|
||||
$extensionPath.$targetDirectory,
|
||||
APPPATH.$targetDirectory.'/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName
|
||||
);
|
||||
if (!$_addSoftLinks)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $_addSoftLinks;
|
||||
}
|
||||
|
||||
/**
|
||||
* To rollback an extension installation
|
||||
* It will be removed all the information about the given extension from DB and file system
|
||||
*/
|
||||
private function _rollback($uploadData, $extensionDB, $extensionJson)
|
||||
{
|
||||
$this->_printStart('Rolling back the installation');
|
||||
|
||||
$this->_printMessage('Removing the uploaded file from upload directory');
|
||||
if ($uploadData != null && isset($uploadData->fullPath) && file_exists($uploadData->fullPath))
|
||||
{
|
||||
$this->_rrm($uploadData->fullPath);
|
||||
}
|
||||
|
||||
$this->_printMessage('Removing the extracted data from the upload directory');
|
||||
if ($uploadData != null
|
||||
&& isset($uploadData->extensionName)
|
||||
&& file_exists(ExtensionsLib::UPLOAD_PATH.$uploadData->extensionName))
|
||||
{
|
||||
$this->_rrm(ExtensionsLib::UPLOAD_PATH.$uploadData->extensionName);
|
||||
}
|
||||
|
||||
// If the upload of the file is a success and the extension name is present and no previous installation were found
|
||||
if ($uploadData != null && isset($uploadData->extensionName) && $extensionDB == null)
|
||||
{
|
||||
// Loads all the previous installations of this extension
|
||||
$this->ci->ExtensionsModel->addOrder('version', 'DESC');
|
||||
$this->ci->ExtensionsModel->addLimit(1);
|
||||
$result = $this->ci->ExtensionsModel->loadWhere(array('name' => $uploadData->extensionName));
|
||||
if (hasData($result)) // if found
|
||||
{
|
||||
// Remove them all from file system and DB
|
||||
$this->_printMessage('Removing entries in the DB related to this extension');
|
||||
$this->delExtension($result->retval[0]->extension_id);
|
||||
}
|
||||
}
|
||||
else // otherwise
|
||||
{
|
||||
// Remove them all only from DB
|
||||
if ($extensionJson != null && isset($extensionJson->extension_id))
|
||||
{
|
||||
$this->ci->ExtensionsModel->delete($extensionJson->extension_id);
|
||||
}
|
||||
}
|
||||
|
||||
$this->_printMessage('Rollback finished');
|
||||
|
||||
$this->_printEnd();
|
||||
}
|
||||
|
||||
/**
|
||||
* To enable/disable an extension
|
||||
*/
|
||||
private function _toggleExtension($extensionId, $enabled)
|
||||
{
|
||||
$_toggleExtension = false;
|
||||
|
||||
// Loads data from DB about the given extension
|
||||
$result = $this->ci->ExtensionsModel->load($extensionId);
|
||||
if (hasData($result))
|
||||
{
|
||||
$extensionName = $result->retval[0]->name; // extension name
|
||||
|
||||
// If to be enabled
|
||||
if ($enabled === true)
|
||||
{
|
||||
// Add the symlinks
|
||||
$_toggleExtension = $this->_addSoftLinks($extensionName);
|
||||
}
|
||||
else // If to be disabled
|
||||
{
|
||||
// Remove all the symlinks
|
||||
$_toggleExtension = $this->_delSoftLinks($extensionName);
|
||||
}
|
||||
|
||||
if ($_toggleExtension) // if is a success
|
||||
{
|
||||
// Updates DB
|
||||
$result = $this->ci->ExtensionsModel->update($extensionId, array('enabled' => $enabled));
|
||||
if (isSuccess($result))
|
||||
{
|
||||
$_toggleExtension = true;
|
||||
}
|
||||
else // if DB update fails remove symlinks from file system
|
||||
{
|
||||
$this->_delSoftLinks($extensionName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $_toggleExtension;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper method to print a generic error
|
||||
*/
|
||||
private function _printError($error)
|
||||
{
|
||||
$this->ci->eprintflib->printError($error);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper method to print an error
|
||||
*/
|
||||
private function _printFailure($error)
|
||||
{
|
||||
$this->_printError('Failed: '.$error);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper method to print a generic message
|
||||
*/
|
||||
private function _printMessage($message)
|
||||
{
|
||||
$this->ci->eprintflib->printMessage($message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper method to print a success
|
||||
*/
|
||||
private function _printSuccess($cond)
|
||||
{
|
||||
if ($cond === true)
|
||||
{
|
||||
$this->_printMessage('Success!!!');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper method to print info
|
||||
*/
|
||||
private function _printInfo($info)
|
||||
{
|
||||
$this->ci->eprintflib->printInfo($info);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper method to print a start message
|
||||
*/
|
||||
private function _printStart($startMessage)
|
||||
{
|
||||
$this->_printInfo('------------------------------------------------------------------------------------------');
|
||||
$this->_printMessage($startMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper method to print an end message
|
||||
*/
|
||||
private function _printEnd()
|
||||
{
|
||||
$this->_printInfo('------------------------------------------------------------------------------------------');
|
||||
}
|
||||
}
|
||||
Executable → Regular
Executable → Regular
@@ -7,173 +7,72 @@ if (! defined("BASEPATH")) exit("No direct script access allowed");
|
||||
*/
|
||||
class MigrationLib extends CI_Migration
|
||||
{
|
||||
// Prefixes and separator for messages
|
||||
const MSG_PREFIX = "[-]";
|
||||
const INFO_PREFIX = "[I]";
|
||||
const ERROR_PREFIX = "[E]";
|
||||
const SEPARATOR = "------------------------------";
|
||||
// Console colors codes
|
||||
const ERROR_COLOR = 31;
|
||||
const INFO_COLOR = 33;
|
||||
|
||||
const PRINT_QUERY_LEN = 60;
|
||||
|
||||
// HTML colors names
|
||||
private $HTML_COLORS = array(31 => "red", 33 => "orange");
|
||||
// Used to set if the migration process is called via command line or via browser
|
||||
private $cli;
|
||||
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->setCli();
|
||||
|
||||
// Loads EPrintfLib
|
||||
$this->load->library('EPrintfLib');
|
||||
}
|
||||
|
||||
/**
|
||||
* Set property cli to false if the migration process is called via command line
|
||||
* otherwise to false if it's called via browser
|
||||
*/
|
||||
private function setCli()
|
||||
{
|
||||
if ($this->input->is_cli_request())
|
||||
{
|
||||
$this->cli = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->cli = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character of end of line
|
||||
* PHP_EOL platform dependent if cli is true
|
||||
* Tag <br> if cli is false
|
||||
*/
|
||||
private function getEOL()
|
||||
{
|
||||
if ($this->cli === true)
|
||||
{
|
||||
return PHP_EOL;
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<br>";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the string needed to color the output
|
||||
*/
|
||||
private function getColored($color)
|
||||
{
|
||||
$colored = "%s";
|
||||
|
||||
if (!is_null($color))
|
||||
{
|
||||
if ($this->cli === true)
|
||||
{
|
||||
$colored = "\033[".$color."m%s\033[37m";
|
||||
}
|
||||
else
|
||||
{
|
||||
$colored = "<font color=\"".$this->HTML_COLORS[$color]."\">%s</font>";
|
||||
}
|
||||
}
|
||||
|
||||
return $colored;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a message, even colored if specified
|
||||
*/
|
||||
private function _print($prefix, $text, $color = null)
|
||||
{
|
||||
printf($this->getColored($color), sprintf("%s %s".$this->getEOL(), $prefix, $text));
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a formatted message
|
||||
*/
|
||||
private function printMessage($message)
|
||||
{
|
||||
$this->_print(MigrationLib::MSG_PREFIX, $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a formatted info
|
||||
*/
|
||||
private function printInfo($info)
|
||||
{
|
||||
$this->_print(MigrationLib::INFO_PREFIX, $info, MigrationLib::INFO_COLOR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a formatted error
|
||||
*/
|
||||
private function printError($error)
|
||||
{
|
||||
$this->_print(MigrationLib::ERROR_PREFIX, $error, MigrationLib::ERROR_COLOR);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if a column exists in a table and schema
|
||||
*/
|
||||
private function columnExists($name, $schema, $table)
|
||||
{
|
||||
$query = sprintf("SELECT %s FROM %s.%s LIMIT 1", $name, $schema, $table);
|
||||
|
||||
|
||||
if (@$this->db->simple_query($query))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Print an info about the starting of method up
|
||||
*/
|
||||
protected function startUP()
|
||||
{
|
||||
$this->printInfo(
|
||||
sprintf("%s Start method up of class %s %s", MigrationLib::SEPARATOR, get_called_class(), MigrationLib::SEPARATOR)
|
||||
$this->eprintflib->printInfo(
|
||||
sprintf("%s Start method up of class %s %s", EPrintfLib::SEPARATOR, get_called_class(), EPrintfLib::SEPARATOR)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Print an info about the ending of method up
|
||||
*/
|
||||
protected function endUP()
|
||||
{
|
||||
$this->printInfo(
|
||||
sprintf("%s End method up of class %s %s", MigrationLib::SEPARATOR, get_called_class(), MigrationLib::SEPARATOR)
|
||||
$this->eprintflib->printInfo(
|
||||
sprintf("%s End method up of class %s %s", EPrintfLib::SEPARATOR, get_called_class(), EPrintfLib::SEPARATOR)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Print an info about the starting of method down
|
||||
*/
|
||||
protected function startDown()
|
||||
{
|
||||
$this->printInfo(
|
||||
sprintf("%s Start method down of class %s %s", MigrationLib::SEPARATOR, get_called_class(), MigrationLib::SEPARATOR)
|
||||
$this->eprintflib->printInfo(
|
||||
sprintf("%s Start method down of class %s %s", EPrintfLib::SEPARATOR, get_called_class(), EPrintfLib::SEPARATOR)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Print an info about the ending of method down
|
||||
*/
|
||||
protected function endDown()
|
||||
{
|
||||
$this->printInfo(
|
||||
sprintf("%s End method down of class %s %s", MigrationLib::SEPARATOR, get_called_class(), MigrationLib::SEPARATOR)
|
||||
$this->eprintflib->printInfo(
|
||||
sprintf("%s End method down of class %s %s", EPrintfLib::SEPARATOR, get_called_class(), EPrintfLib::SEPARATOR)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a column, with attributes, to a table and schema
|
||||
*/
|
||||
@@ -185,20 +84,20 @@ class MigrationLib extends CI_Migration
|
||||
{
|
||||
if ($this->dbforge->add_column($schema.'.'.$table, array($name => $definition)))
|
||||
{
|
||||
$this->printMessage(sprintf("Column %s.%s.%s of type %s added", $schema, $table, $name, $definition["type"]));
|
||||
$this->eprintflib->printMessage(sprintf("Column %s.%s.%s of type %s added", $schema, $table, $name, $definition["type"]));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(sprintf("Error while adding column %s.%s.%s of type %s", $schema, $table, $name, $definition["type"]));
|
||||
$this->eprintflib->printError(sprintf("Error while adding column %s.%s.%s of type %s", $schema, $table, $name, $definition["type"]));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printInfo(sprintf("Column %s.%s.%s already exists", $schema, $table, $name));
|
||||
$this->eprintflib->printInfo(sprintf("Column %s.%s.%s already exists", $schema, $table, $name));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Modifies a column, and its attributes, of a table and schema
|
||||
*/
|
||||
@@ -210,20 +109,20 @@ class MigrationLib extends CI_Migration
|
||||
{
|
||||
if ($this->dbforge->modify_column($schema.'.'.$table, array($name => $definition)))
|
||||
{
|
||||
$this->printMessage(sprintf("Column %s.%s.%s has been modified", $schema, $table, $name));
|
||||
$this->eprintflib->printMessage(sprintf("Column %s.%s.%s has been modified", $schema, $table, $name));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(sprintf("Error while modifying column %s.%s.%s", $schema, $table, $name));
|
||||
$this->eprintflib->printError(sprintf("Error while modifying column %s.%s.%s", $schema, $table, $name));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printInfo(sprintf("Column %s.%s.%s doesn't exist", $schema, $table, $name));
|
||||
$this->eprintflib->printInfo(sprintf("Column %s.%s.%s doesn't exist", $schema, $table, $name));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Drops a column from a table and schema
|
||||
*/
|
||||
@@ -233,19 +132,19 @@ class MigrationLib extends CI_Migration
|
||||
{
|
||||
if ($this->dbforge->drop_column($schema.'.'.$table, $field))
|
||||
{
|
||||
$this->printMessage(sprintf("Column %s.%s.%s has been dropped", $schema, $table, $field));
|
||||
$this->eprintflib->printMessage(sprintf("Column %s.%s.%s has been dropped", $schema, $table, $field));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(sprintf("Error while dropping column %s.%s.%s", $schema, $table, $field));
|
||||
$this->eprintflib->printError(sprintf("Error while dropping column %s.%s.%s", $schema, $table, $field));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printInfo(sprintf("Column %s.%s.%s doesn't exist", $schema, $table, $field));
|
||||
$this->eprintflib->printInfo(sprintf("Column %s.%s.%s doesn't exist", $schema, $table, $field));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets a column as primary key of a table and schema
|
||||
*/
|
||||
@@ -273,17 +172,17 @@ class MigrationLib extends CI_Migration
|
||||
{
|
||||
$query = sprintf("ALTER TABLE %s.%s ADD CONSTRAINT %s PRIMARY KEY (%s)", $schema, $table, $name, $fields);
|
||||
}
|
||||
|
||||
|
||||
if (@$this->db->simple_query($query))
|
||||
{
|
||||
$this->printMessage(sprintf("Added primary key %s on table %s.%s", $name, $schema, $table));
|
||||
$this->eprintflib->printMessage(sprintf("Added primary key %s on table %s.%s", $name, $schema, $table));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(sprintf("Adding primary key %s on table %s.%s", $name, $schema, $table));
|
||||
$this->eprintflib->printError(sprintf("Adding primary key %s on table %s.%s", $name, $schema, $table));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets a column as foreign key of a table and schema
|
||||
*/
|
||||
@@ -300,17 +199,17 @@ class MigrationLib extends CI_Migration
|
||||
$fieldDest,
|
||||
$attributes
|
||||
);
|
||||
|
||||
|
||||
if (@$this->db->simple_query($query))
|
||||
{
|
||||
$this->printMessage(sprintf("Added foreign key %s on table %s.%s", $name, $schema, $table));
|
||||
$this->eprintflib->printMessage(sprintf("Added foreign key %s on table %s.%s", $name, $schema, $table));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(sprintf("Adding foreign key %s on table %s.%s", $name, $schema, $table));
|
||||
$this->eprintflib->printError(sprintf("Adding foreign key %s on table %s.%s", $name, $schema, $table));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets a column as unique key of a table and schema
|
||||
*/
|
||||
@@ -338,17 +237,17 @@ class MigrationLib extends CI_Migration
|
||||
{
|
||||
$query = sprintf("CREATE UNIQUE INDEX %s ON %s.%s (%s)", $name, $schema, $table, $fields);
|
||||
}
|
||||
|
||||
|
||||
if (@$this->db->simple_query($query))
|
||||
{
|
||||
$this->printMessage(sprintf("Added unique key %s on table %s.%s", $name, $schema, $table));
|
||||
$this->eprintflib->printMessage(sprintf("Added unique key %s on table %s.%s", $name, $schema, $table));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(sprintf("Adding unique key %s on table %s.%s", $name, $schema, $table));
|
||||
$this->eprintflib->printError(sprintf("Adding unique key %s on table %s.%s", $name, $schema, $table));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Grants permissions to a user on a table and schema
|
||||
*/
|
||||
@@ -379,7 +278,7 @@ class MigrationLib extends CI_Migration
|
||||
|
||||
if (@$this->db->simple_query($query))
|
||||
{
|
||||
$this->printMessage(
|
||||
$this->eprintflib->printMessage(
|
||||
sprintf(
|
||||
"Granted permissions %s on table %s.%s to user %s",
|
||||
is_null($stringPermission) ? $permissions : $stringPermission,
|
||||
@@ -391,7 +290,7 @@ class MigrationLib extends CI_Migration
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(
|
||||
$this->eprintflib->printError(
|
||||
sprintf(
|
||||
"Granting permissions %s on table %s.%s to user %s",
|
||||
is_null($stringPermission) ? $permissions : $stringPermission,
|
||||
@@ -402,24 +301,24 @@ class MigrationLib extends CI_Migration
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a table in a schema with columns
|
||||
*/
|
||||
protected function createTable($schema, $table, $fields)
|
||||
{
|
||||
$this->dbforge->add_field($fields);
|
||||
|
||||
|
||||
if ($this->dbforge->create_table($schema.'.'.$table, true))
|
||||
{
|
||||
$this->printMessage(sprintf("Table %s.%s created or existing", $schema, $table));
|
||||
$this->eprintflib->printMessage(sprintf("Table %s.%s created or existing", $schema, $table));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(sprintf("Creating table %s.%s", $schema, $table));
|
||||
$this->eprintflib->printError(sprintf("Creating table %s.%s", $schema, $table));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Drops a table from a schema
|
||||
*/
|
||||
@@ -427,62 +326,62 @@ class MigrationLib extends CI_Migration
|
||||
{
|
||||
if ($this->dbforge->drop_table($schema.".".$table))
|
||||
{
|
||||
$this->printMessage(sprintf("Table %s.%s has been dropped", $schema, $table));
|
||||
$this->eprintflib->printMessage(sprintf("Table %s.%s has been dropped", $schema, $table));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(sprintf("Dropping table %s.%s", $schema, $table));
|
||||
$this->eprintflib->printError(sprintf("Dropping table %s.%s", $schema, $table));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initializes a sequence with the max value of a column
|
||||
*/
|
||||
protected function initializeSequence($schemaSrc, $sequence, $schemaDst, $table, $field)
|
||||
{
|
||||
$query = sprintf("SELECT SETVAL('%s.%s', (SELECT MAX(%s) FROM %s.%s))", $schemaSrc, $sequence, $field, $schemaDst, $table);
|
||||
|
||||
|
||||
if (@$this->db->simple_query($query))
|
||||
{
|
||||
$this->printMessage(sprintf("Sequence %s.%s has been initialized", $schemaSrc, $sequence));
|
||||
$this->eprintflib->printMessage(sprintf("Sequence %s.%s has been initialized", $schemaSrc, $sequence));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(sprintf("Initializing sequence %s.%s", $schemaSrc, $sequence));
|
||||
$this->eprintflib->printError(sprintf("Initializing sequence %s.%s", $schemaSrc, $sequence));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add comment to a column
|
||||
*/
|
||||
protected function addCommentToColumn($schema, $table, $field, $comment)
|
||||
{
|
||||
$query = sprintf("COMMENT ON COLUMN %s.%s.%s IS ?", $schema, $table, $field);
|
||||
|
||||
|
||||
if (@$this->db->query($query, array($comment)))
|
||||
{
|
||||
$this->printMessage(sprintf("Comment added to %s.%s.%s", $schema, $table, $field));
|
||||
$this->eprintflib->printMessage(sprintf("Comment added to %s.%s.%s", $schema, $table, $field));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(sprintf("Error while adding comment to %s.%s.%s", $schema, $table, $field));
|
||||
$this->eprintflib->printError(sprintf("Error while adding comment to %s.%s.%s", $schema, $table, $field));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add comment to a table
|
||||
*/
|
||||
protected function addCommentToTable($schema, $table, $comment)
|
||||
{
|
||||
$query = sprintf("COMMENT ON TABLE %s.%s IS ?", $schema, $table, $field);
|
||||
|
||||
|
||||
if (@$this->db->query($query, array($comment)))
|
||||
{
|
||||
$this->printMessage(sprintf("Comment added to %s.%s", $schema, $table));
|
||||
$this->eprintflib->printMessage(sprintf("Comment added to %s.%s", $schema, $table));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(sprintf("Error while adding comment to %s.%s", $schema, $table));
|
||||
$this->eprintflib->printError(sprintf("Error while adding comment to %s.%s", $schema, $table));
|
||||
}
|
||||
}
|
||||
/**
|
||||
@@ -515,7 +414,7 @@ class MigrationLib extends CI_Migration
|
||||
|
||||
if (@$this->db->simple_query($query))
|
||||
{
|
||||
$this->printMessage(
|
||||
$this->eprintflib->printMessage(
|
||||
sprintf(
|
||||
"Granted permissions %s on sequence %s.%s to user %s",
|
||||
is_null($stringPermission) ? $permissions : $stringPermission,
|
||||
@@ -527,7 +426,7 @@ class MigrationLib extends CI_Migration
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError(
|
||||
$this->eprintflib->printError(
|
||||
sprintf(
|
||||
"Granting permissions %s on sequence %s.%s to user %s",
|
||||
is_null($stringPermission) ? $permissions : $stringPermission,
|
||||
@@ -538,7 +437,7 @@ class MigrationLib extends CI_Migration
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Executes the given query
|
||||
*/
|
||||
@@ -547,21 +446,21 @@ class MigrationLib extends CI_Migration
|
||||
if (! @$this->db->simple_query($query))
|
||||
{
|
||||
$error = $this->db->error();
|
||||
|
||||
|
||||
if (is_array($error) && isset($error["message"]))
|
||||
{
|
||||
$this->printError($error["message"]);
|
||||
$this->eprintflib->printError($error["message"]);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->printError("Error while executing a query");
|
||||
$this->eprintflib->printError("Error while executing a query");
|
||||
}
|
||||
}
|
||||
|
||||
$this->printInfo(
|
||||
|
||||
$this->eprintflib->printInfo(
|
||||
"Query correctly executed: ".
|
||||
substr(preg_replace("/\s+/", " ", trim($query)), 0, MigrationLib::PRINT_QUERY_LEN).
|
||||
(strlen($query) > MigrationLib::PRINT_QUERY_LEN ? "..." : "")
|
||||
substr(preg_replace("/\s+/", " ", trim($query)), 0, EPrintfLib::PRINT_QUERY_LEN).
|
||||
(strlen($query) > EPrintfLib::PRINT_QUERY_LEN ? "..." : "")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
Executable → Regular
Executable → Regular
@@ -0,0 +1 @@
|
||||
|
||||
Executable → Regular
Executable → Regular
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
class Extensions_model extends DB_Model
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->dbTable = 'system.tbl_extensions';
|
||||
$this->pk = 'extension_id';
|
||||
}
|
||||
|
||||
/**
|
||||
* getDependencies
|
||||
*/
|
||||
public function getDependencies($dependencies)
|
||||
{
|
||||
if (isError($ent = $this->isEntitled($this->dbTable, PermissionLib::SELECT_RIGHT, FHC_NORIGHT, FHC_MODEL_ERROR))) return $ent;
|
||||
|
||||
return $this->execQuery(
|
||||
'SELECT *
|
||||
FROM '.$this->dbTable.'
|
||||
WHERE enabled = TRUE
|
||||
AND name IN ?',
|
||||
array('name' => $dependencies)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function getInstalledExtensions()
|
||||
{
|
||||
$query = 'SELECT extension_id, e1.name, e1.version, description, license, url, core_version, dependencies, enabled
|
||||
FROM system.tbl_extensions e1
|
||||
INNER JOIN (
|
||||
SELECT name, MAX(version) AS version
|
||||
FROM system.tbl_extensions
|
||||
GROUP BY name) e2
|
||||
ON (e1.name = e2.name AND e1.version = e2.version)';
|
||||
|
||||
return $this->execQuery($query);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function executeQuery($sql)
|
||||
{
|
||||
if (isError($ent = $this->isEntitled($this->dbTable, PermissionLib::SELECT_RIGHT, FHC_NORIGHT, FHC_MODEL_ERROR))) return $ent;
|
||||
|
||||
return $this->execQuery($sql);
|
||||
}
|
||||
}
|
||||
Executable → Regular
+48
-21
@@ -47,7 +47,7 @@ class MessageToken_model extends CI_Model
|
||||
LIMIT 1';
|
||||
|
||||
$result = $this->db->query($sql, array(MSG_STATUS_DELETED, $token));
|
||||
|
||||
|
||||
// If no errors occurred
|
||||
if ($result)
|
||||
{
|
||||
@@ -58,7 +58,7 @@ class MessageToken_model extends CI_Model
|
||||
return error($this->db->error());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the status of a message to read. If the status of the message
|
||||
* is already read then update updateamum
|
||||
@@ -82,9 +82,9 @@ class MessageToken_model extends CI_Model
|
||||
) s ON (r.message_id = s.message_id AND r.person_id = s.person_id)
|
||||
WHERE r.token = ?
|
||||
LIMIT 1';
|
||||
|
||||
|
||||
$msgs = $this->db->query($sql, array(MSG_STATUS_ARCHIVED, $token));
|
||||
|
||||
|
||||
// If no errors occurred
|
||||
if ($msgs)
|
||||
{
|
||||
@@ -92,9 +92,9 @@ class MessageToken_model extends CI_Model
|
||||
if (count($msgs->result()) > 0)
|
||||
{
|
||||
$msg = $msgs->result()[0];
|
||||
|
||||
|
||||
$msgStatusResult = false; // pessimistic expectation
|
||||
|
||||
|
||||
// If the status of the message is unread
|
||||
if ($msg->status == MSG_STATUS_UNREAD)
|
||||
{
|
||||
@@ -118,31 +118,31 @@ class MessageToken_model extends CI_Model
|
||||
{
|
||||
// Update updateamum to current date
|
||||
$this->db->set('updateamum', 'NOW()');
|
||||
|
||||
|
||||
$this->db->where('message_id', $msg->message_id);
|
||||
$this->db->where('person_id', $msg->receiver_id);
|
||||
$this->db->where('status', MSG_STATUS_READ);
|
||||
|
||||
|
||||
$msgStatusResult = $this->db->update('public.tbl_msg_status');
|
||||
}
|
||||
|
||||
|
||||
// If some of the previous DB manipulation (update or insert) has failed
|
||||
if (!$msgStatusResult)
|
||||
{
|
||||
return error($this->db->error());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return success($msgs->result());
|
||||
}
|
||||
else
|
||||
{
|
||||
return error($this->db->error());
|
||||
}
|
||||
|
||||
|
||||
return success($result->result());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get data of the message sender
|
||||
*/
|
||||
@@ -159,9 +159,9 @@ class MessageToken_model extends CI_Model
|
||||
LEFT JOIN public.tbl_benutzer b USING(person_id)
|
||||
LEFT JOIN public.tbl_mitarbeiter m ON(b.uid = m.mitarbeiter_uid)
|
||||
WHERE p.person_id = ?';
|
||||
|
||||
|
||||
$result = $this->db->query($sql, array($person_id));
|
||||
|
||||
|
||||
// If no errors occurred
|
||||
if ($result)
|
||||
{
|
||||
@@ -172,9 +172,9 @@ class MessageToken_model extends CI_Model
|
||||
return error($this->db->error());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
public function isEmployee($person_id)
|
||||
{
|
||||
@@ -184,9 +184,9 @@ class MessageToken_model extends CI_Model
|
||||
LEFT JOIN public.tbl_mitarbeiter m ON(b.uid = m.mitarbeiter_uid)
|
||||
WHERE p.person_id = ?
|
||||
AND b.aktiv = TRUE';
|
||||
|
||||
|
||||
$result = $this->db->query($sql, array($person_id));
|
||||
|
||||
|
||||
// If no errors occurred
|
||||
if ($result)
|
||||
{
|
||||
@@ -194,14 +194,14 @@ class MessageToken_model extends CI_Model
|
||||
if (is_array($result->result()) && count($result->result()) > 0)
|
||||
{
|
||||
$person = $result->result()[0];
|
||||
|
||||
|
||||
// If it is an employee
|
||||
if ($person->mitarbeiter_uid != null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
else
|
||||
@@ -209,4 +209,31 @@ class MessageToken_model extends CI_Model
|
||||
return error($this->db->error());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* getRoot - Get the root of the organisation unit tree which belongs the given organisation unit parameter
|
||||
*/
|
||||
public function getOERoot($oe_kurzbz)
|
||||
{
|
||||
$sql = 'SELECT oe_kurzbz, oe_parent_kurzbz FROM public.tbl_organisationseinheit WHERE oe_kurzbz = ?';
|
||||
|
||||
$result = $this->db->query($sql, array($oe_kurzbz));
|
||||
if ($result) // If no errors occurred
|
||||
{
|
||||
// If data are present
|
||||
if (is_array($result->result()) && count($result->result()) > 0)
|
||||
{
|
||||
$organisationseinheit = $result->result()[0];
|
||||
|
||||
// If this organisationseinheit has a parent
|
||||
if ($organisationseinheit->oe_parent_kurzbz != null)
|
||||
{
|
||||
// looks for the parent
|
||||
$result = $this->getOERoot($organisationseinheit->oe_parent_kurzbz);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
@@ -0,0 +1 @@
|
||||
|
||||
Executable → Regular
@@ -0,0 +1,168 @@
|
||||
<?php $this->load->view('templates/header', array('title' => 'Extensions manager', 'jqueryV1' => true, 'tablesort' => true)); ?>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
$(document).ready(function() {
|
||||
|
||||
$(".tablesorter").each(function(i, v) {
|
||||
|
||||
$("#" + v.id).tablesorter({
|
||||
widgets: ["zebra"],
|
||||
sortList: [[0, 0]],
|
||||
headers: {7: {sorter: false}}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
$(".chkbox").change(function() {
|
||||
|
||||
var chkId = $(this).context.name;
|
||||
var checked = $(this).prop("checked");
|
||||
|
||||
$.ajax({
|
||||
url: "<?php echo current_url(); ?>/toggleExtension",
|
||||
dataType: "json",
|
||||
type: "POST",
|
||||
data: {
|
||||
extension_id: chkId,
|
||||
enabled: checked
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown) {
|
||||
|
||||
alert("Error while saving data");
|
||||
},
|
||||
success: function(response, textStatus, jqXHR) {
|
||||
if (response != true)
|
||||
{
|
||||
alert("Error while saving data");
|
||||
}
|
||||
},
|
||||
complete: function() {
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
$(".lnkrm").click(function() {
|
||||
|
||||
var lnkId = $(this).context.name;
|
||||
|
||||
if (window.confirm('Are you really shure???') == true)
|
||||
{
|
||||
$.ajax({
|
||||
url: "<?php echo current_url(); ?>/delExtension",
|
||||
dataType: "json",
|
||||
type: "POST",
|
||||
data: {
|
||||
extension_id: lnkId
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown) {
|
||||
alert("Error while saving data");
|
||||
},
|
||||
success: function(response, textStatus, jqXHR) {
|
||||
if (response != true)
|
||||
{
|
||||
alert("Error while saving data");
|
||||
}
|
||||
},
|
||||
complete: function() {
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<body>
|
||||
|
||||
<?php
|
||||
if (!hasData($extensions))
|
||||
{
|
||||
echo 'No extension installed!<br>';
|
||||
}
|
||||
elseif (isError($extensions))
|
||||
{
|
||||
echo 'An error occurred while retriving extenions list.';
|
||||
}
|
||||
elseif (hasData($extensions))
|
||||
{
|
||||
?>
|
||||
<div>
|
||||
List of installed extensions
|
||||
</div>
|
||||
|
||||
<br>
|
||||
|
||||
<table class="tablesorter" id="t0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
<th>Version</th>
|
||||
<th>Licence</th>
|
||||
<th>URL</th>
|
||||
<th>Minimum required Core version</th>
|
||||
<th>Dependes on (extensions)</th>
|
||||
<th>Enabled</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<?php
|
||||
$tableRow = '
|
||||
<tr>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>
|
||||
<input type="checkbox" class="chkbox" name="%s" %s>
|
||||
</td>
|
||||
<td>
|
||||
<a href="#" name="%s" class="lnkrm" >Remove</a>
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
foreach ($extensions->retval as $key => $extension)
|
||||
{
|
||||
echo sprintf(
|
||||
$tableRow,
|
||||
$extension->name,
|
||||
$extension->description,
|
||||
$extension->version,
|
||||
$extension->license,
|
||||
$extension->url,
|
||||
$extension->core_version,
|
||||
count($extension->dependencies) == 0 ? 'None' : json_encode($extension->dependencies),
|
||||
$extension->extension_id,
|
||||
$extension->enabled === true ? 'checked' : '',
|
||||
$extension->extension_id
|
||||
);
|
||||
}
|
||||
?>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
|
||||
<br>
|
||||
|
||||
<?php echo form_open_multipart(current_url().'/uploadExtension'); ?>
|
||||
<input type="file" name="extension" />
|
||||
<input type="submit" value="Install/Update extension" />
|
||||
</form>
|
||||
|
||||
</body>
|
||||
|
||||
<?php $this->load->view('templates/footer'); ?>
|
||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
@@ -0,0 +1 @@
|
||||
|
||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user