* @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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') ) ); } }