1049 lines
39 KiB
PHP
1049 lines
39 KiB
PHP
<?php
|
|
|
|
namespace BRSystems\Core\Sys\sysSiteModules\inc;
|
|
|
|
use BRSystems\Core\Library\cCore\cCore;
|
|
use BRSystems\Core\Library\cJSON\cJSON;
|
|
use BRSystems\Core\Library\cValidator\cValidator;
|
|
|
|
/**
|
|
* sysSiteModules Controller
|
|
*
|
|
* @category sysSiteModules Controller
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @since Version 2.0
|
|
*/
|
|
class sysSiteModulesController extends cCore
|
|
{
|
|
public $dir;
|
|
public $name;
|
|
public $module;
|
|
|
|
const pubPrefix = "pub";
|
|
const cmsPrefix = "cms";
|
|
const sysPrefix = "sys";
|
|
|
|
const pubModule = '1';
|
|
const cmsModule = '2';
|
|
const sysModule = '3';
|
|
|
|
public $vSampleCfgForReplace = array(
|
|
'moduleName' => 'MODULE_NAME_SAMPLE',
|
|
'moduleTitle' => 'MODULE_TITLE_SAMPLE',
|
|
'moduleDbTableName' => 'DB_SAMPLE_TABLE_NAME',
|
|
'permissions' => array(
|
|
'SAMPLE_MODULE_SHOW_MANAGEMENT',
|
|
'SAMPLE_MODULE_ADD_NEW',
|
|
'SAMPLE_MODULE_DELETE',
|
|
'SAMPLE_MODULE_EDIT'
|
|
),
|
|
);
|
|
|
|
public $vNewModData = array();
|
|
|
|
/**
|
|
* Class constructor
|
|
*/
|
|
public function __construct($uriData, $dir, $name) {
|
|
|
|
$this->dir = $dir;
|
|
$this->name = $name;
|
|
|
|
parent :: __construct($uriData);
|
|
$this->module = new sysSiteModulesModule();
|
|
|
|
$this->oView->setTemplateDir($this->dir . "/tmpl/");
|
|
|
|
if(!$this->oView->cacheUsed()){
|
|
$this->oView->setJs(getCurrentFolder($this->dir) . '/js/' . $this->name . '.js');
|
|
$this->oView->setCss(getCurrentFolder($this->dir) . '/css/' . $this->name . '.css');
|
|
}
|
|
|
|
// Set JS module init title
|
|
$this->oView->setAsJSON(cCore::JS_MOD, ucfirst($name));
|
|
}
|
|
|
|
/**
|
|
* Function to show main form in the module
|
|
*
|
|
* @category sysSiteModules Controller
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @returns bool true
|
|
*/
|
|
public function run($initEditMode = false){
|
|
|
|
$this->oView->TABLE = true;
|
|
|
|
$this->oView->setAsJSON('initEdit', $initEditMode);
|
|
$this->oView->setAsJSON('baseUrl', $this->gL());
|
|
$this->oView->setAsJSON('gM', $this->getTranslations());
|
|
$this->oView->setAsJSON('vcfg', $this->getValCfg());
|
|
|
|
$this->oView->CMS_CUSTOM_TPL_DATA = $this->oView->genTemplate('data/newModule');
|
|
$this->oView->display();
|
|
}
|
|
|
|
/**
|
|
* Function to create cms table & return for direct & ajax input
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param int $page - page to display
|
|
* @param string $filter_json - (optional) filter json string
|
|
* @param bool $headers - flag whether to send header data or not
|
|
* @return array of data
|
|
* @version 1.1
|
|
*/
|
|
public function createCmsTable($page = 1, $filter_json = '', $headers = false) {
|
|
|
|
$pages = 0;
|
|
$filter = array();
|
|
if($filter_json) $filter = cJSON::decode($filter_json, true);
|
|
|
|
$this->oView->MODULE_TITLE = $this->gM("Site modules");
|
|
if(!!$filter && is_array($filter))
|
|
$this->oView->DEFAULT_SEARCH_VALUES = prepForDisplayHtml($filter);
|
|
$this->oView->LIST_HEADER = reOrderTableFields($this->getTableFields(), $this->oUser->oCfg->getTableProperty($this->name));
|
|
$this->oView->LIST_DATA = $this->getModuleData($page, $filter, $pages);
|
|
$this->oView->LIST_ACTIONS = $this->getTableActions();
|
|
|
|
$data = array(
|
|
'data' => $this->oView->genHelperView('cmsc/table/data-table'),
|
|
'pcount' => $pages,
|
|
'rlimit' => $this->cmsTableRecordsPerPage
|
|
);
|
|
|
|
// Send data to client
|
|
if($headers)
|
|
$data['header'] = $this->oView->genHelperView('cmsc/table/data-table-search');
|
|
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Function to get module data
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param int $page
|
|
* @param array $filter
|
|
* @param int $pages
|
|
* @return array of data
|
|
* @version 1.1
|
|
*/
|
|
public function getModuleData($page = 1, $filter = array(), &$pages) {
|
|
|
|
$where = "";
|
|
$sort = "id DESC";
|
|
|
|
$offset = (($page?$page:1)-1) * $this->cmsTableRecordsPerPage;
|
|
$tFields = $this->getTableFields();
|
|
|
|
// Create sort by
|
|
if(getP('sortBy')) $sort = $this->module->db->genOrderByQuery(getP('sortBy'), getP('sortWay'), $tFields);
|
|
|
|
// Create where clause
|
|
if(count($filter)) $where = $this->module->db->genSearchFieldQuery($filter, $tFields);
|
|
$subWhere = "";
|
|
|
|
$vData = $this->module->getModuleRecords($where . $subWhere, $sort, $offset, $this->cmsTableRecordsPerPage);
|
|
$this->oView->ROWS = $rows = $this->module->db->getSelectedRecordsCount();
|
|
$pages = floor($rows / $this->cmsTableRecordsPerPage) + ($rows%$this->cmsTableRecordsPerPage?1:0);
|
|
|
|
// Modify some data
|
|
if(!empty($vData) && is_array($vData)){
|
|
$vModTypes = array(
|
|
self::pubModule => $this->gM("PUB"),
|
|
self::cmsModule => $this->gM("CMS"),
|
|
self::sysModule => $this->gM("SYS"),
|
|
);
|
|
foreach($vData as &$v){
|
|
$v['mod_modified'] = date($this->CMSDateFormat, $v['mod_modified']);
|
|
$v['mod_created'] = date($this->CMSDateFormat, $v['mod_created']);
|
|
|
|
$v['mod_type'] = (!empty($vModTypes[$v['mod_type']]) ? $vModTypes[$v['mod_type']] : $this->gM('Type not found!'));
|
|
}
|
|
unset($v);
|
|
}
|
|
|
|
return $vData;
|
|
}
|
|
|
|
/**
|
|
* Function to delete records marked in table
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param string $rows - passed user ids in JSON string
|
|
* @return array of data
|
|
*/
|
|
public function delete($rows) {
|
|
return true;
|
|
|
|
if($rows = cJSON::decode($rows, true)){
|
|
if(!($vData = $this->module->getRecordsDataByIds($this->module->db->prepData($rows)))) // TODO BRS Aivars: izmainiju fn, jāpārtaisa tālāk.
|
|
cJSON::sendError(array('msg' => $this->gM('No data found for delete!')));
|
|
|
|
if(!empty($vData) && is_array($vData)){
|
|
foreach($vData as $v){
|
|
$sDir = '';
|
|
if(!empty($v['mod_pub'])) $sDir = __APP__ . self::pubPrefix . $v['mod_class_name'];
|
|
if(!empty($v['mod_cms'])) $sDir = __APP__ . self::cmsPrefix . $v['mod_class_name'];
|
|
if(!empty($v['mod_sys'])) $sDir = __APP__ . self::sysPrefix . $v['mod_class_name'];
|
|
|
|
$this->rrmdir($sDir);
|
|
unset($sDir);
|
|
}
|
|
}
|
|
$this->module->deleteRecordsByIds($this->module->db->prepData($rows));
|
|
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
/**
|
|
* Function to delete directory
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param string $sDir - directory to delete
|
|
* @return array of data
|
|
*/
|
|
public function rrmdir($sDir) {
|
|
if (is_dir($sDir)) {
|
|
$vFiles = scandir($sDir);
|
|
foreach ($vFiles as $sFile) {
|
|
if ($sFile != "." && $sFile != "..") {
|
|
if (filetype("{$sDir}/{$sFile}") == "dir") $this->rrmdir("{$sDir}/{$sFile}"); else unlink("{$sDir}/{$sFile}");
|
|
}
|
|
}
|
|
unset($vFiles);
|
|
rmdir($sDir);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Function to get table record data for edit mode
|
|
*
|
|
* @author Aivars Žukovskis <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param int $id - record id
|
|
* @return array of data
|
|
*/
|
|
public function editCmsTableRecord($id) {
|
|
|
|
if($id){
|
|
$this->oView->DATA = $this->module->getRecordDataById($id);
|
|
|
|
$vModCfg = array(
|
|
self::pubModule => array(
|
|
'prefix' => self::pubPrefix,
|
|
),
|
|
self::cmsModule => array(
|
|
'prefix' => self::cmsPrefix,
|
|
),
|
|
self::sysModule => array(
|
|
'prefix' => self::sysPrefix,
|
|
),
|
|
);
|
|
$this->oView->PREFIX = (!empty($vModCfg[$this->oView->DATA['mod_type']]) ? $vModCfg[$this->oView->DATA['mod_type']]['prefix'] : 'ERROR!');
|
|
|
|
}
|
|
|
|
return array(
|
|
'show' => array('buttons_top' => false, 'buttons_bottom' => true),
|
|
'btn' => $this->getFormButtons(),
|
|
'html' => $this->oView->genTemplate('edit'),
|
|
);
|
|
|
|
}
|
|
|
|
/**
|
|
* Function to create new module
|
|
*
|
|
* @author Aivars Žukovskis <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param string $data - param JSON string
|
|
* @return array of data
|
|
*/
|
|
public function createNewModule($data) {
|
|
|
|
|
|
if($data) $data = cJSON::decode($data, true);
|
|
// Start save process
|
|
if($data){
|
|
// Validate fields
|
|
$valid = new cValidator($this);
|
|
$errors = $valid->checkArray($data, $this->getValCfg());
|
|
if($errors !== true) cJSON::sendError(array('data' => $errors));
|
|
|
|
$vData = &$data['mBase'];
|
|
if(!empty($vData['pub']) || !empty($vData['cms']) || !empty($vData['sys'])){
|
|
|
|
$sType = self::pubModule; // by default type is 1 ( pub type );
|
|
$sPrefix = '';
|
|
$sModName = '';
|
|
$sModDir = '';
|
|
|
|
// Create a working name for module
|
|
$vData['class_name'] = $this->createNameForModule($vData['class_name']);
|
|
|
|
// If pub module
|
|
if(!empty($vData['pub'])){
|
|
$sPrefix = self::pubPrefix;
|
|
$sModName = "{$sPrefix}{$vData['class_name']}";
|
|
$sModDir = __APP__ . $sModName;
|
|
}
|
|
// If cms module
|
|
if(!empty($vData['cms'])){
|
|
$sType = self::cmsModule;
|
|
$sPrefix = self::cmsPrefix;
|
|
$sModName = "{$sPrefix}{$vData['class_name']}";
|
|
$sModDir = __CMS__ . $sModName;
|
|
}
|
|
// If system module
|
|
if(!empty($vData['sys'])){
|
|
$sType = self::sysModule;
|
|
$sPrefix = self::sysPrefix;
|
|
$sModName = "{$sPrefix}{$vData['class_name']}";
|
|
$sModDir = __CMSSYS__ . $sModName;
|
|
}
|
|
|
|
$vModData = array(
|
|
'class_name' => $vData['class_name'],
|
|
'title' => $vData['title'],
|
|
'db_name' => strtolower("{$sPrefix}_{$vData['db_name']}"),
|
|
'p_name' => strtoupper("{$sPrefix}_{$vData['p_name']}"),
|
|
'sModDir' => $sModDir,
|
|
'sModName' => $sModName,
|
|
'prefix' => $sPrefix,
|
|
);
|
|
|
|
$vErrorMsg = array(
|
|
'class_name' => $this->gM('Module with this mod class name already exists!'),
|
|
'db_name' => $this->gM('Db table with name like this already exists!'),
|
|
);
|
|
|
|
// Check if module exists
|
|
if(file_exists($sModDir)) cJSON::sendError(array('data' => array('class_name' => $vErrorMsg['class_name']), 'msg' => $vErrorMsg['class_name']));
|
|
// Check if db table with name like this exists
|
|
if($this->module->checkDbTableExists($vModData['db_name'])) cJSON::sendError(array('data' => array('db_name' => $vErrorMsg['db_name']), 'msg' => $vErrorMsg['db_name']));
|
|
|
|
// Create module files
|
|
$this->createModule($vModData);
|
|
|
|
|
|
// Create permissions query
|
|
$sPermissionSql = $this->createPermissions($sType, $vModData['p_name'], $vData['title']);
|
|
|
|
// Create table query
|
|
$sTableSql = "
|
|
CREATE TABLE IF NOT EXISTS `{$vModData['db_name']}` (
|
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
`a_field_1` int(11) NOT NULL DEFAULT '0',
|
|
`a_field_2` varchar(900) NOT NULL DEFAULT '',
|
|
`a_blocked` enum('0','1') NOT NULL DEFAULT '0',
|
|
`a_modified` int(11) NOT NULL DEFAULT '0',
|
|
`a_modified_by` int(11) NOT NULL DEFAULT '0',
|
|
`a_created` int(11) NOT NULL DEFAULT '0',
|
|
`a_created_by` int(11) NOT NULL DEFAULT '0',
|
|
PRIMARY KEY (`id`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
|
|
";
|
|
|
|
$iTime = time();
|
|
$vInsert = array(
|
|
'mod_class_name' => $vData['class_name'],
|
|
'mod_title' => $vData['title'],
|
|
'mod_db_name' => strtolower($vData['db_name']),
|
|
'mod_p_name' => strtoupper($vData['p_name']),
|
|
'mod_type' => $sType,
|
|
'mod_permission_sql' => $sPermissionSql,
|
|
'mod_table_sql' => $sTableSql,
|
|
|
|
'mod_modified' => $iTime,
|
|
'mod_modified_by' => $this->oUser->getUser(),
|
|
|
|
'mod_created' => $iTime,
|
|
'mod_created_by' => $this->oUser->getUser()
|
|
);
|
|
|
|
// Save data
|
|
if(!($recordId = $this->module->saveModuleData(false, $vInsert)))
|
|
cJSON::sendError();
|
|
|
|
|
|
cJSON::sendOk(array('newid' => $recordId, 'p_sql' => $sPermissionSql, 't_sql' => $sTableSql));
|
|
}
|
|
|
|
unset($vData);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Function to create permissions
|
|
*
|
|
* @author Aivars Žukovskis <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param int $modType - module type
|
|
* @param string $sName - permission name
|
|
* @param string $sModTitle - module title
|
|
* @return string - multi query string for delete/insert permissions and group
|
|
* @version 1.1
|
|
*/
|
|
public function createPermissions($modType, $sName, $sModTitle){
|
|
|
|
// Tables for pub/cms side
|
|
$sPermissionLinkTable = 'site_users_permissions';
|
|
$sPermissionTable = 'site_permissions';
|
|
$sPermissionGrTable = 'site_users_groups';
|
|
if($modType === self::pubModule){
|
|
$sPermissionLinkTable = 'mod_users_permissions';
|
|
$sPermissionTable = 'mod_permissions';
|
|
$sPermissionGrTable = 'mod_permissions_groups';
|
|
}
|
|
|
|
// Variables for insert queries
|
|
$sSqlPt1 = "";
|
|
$sSqlPt2 = "";
|
|
$vPermissionsIds = array();
|
|
|
|
// Main variables
|
|
$vDefaultPermissions = array('EDIT', 'ADD_NEW', 'DELETE', 'SHOW_MANAGEMENT');
|
|
$vMultiInsert = array();
|
|
$vMultiInsertLinks = array();
|
|
$groupId = $this->module->rsvTableRows(2, $sPermissionGrTable, 'id, group_modified') - 1;
|
|
$this->module->deleteTempRows($sPermissionGrTable, 'group_modified');
|
|
|
|
// Reserve permissions ids && delete temp row after
|
|
$rowsToInsert = count($vDefaultPermissions);
|
|
$lastId = $this->module->rsvTableRows($rowsToInsert + 1, $sPermissionTable, 'id, p_modified') - $rowsToInsert;
|
|
$this->module->deleteTempRows($sPermissionTable, 'p_modified');
|
|
|
|
// add _ at the end of string if there isn't already.
|
|
$sName = (substr($sName, -1) == '_' ? $sName : $sName . "_");
|
|
$iTime = time();
|
|
$sDesc = "Permission to %PP% in {$sModTitle}";
|
|
|
|
// Create group insert
|
|
$vGroupInsert = array(
|
|
'id' => $groupId,
|
|
'group_name' => substr($sName, 0, strlen($sName) -1),
|
|
'group_description' => "Full permission for {$sModTitle}",
|
|
'group_blocked' => 0,
|
|
'group_modified' => $iTime,
|
|
);
|
|
$sSqlInsertGroup = "
|
|
INSERT INTO {$sPermissionGrTable} (id, group_name, group_description, group_blocked, group_modified)
|
|
VALUES ({$groupId}, '{$vGroupInsert['group_name']}', '{$vGroupInsert['group_description']}', '{$vGroupInsert['group_blocked']}', {$vGroupInsert['group_modified']});
|
|
";
|
|
foreach($vDefaultPermissions as $v){
|
|
// Save id for later use
|
|
$vPermissionsIds[$lastId] = $lastId;
|
|
|
|
$sD = str_replace('%PP%', strtolower(preg_replace('/_/', ' ' ,$v)), $sDesc);
|
|
$vMultiInsert[] = array(
|
|
'id' => $lastId,
|
|
'p_name' => $sName . $v,
|
|
'p_type_id' => 0,
|
|
'p_description' => $sD,
|
|
'p_blocked' => 0,
|
|
'p_modified' => $iTime,
|
|
);
|
|
|
|
// Gen. insert query string
|
|
$sSqlPt1 .= ",\n ({$lastId}, '". $sName . $v ."', 0, '{$sD}', '0', {$iTime})";
|
|
$sSqlPt2 .= ",\n (0, {$vGroupInsert['id']}, {$lastId})";
|
|
|
|
$vMultiInsertLinks[] = array(
|
|
'user_id' => 0,
|
|
'groups_id' => $vGroupInsert['id'],
|
|
'permissions_id' => $lastId++
|
|
);
|
|
}
|
|
|
|
$sSqlInsertPermissions = "INSERT INTO {$sPermissionTable} (id, p_name, p_type_id, p_description, p_blocked, p_modified) VALUES" . substr($sSqlPt1, 1) . ";";
|
|
$sSqlInsertLinks = "INSERT INTO {$sPermissionLinkTable} (user_id, groups_id, permissions_id) VALUES" . substr($sSqlPt2, 1) . ";";
|
|
|
|
$sSqlPermDelete = "DELETE FROM mod_permissions WHERE id IN (". implode (", ", $vPermissionsIds) .");";
|
|
$sSqlDeleteLinks1 = "DELETE FROM mod_users_permissions WHERE permissions_id IN (". implode (", ", $vPermissionsIds) .");";
|
|
|
|
$sSqlGroupsDelete = "DELETE FROM mod_permissions_groups WHERE id IN ({$groupId});";
|
|
$sSqlDeleteLinks2 = "DELETE FROM mod_users_permissions WHERE groups_id IN ({$groupId});";
|
|
|
|
|
|
$sSqlMulti = "
|
|
{$sSqlPermDelete}
|
|
{$sSqlDeleteLinks1}
|
|
{$sSqlGroupsDelete}
|
|
{$sSqlDeleteLinks2} \n
|
|
{$sSqlInsertGroup}
|
|
{$sSqlInsertPermissions}
|
|
{$sSqlInsertLinks}
|
|
";
|
|
|
|
|
|
|
|
// Insert permissions
|
|
/*if($this->module->insertMulti($vMultiInsert)){
|
|
// Insert group
|
|
if($groupId = $this->module->insertGroup($vGroupInsert)){
|
|
// Insert permissions links to group
|
|
$this->module->insertMulti($vMultiInsertLinks, 'mod_users_permissions');
|
|
}else
|
|
cJSON::sendError($this->gM('Error to insert permission group'));
|
|
}else{
|
|
cJSON::sendError($this->gM('Error to insert permissions'));
|
|
}*/
|
|
|
|
|
|
return $sSqlMulti;
|
|
|
|
}
|
|
|
|
/**
|
|
* Function to create name for modules
|
|
*
|
|
* @author Aivars Žukovskis <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param string $sName - module name
|
|
* @return string - module name we can use
|
|
* @version 1.1
|
|
*/
|
|
public function createNameForModule($sName){
|
|
|
|
$sName = str_replace(" ", "", ucwords($sName));
|
|
$sName = removeSpecialChars($sName, false, false);
|
|
|
|
return $sName;
|
|
}
|
|
|
|
/**
|
|
* Function to create table headers + search
|
|
*
|
|
* @author Aivars Žukovskis <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param array $vData - array with all needed data ( name, dir, etc )
|
|
* @version 1.1
|
|
*/
|
|
public function createModule($vData){
|
|
|
|
$vReplace = array(
|
|
$this->vSampleCfgForReplace['moduleName'] => $vData['sModName']
|
|
);
|
|
$vReplacePermissions = array();
|
|
foreach($this->vSampleCfgForReplace['permissions'] as $pp)
|
|
$vReplacePermissions[$pp] = str_replace('SAMPLE_MODULE', str_replace(" ", "_", $vData['p_name']), $pp);
|
|
|
|
|
|
// Create main dir
|
|
mkdir($vData['sModDir'], 0777, true);
|
|
|
|
// Create main php file
|
|
$this->createFile($vData['sModDir'] . "/{$vData['sModName']}.php", "{$vData['prefix']}Sample.php", array_merge($vReplace, $vReplacePermissions));
|
|
|
|
|
|
// Create next level dirs
|
|
$vSubDir = array( 'css', 'inc', 'js', 'tmpl' );
|
|
foreach($vSubDir as $sName){
|
|
mkdir($vData['sModDir'] . "/{$sName}", 0777, true);
|
|
|
|
switch($sName){
|
|
case "css":
|
|
$this->createFile($vData['sModDir'] . "/{$sName}/{$vData['sModName']}.css", '', '');
|
|
break;
|
|
|
|
case "inc":
|
|
$sFileDir = $vData['sModDir'] . "/{$sName}/{$vData['sModName']}Controller.php";
|
|
$this->createFile($sFileDir, "{$vData['prefix']}SampleController.php", array_merge($vReplace, $vReplacePermissions, array($this->vSampleCfgForReplace['moduleTitle'] => $vData['title'])));
|
|
|
|
$sFileDir = $vData['sModDir'] . "/{$sName}/{$vData['sModName']}Module.php";
|
|
$this->createFile($sFileDir, "{$vData['prefix']}SampleModule.php", array_merge($vReplace, array($this->vSampleCfgForReplace['moduleDbTableName'] => strtolower($vData['db_name']))));
|
|
break;
|
|
|
|
case "js":
|
|
$this->createFile($vData['sModDir'] . "/{$sName}/{$vData['sModName']}.js", "{$vData['prefix']}Sample.js", array($this->vSampleCfgForReplace['moduleName'] => ucfirst($vData['sModName'])));
|
|
break;
|
|
|
|
case "tmpl":
|
|
$this->createFile($vData['sModDir'] . "/{$sName}/edit.tpl", "{$vData['prefix']}Edit.tpl", array());
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
/**
|
|
* Function to create table headers + search
|
|
*
|
|
* @author Aivars Žukovskis <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param array $vData - array with all needed data ( name, dir, etc )
|
|
* @param array $vOldData - old module data ( name, dir, etc )
|
|
* @version 1.1
|
|
*/
|
|
public function copyModule($vData, $vOldData){
|
|
|
|
$vReplace = array(
|
|
"{$vOldData['prefix']}{$vOldData['mod_class_name']}" => $vData['sModClass']
|
|
);
|
|
$sP = str_replace(" ", "_", $vData['p_name']);
|
|
$vReplacePermissions = array(
|
|
"{$vOldData['mod_p_name']}_SHOW_MANAGEMENT" => $sP . "_SHOW_MANAGEMENT",
|
|
"{$vOldData['mod_p_name']}_ADD_NEW" => $sP . "_ADD_NEW",
|
|
"{$vOldData['mod_p_name']}_DELETE" => $sP . "_DELETE",
|
|
"{$vOldData['mod_p_name']}_EDIT" => $sP . "_EDIT",
|
|
);
|
|
|
|
// Rename main php file
|
|
$this->copyFile("{$vOldData['sModDir']}/{$vData['sModClass']}.php", "{$vOldData['sModDir']}/{$vOldData['prefix']}{$vOldData['mod_class_name']}.php", array_merge($vReplace, $vReplacePermissions));
|
|
|
|
|
|
// Create next level dirs
|
|
$vSubDir = array( 'css', 'inc', 'js', 'tmpl' );
|
|
foreach($vSubDir as $sName){
|
|
switch($sName){
|
|
case "css":
|
|
$this->copyFile("{$vOldData['sModDir']}/css/{$vData['sModClass']}.css", "{$vOldData['sModDir']}/css/{$vOldData['prefix']}{$vOldData['mod_class_name']}.css");
|
|
break;
|
|
|
|
case "inc":
|
|
$sFileDir = "{$vOldData['sModDir']}/inc/{$vData['sModClass']}Controller.php";
|
|
$this->copyFile($sFileDir, "{$vOldData['sModDir']}/inc/{$vOldData['prefix']}{$vOldData['mod_class_name']}Controller.php", array_merge($vReplace, $vReplacePermissions, array($vOldData['mod_title'] => $vData['title'])));
|
|
|
|
$sFileDir = "{$vOldData['sModDir']}/inc/{$vData['sModClass']}Module.php";
|
|
$this->copyFile($sFileDir, "{$vOldData['sModDir']}/inc/{$vOldData['prefix']}{$vOldData['mod_class_name']}Module.php", array_merge($vReplace, array($vOldData['mod_db_name'] => strtolower($vData['db_name']))));
|
|
break;
|
|
|
|
case "js":
|
|
$this->copyFile("{$vOldData['sModDir']}/js/{$vData['sModClass']}.js", "{$vOldData['sModDir']}/js/{$vOldData['prefix']}{$vOldData['mod_class_name']}.js", array(ucfirst("{$vOldData['prefix']}{$vOldData['mod_class_name']}") => ucfirst($vData['sModClass'])));
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
// Rename main dir
|
|
rename($vOldData['sModDir'], $vData['sModDir']);
|
|
|
|
}
|
|
|
|
/**
|
|
* Function create new file
|
|
*
|
|
* @author Aivars Žukovski <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param string $sFileDir - file with dir
|
|
* @param string $sSampleFileName - file name
|
|
* @param array $vReplaceCfg - replace cfg
|
|
* @version 1.1
|
|
*/
|
|
public function createFile($sFileDir, $sSampleFileName, $vReplaceCfg){
|
|
|
|
$sNewContent = "";
|
|
if(strlen($sSampleFileName)){
|
|
$tplDirForCopy = __CMSSYS__ . "sysSiteModules/samples/";
|
|
if(file_exists("{$tplDirForCopy}{$sSampleFileName}")){
|
|
$sContent = file_get_contents("{$tplDirForCopy}{$sSampleFileName}");
|
|
if(!empty($vReplaceCfg) && is_array($vReplaceCfg)){
|
|
foreach($vReplaceCfg as $old => $new)
|
|
$sContent = str_replace($old, $new, $sContent);
|
|
}
|
|
$sNewContent = $sContent;
|
|
}
|
|
}
|
|
|
|
$newFile = fopen($sFileDir, "w");
|
|
fwrite($newFile, $sNewContent);
|
|
|
|
fclose($newFile);
|
|
unset($newFile);
|
|
|
|
}
|
|
/**
|
|
* Function create new file
|
|
*
|
|
* @author Aivars Žukovski <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param string $sNewFileDir - new file with dir
|
|
* @param string $sOldFileDir - old file with dir
|
|
* @param array $vReplaceCfg - replace cfg
|
|
* @version 1.1
|
|
*/
|
|
public function copyFile($sNewFileDir, $sOldFileDir, $vReplaceCfg = array()){
|
|
|
|
$file = fopen($sOldFileDir,"r");
|
|
$sContent = fread($file, filesize($sOldFileDir));
|
|
fclose($file);
|
|
|
|
if(!empty($vReplaceCfg) && is_array($vReplaceCfg)){
|
|
foreach($vReplaceCfg as $old => $new)
|
|
$sContent = str_replace($old, $new, $sContent);
|
|
}
|
|
|
|
$file = fopen($sOldFileDir,"w+");
|
|
fwrite($file, $sContent);
|
|
fclose($file);
|
|
|
|
rename($sOldFileDir, $sNewFileDir);
|
|
|
|
}
|
|
|
|
/**
|
|
* Function to create new module
|
|
*
|
|
* @author Aivars Žukovskis <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @param int $recordId - record id
|
|
* @param string $data - param JSON string
|
|
* @return array of data
|
|
*/
|
|
public function saveModuleData($recordId, $data) {
|
|
|
|
if(!!$recordId && strlen($data)){
|
|
|
|
if($data) $vData = $this->getSubmittedDataAsArray($data);
|
|
if(!empty($vData) && is_array($vData)){
|
|
|
|
// Validate fields
|
|
$valid = new cValidator($this);
|
|
$errors = $valid->checkArray($vData, $this->getValCfg());
|
|
if($errors !== true) cJSON::sendError(array('data' => $errors));
|
|
|
|
// Set error msg
|
|
$vErrorMsg = array(
|
|
'class_name' => $this->gM('Module with this mod class name already exists!'),
|
|
'db_name' => $this->gM('Db table with name like this already exists!'),
|
|
'mod_type' => $this->gM('Module type not found! Check for changes?'),
|
|
);
|
|
|
|
|
|
// Get db data for this module
|
|
$vModData = $this->module->getModuleDataById($recordId);
|
|
$vModCfg = array(
|
|
self::pubModule => array(
|
|
'prefix' => self::pubPrefix,
|
|
'modDir' => __APP__
|
|
),
|
|
self::cmsModule => array(
|
|
'prefix' => self::cmsPrefix,
|
|
'modDir' => __CMS__
|
|
),
|
|
self::sysModule => array(
|
|
'prefix' => self::sysPrefix,
|
|
'modDir' => __CMSSYS__
|
|
),
|
|
);
|
|
|
|
|
|
// Create a working name for module
|
|
$vData['mBase']['class_name'] = $this->createNameForModule($vData['mBase']['class_name']);
|
|
$vData['mBase']['p_name'] = strtoupper($vData['mBase']['p_name']);
|
|
// Create module new directory string
|
|
$sModDir = "{$vModCfg[$vModData['mod_type']]['modDir']}{$vModCfg[$vModData['mod_type']]['prefix']}{$vData['mBase']['class_name']}";
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// Check for errors
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// Check if right module type by type config
|
|
if(empty($vModCfg[$vModData['mod_type']]))
|
|
cJSON::sendError(array('msg' => $vErrorMsg['mod_type']));
|
|
// For module class name change, check if a module by given name exists
|
|
if(($vModData['mod_class_name'] != $vData['mBase']['class_name']) && file_exists($sModDir))
|
|
cJSON::sendError(array('data' => array('class_name' => $vErrorMsg['class_name']), 'msg' => $vErrorMsg['class_name']));
|
|
// Check if db table name exists
|
|
if($vModData['mod_db_name'] != $vData['mBase']['class_name'] && $this->module->checkDbTableExists($vData['mBase']['db_name']))
|
|
cJSON::sendError(array('data' => array('db_name' => $vErrorMsg['db_name']), 'msg' => $vErrorMsg['db_name']));
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// Modifications
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// For class name change we create new module and copy data from old one then remove the old
|
|
$vData['mBase']['sModDir'] = $sModDir;
|
|
$vData['mBase']['sModClass'] = "{$vModCfg[$vModData['mod_type']]['prefix']}{$vData['mBase']['class_name']}";
|
|
$vData['mBase']['prefix'] = $vModCfg[$vModData['mod_type']]['prefix'];
|
|
$vModData['sModDir'] = "{$vModCfg[$vModData['mod_type']]['modDir']}{$vModCfg[$vModData['mod_type']]['prefix']}{$vModData['mod_class_name']}";
|
|
$vModData['prefix'] = $vModCfg[$vModData['mod_type']]['prefix'];
|
|
|
|
|
|
$sPermissionSql = '';
|
|
$sTableSql = '';
|
|
if(strlen($vModData['mod_permission_sql']))
|
|
$sPermissionSql = str_replace($vModData['mod_p_name'], $vData['mBase']['p_name'], $vModData['mod_permission_sql']);
|
|
if(strlen($vModData['mod_table_sql']))
|
|
$sTableSql = str_replace($vModData['mod_db_name'], $vData['mBase']['db_name'], $vModData['mod_table_sql']);
|
|
|
|
$this->copyModule($vData['mBase'], $vModData);
|
|
|
|
$vUpdate = array(
|
|
'mod_title' => $vData['mBase']['title'],
|
|
'mod_class_name' => $vData['mBase']['class_name'],
|
|
'mod_db_name' => $vData['mBase']['db_name'],
|
|
'mod_p_name' => $vData['mBase']['p_name'],
|
|
'mod_permission_sql' => $sPermissionSql,
|
|
'mod_table_sql' => $sTableSql,
|
|
);
|
|
|
|
if(!$this->module->saveModuleData($recordId, $vUpdate))
|
|
cJSON::sendError(array('msg' => $this->gM("Error on saving data!")));
|
|
|
|
|
|
cJSON::sendOk(array('p_sql' => $sPermissionSql, 't_sql' => $sTableSql));
|
|
}
|
|
|
|
|
|
unset($recordId, $data, $vData);
|
|
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* Function to create table headers + search
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @return array of data
|
|
* @version 1.1
|
|
*/
|
|
public function getTableFields(){
|
|
|
|
if(!$this->oUser->chkPermission('SYS_SITE_MODULES_SHOW_MANAGEMENT', false, false)) return false;
|
|
|
|
$vDropDown = array(
|
|
'' => array('title' => $this->gM("-- Select --")),
|
|
self::pubModule => array('title' => $this->gM("PUB")),
|
|
self::cmsModule => array('title' => $this->gM("CMS")),
|
|
self::sysModule => array('title' => $this->gM("SYS")),
|
|
);
|
|
|
|
$tFields = array(
|
|
"checkbox" => array(
|
|
'sort' => false,
|
|
'title' => '',
|
|
'class' => 'w4 center rchk'
|
|
),
|
|
"id" => array(
|
|
'sort' => true,
|
|
'search' => true,
|
|
'title' => $this->gM("ID"),
|
|
'class' => 'w6 center sortDesc sort',
|
|
'db_field' => 'sm.id',
|
|
'type' => 'input',
|
|
),
|
|
"mod_title" => array(
|
|
'sort' => true,
|
|
'search' => true,
|
|
'title' => $this->gM("Module title"),
|
|
'class' => 'w18',
|
|
'db_field' => 'sm.mod_title',
|
|
'type' => 'input',
|
|
),
|
|
"mod_class_name" => array(
|
|
'sort' => true,
|
|
'search' => true,
|
|
'title' => $this->gM("Module class name"),
|
|
'class' => 'w16',
|
|
'db_field' => 'sm.mod_class_name',
|
|
'type' => 'input',
|
|
),
|
|
"mod_db_name" => array(
|
|
'sort' => true,
|
|
'search' => true,
|
|
'title' => $this->gM("Module db name"),
|
|
'class' => 'w14',
|
|
'db_field' => 'sm.mod_db_name',
|
|
'type' => 'input',
|
|
),
|
|
"mod_type" => array(
|
|
'sort' => true,
|
|
'search' => true,
|
|
'title' => $this->gM("Module type"),
|
|
'class' => 'w12 center',
|
|
'db_field' => 'sm.mod_type',
|
|
'type' => 'dropBox',
|
|
'data' => $vDropDown,
|
|
'default' => '',
|
|
),
|
|
"mod_modified" => array(
|
|
'sort' => true,
|
|
'search' => false,
|
|
'title' => $this->gM("Modified"),
|
|
'class' => 'w12',
|
|
'db_field' => 'sm.mod_modified',
|
|
'type' => 'input',
|
|
),
|
|
"mod_modified_by" => array(
|
|
'sort' => true,
|
|
'search' => true,
|
|
'title' => $this->gM("Modified by"),
|
|
'class' => 'w14',
|
|
'db_field' => 'mod_modified_by',
|
|
'type' => 'input',
|
|
),
|
|
"mod_created" => array(
|
|
'sort' => true,
|
|
'search' => false,
|
|
'title' => $this->gM("Created"),
|
|
'class' => 'w12',
|
|
'db_field' => 'sm.mod_created',
|
|
'type' => 'input',
|
|
),
|
|
"mod_created_by" => array(
|
|
'sort' => true,
|
|
'search' => true,
|
|
'title' => $this->gM("Created by"),
|
|
'class' => 'w14',
|
|
'db_field' => 'mod_created_by',
|
|
'type' => 'input',
|
|
),
|
|
"buttons" => array(
|
|
'sort' => false,
|
|
'class' => 'w20',
|
|
'title' => $this->gM("Actions"),
|
|
'btnset' => array(
|
|
'ledit' => array(
|
|
'edit' => true,
|
|
'title' => $this->gM("Edit"),
|
|
),
|
|
'ldelete' => array(
|
|
'title' => $this->gM("Delete"),
|
|
)
|
|
)
|
|
)
|
|
);
|
|
|
|
if(!$this->chkP('SYS_SITE_MODULES_DELETE_FILES'))
|
|
unset($tFields['buttons']['btnset']['ldelete']);
|
|
|
|
if(!$this->chkP('SYS_SHOW_TABLE_IDS'))
|
|
unset($tFields['id']);
|
|
|
|
|
|
return $tFields;
|
|
}
|
|
|
|
/**
|
|
* Function to get js translations for view
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @return array of data
|
|
*/
|
|
public function getTranslations(){
|
|
return array(
|
|
'yes' => $this->gM('Yes'),
|
|
'no' => $this->gM('No'),
|
|
'delTitle' => $this->gM('Delete entry?'),
|
|
'delMessage' => $this->gM('Selected entry will be permanently deleted and cannot be recovered. Confirm delete?'),
|
|
'buttonYes' => $this->gM('Delete selected entry'),
|
|
'buttonCancel' => $this->gM('Cancel operation'),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Function to get table actions
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @return array of data
|
|
*/
|
|
public function getTableActions(){
|
|
|
|
$actions = array(
|
|
'inew' => array(
|
|
'lbl' => $this->gM("Add new"),
|
|
'icon' => 'nico-add',
|
|
'p' => 'SYS_SITE_MODULES_ADD_NEW'
|
|
),
|
|
'sepline',
|
|
'idelete' => array(
|
|
'lbl' => $this->gM("Delete selected"),
|
|
'icon' => 'nico-delete',
|
|
'p' => 'SYS_SITE_MODULES_DELETE_FILES'
|
|
),
|
|
);
|
|
|
|
// Chk has permissions for actions
|
|
if(!!$actions && is_array($actions)){
|
|
foreach($actions as $k=>&$v){
|
|
if(is_array($v) && isset($v['p'])){
|
|
if(!$this->chkP($v['p']))
|
|
unset($actions[$k]);
|
|
unset($actions[$k]['p']);
|
|
}
|
|
}
|
|
unset($v);
|
|
}
|
|
|
|
// Reformat drop down
|
|
reformatDropDown($actions);
|
|
return $actions;
|
|
}
|
|
|
|
/**
|
|
* Function to get js validator cfg
|
|
*
|
|
* @author Aivars Žukovskis <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @return array of data
|
|
*/
|
|
public function getValCfg(){
|
|
return array(
|
|
'title' => array(
|
|
cValidator::P_TYPE => cValidator::TY_STR,
|
|
cValidator::P_COMP => 1,
|
|
cValidator::P_TEST => array(cValidator::CHK_STR),
|
|
),
|
|
'class_name' => array(
|
|
cValidator::P_TYPE => cValidator::TY_STR,
|
|
cValidator::P_COMP => 1,
|
|
cValidator::P_TEST => array(cValidator::CHK_STR),
|
|
),
|
|
'db_name' => array(
|
|
cValidator::P_TYPE => cValidator::TY_STR,
|
|
cValidator::P_COMP => 1,
|
|
cValidator::P_TEST => array(cValidator::CHK_STR),
|
|
cValidator::P_ADDS => array('min' => 5)
|
|
),
|
|
'p_name' => array(
|
|
cValidator::P_TYPE => cValidator::TY_STR,
|
|
cValidator::P_COMP => 1,
|
|
cValidator::P_TEST => array(cValidator::CHK_STR),
|
|
cValidator::P_ADDS => array('min' => 5)
|
|
),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Function to get form buttons
|
|
*
|
|
* @author Aivars Žukovskis <mareks.keiss@brsystems.lv>
|
|
* @category sysSiteModules Controller
|
|
* @return array of data
|
|
*/
|
|
public function getFormButtons(){
|
|
return array(
|
|
1 => array(
|
|
'id' => 'fsave',
|
|
'lbl' => $this->gM('Save')
|
|
),
|
|
2 => array(
|
|
'id' => 'fcancel',
|
|
'lbl' => $this->gM('Cancel')
|
|
)
|
|
);
|
|
}
|
|
}
|