public static function psctrl(array $params) { $id = array_get_value_unset('id', $params); $class = to_array(array_get_value_unset('class', $params)); $class[] = 'pscontrols'; if (!empty($params)) { array_remove_keys($params, array_diff(array_keys($params), PsUtil::getClassConsts(__CLASS__, 'ACTION_'))); } return empty($params) ? '' : PSSmarty::template('common/pscontrols.tpl', array('id' => $id, 'class' => PsHtml::classes2string($class), 'actions' => $params))->fetch(); }
/** * @constructor * * Instantiate steps from Work model. */ public function __construct($data = null) { if ($data instanceof Work) { $this->work($data); // note; Take the value copy of parent Work model. $data = $data->data(); array_remove_keys($data, array('uuid', 'tasks', 'timestamp')); $data = array_filter($data); } parent::__construct($data); }
/** * Removes the specified keys from the array. * * @param array $array * @param array $keys Keys to remove * * @return array * * @author Jack P. * @package Avalon * @subpackage Helpers */ function array_remove_keys($array, $keys) { // Loop over the array foreach ($array as $key => $value) { // Check if we want to remove it... if (!is_numeric($key) and in_array($key, $keys)) { unset($array[$key]); continue; } // Filter the value if it's an array also $array[$key] = is_array($value) ? array_remove_keys($value, $keys) : $value; } return $array; }
/** * Returns the json encoded version of the passed data. * * @param mixed $data * @param array $options * * @author Jack P. * @copyright Copyright (c) Jack P. * @package Traq * @subpackage Helpers */ function to_json($data, $options = array()) { // Merge options with defaults $defaults = array('hide' => array('password', 'login_hash', 'api_key', 'private_key')); $options = array_merge($defaults, $options); // Convert the data to an array, if possible.. if (!is_array($data)) { $data = to_array($data); } foreach ($data as $k => $v) { $data[$k] = to_array($v); } // Remove the parts we don't want... if (isset($options['hide']) and is_array($data)) { $data = array_remove_keys($data, $options['hide']); } return json_encode($data); }
public function groupByMethod(&$tables, $tableName, $isReplace, $upFile, $showChanges, $targetdb, $sourcedb) { $fields = ""; $pKeys = ""; $IDs = ""; $selFields = ""; // check columns exist in both tables $columns = array_intersect_key($tables[0][$tableName]->getColumns(), $tables[1][$tableName]->getColumns()); // count identity,primary and other columns $colCnt = array("ID" => 0, "PK" => 0, "CL" => 0, "TOT" => 0); foreach ($columns as $column) { if ($column->metadata['IDENTITY']) { $IDs .= ($colCnt["ID"] > 0 ? "," : "") . fixFieldName($column->name, true, true); ++$colCnt["ID"]; } else { if ($column->metadata['PRIMARY']) { $pKeys .= ($colCnt["PK"] > 0 ? "," : "") . fixFieldName($column->name, true, true); ++$colCnt["PK"]; } else { $fields .= ($colCnt["CL"] > 0 ? "," : "") . fixFieldName($column->name, true, true); ++$colCnt["CL"]; } } $selFields .= ($colCnt["TOT"] > 0 ? "," : "") . fixFieldName($column->name, true, true); ++$colCnt["TOT"]; } // to convert in zend syntax for other db compatibility $sql = "SELECT MIN(tbl_name) AS tbl_name, " . $selFields . "\r\n FROM\r\n (\r\n SELECT 'source_table' AS tbl_name , " . $selFields . "\r\n FROM " . $targetdb->name . "." . $tableName . " AS S\r\n UNION ALL\r\n SELECT 'target_table' AS tbl_name , " . $selFields . "\r\n FROM " . $sourcedb->name . "." . $tableName . " AS D\r\n ) AS alias_table\r\n GROUP BY " . $selFields . "\r\n HAVING COUNT(*)=1"; // to optimize if ($IDs != "" || $pKeys != "") { $sql .= " ORDER BY "; if ($IDs != "" && $pKeys != "") { $sql .= $IDs . "," . $pKeys; } else { if ($IDs != "") { $sql .= $IDs; } else { $sql .= $pKeys; } } } $result = mysql_query($sql, $this->targetdb->getMysqlConnection()); if (!$result) { return false; } // clean tables $tables[0][$tableName]->blankRows(); $tables[1][$tableName]->blankRows(); $pColumns = $tables[0][$tableName]->getPrimaryColumns(); $keycnt = count($pColumns); $canCompare = !empty($pColumns) && is_array($pColumns); $pKeyData = array(); $Data = array(); $num_rows = mysql_num_rows($result); // <= to process again after latest row fetch if ($num_rows > 0) { for ($i = 0; $i <= $num_rows; $i++) { $row = mysql_fetch_array($result, MYSQL_ASSOC); $DataOld = $Data; // data (array) - compared (boolean) $Data[0] = $row; $Data[1] = false; if ($canCompare) { $pKeyDataOld = $pKeyData; unset($pKeyData); //reset foreach ($pColumns as $pkName) { $pKeyData[] = $row[$pkName]; } } //hack code, to optimize ? //comparing with old value, it is possible with "order by" if ($canCompare && $pKeyDataOld == $pKeyData) { if ($Data[0]['tbl_name'] == $DataOld[0]['tbl_name']) { continue; // can't happen } if ($Data[0]['tbl_name'] == 'source_table') { $values = array_remove_keys($Data[0], 'tbl_name'); $compare = array_remove_keys($DataOld[0], 'tbl_name'); } else { $values = array_remove_keys($DataOld[0], 'tbl_name'); $compare = array_remove_keys($Data[0], 'tbl_name'); } $cRow = $tables[0][$tableName]->createRow($values, $tables[0][$tableName]->getRowsArray()); //create query using target data $this->rowsSetDiff($cRow, "compare", $compare, $isReplace); // in create query we get the compare value from source row $upFile->createQuery($cRow, $pColumns, $keycnt, $tableName); if ($showChanges) { $tables[0][$tableName]->addRow($cRow); } // compared $DataOld[1] = true; $Data[1] = true; } else { if ($i > 0 && $DataOld[1] == false) { if ($DataOld[0]['tbl_name'] == "source_table") { $cRow = $tables[0][$tableName]->createRow(array_remove_keys($DataOld[0], 'tbl_name'), $tables[0][$tableName]->getRowsArray()); $this->rowsSetDiff($cRow, "missing"); $upFile->createQuery($cRow, $pColumns, $keycnt, $tableName); if ($showChanges) { $tables[0][$tableName]->addRow($cRow); } } else { if ($DataOld[0]['tbl_name'] == "target_table") { $cRow = $tables[1][$tableName]->createRow(array_remove_keys($DataOld[0], 'tbl_name'), $tables[1][$tableName]->getRowsArray()); $this->rowsSetDiff($cRow, "new"); $upFile->createQuery($cRow, $pColumns, $keycnt, $tableName); if ($showChanges) { $tables[1][$tableName]->addRow($cRow); } } } } } } $upFile->writeData($keycnt, $tableName); } }
function executeProcess(array $argv) { PsConnectionPool::assertDisconnectied(); /* * СОЗДАЁМ SQL * * Нам нужны настройки таблиц, которые неоткуда взять, кроме как из базы, поэтому для экспорта данных нужна БД. * Все данные из "редактируемых" таблиц также загружаются из этой БД. */ $DB = DirManager::inst(__DIR__ . '/temp'); $SDK = DirManager::inst(__DIR__ . '/temp/sdk'); //Почистим файлы для удаления dolog('Clearing not .sql/.txt from temp dir'); /* @var $item DirItem */ foreach ($DB->getDirContentFull(null, DirItemFilter::FILES) as $item) { if (!$item->checkExtension(array(PsConst::EXT_TXT, PsConst::EXT_SQL))) { dolog('[-] {}', $item->remove()->getRelPath()); } } dolog(); /* * SDK */ //dolog('Processing objects.sql'); /* @var $DIR DirManager */ foreach (array(ENTITY_SCOPE_SDK => $SDK, ENTITY_SCOPE_PROJ => $DB) as $scope => $DM) { dolog(); dolog('***************************************************************'); dolog('>>> Processing scope [{}], dir: [{}]', $scope, $DM->absDirPath()); $SCHEMA = $DM->getDirItem(null, 'schema.sql'); if (!$SCHEMA->isFile()) { dolog('schema.sql is not exists, skipping'); continue; //--- } $DM_SYSOBJECTS = DirManager::inst($DM->absDirPath(), 'sysobjects'); /* * Очищаем папку, в которой будет содержимое для автосгенерированных файлов */ $DM_AUTO = DirManager::inst($DM_SYSOBJECTS->absDirPath(), 'auto')->clearDir(); /* * Создадим ссылку на файл с данными, выгруженными из таблиц */ $DI_AUTO_DATA = $DM_AUTO->getDirItem(null, 'data.sql'); /* * Сначала сделаем триггеры на таблицы, от которых зависит кеш и к которым привязаны фолдинги. */ LOGBOX_INIT(); LOGBOX('Making cache and folding table triggers'); $DM_AUTO_TRIGGERS = $DM_AUTO->getDirItem('triggers')->makePath(); $DI_AUTO_TRIGGERS_SQL = $DM_AUTO->getDirItem(null, 'triggers', 'sql')->getSqlFileBuilder(); $triggerPattern = $SDK->getDirItem('sysobjects/patterns', 'ta_iud_pattern.sql')->getFileContents(); //BUILDIAN AND ADDING TRIGGERS foreach (PsTriggersAware::getTriggeredTables($scope) as $table) { foreach (PsTriggersAware::getActions() as $action) { $actions = PsTriggersAware::getTriggerActions($table, $scope, $action); if (empty($actions)) { continue; //--- } $name = 'ta' . strtolower(first_char($action)) . '_' . $table; $trigger = str_replace('<%NAME%>', $name, $triggerPattern); $trigger = str_replace('<%TABLE%>', $table, $trigger); $trigger = str_replace('<%ACTION%>', $action, $trigger); $trigger = str_replace('<%CALL%>', implode("\n", $actions), $trigger); dolog("+ {$name}"); foreach ($actions as $_action) { dolog($_action); } $DI_AUTO_TRIGGERS_SQL->appendFile($DM_AUTO_TRIGGERS->getDirItem(null, $name, 'sql')->putToFile($trigger)); } } //Все автоматически сгенерированные триггеры положим в отдельный файл $DI_AUTO_TRIGGERS_SQL->save(); $autoTriggers = DirManager::inst($DM_AUTO_TRIGGERS->getAbsPath())->getDirContent(null, PsConst::EXT_SQL); dolog('Triggers made: {}', count($autoTriggers)); /* * objects.sql */ $OBJECTS_SQL = $DM_AUTO->getDirItem(null, 'objects.sql')->getSqlFileBuilder(); /* * Добавляем автосгенерированные триггеры */ LOGBOX('Processing objects.sql'); if (empty($autoTriggers)) { dolog('No auto triggers'); } else { dolog('Adding {} auto triggers', count($autoTriggers)); $OBJECTS_SQL->appendMlComment('AUTO TRIGGERS SECTION'); /* @var $triggerDi DirItem */ foreach ($autoTriggers as $triggerDi) { dolog('+ {}', $triggerDi->getName()); $OBJECTS_SQL->appendFile($triggerDi); } } /* * Получаем строки с включениями */ $ALL = $DM_SYSOBJECTS->getDirItem(null, 'all.txt')->getFileLines(false); if (empty($ALL)) { dolog('No includes'); } else { dolog('Adding {} includes from all.txt', count($ALL)); $OBJECTS_SQL->appendMlComment('INCLUDES SECTION'); foreach ($ALL as $include) { dolog('+ {}', $include); $OBJECTS_SQL->appendFile($DM_SYSOBJECTS->getDirItem($include)); } } $OBJECTS_SQL->save(); /* * Создаём скрипты инициализации для схем */ foreach (PsConnectionParams::getDefaultConnectionNames() as $connection) { if (PsConnectionParams::has($connection, $scope)) { $props = PsConnectionParams::get($connection, $scope); $database = $props->database(); if (empty($database)) { continue; //Не задана БД - пропускаем (для root) } LOGBOX('Making schema script for {}', $props); $SCHEMA_SQL = $DM_AUTO->getDirItem('schemas', $database, 'sql')->makePath()->getSqlFileBuilder(); //DROP+USE $SCHEMA_SQL->clean(); $SCHEMA_SQL->appendLine("DROP DATABASE IF EXISTS {$database};"); $SCHEMA_SQL->appendLine("CREATE DATABASE {$database} CHARACTER SET utf8 COLLATE utf8_general_ci;"); $SCHEMA_SQL->appendLine("USE {$database};"); if ($scope == ENTITY_SCOPE_PROJ) { dolog('+ SDK PART'); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('>>> SDK'); //CREATE CHEMA SCRIPT $SCHEMA_SQL->appendFile($SDK->getDirItem(null, 'schema.sql')); //OBJECTS SCRIPT $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/auto', 'objects.sql')); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('<<< SDK'); } //CREATE CHEMA SCRIPT $SCHEMA_SQL->appendFile($SCHEMA); //OBJECTS SCRIPT $SCHEMA_SQL->appendFile($OBJECTS_SQL->getDi()); //CREATE USER $grant = "grant all on {}.* to '{}'@'{}' identified by '{}';"; $SCHEMA_SQL->appendMlComment('Grants'); $SCHEMA_SQL->appendLine(PsStrings::replaceWithBraced($grant, $database, $props->user(), $props->host(), $props->password())); /* * Мы должны создать тестовую схему, чтобы убедиться, что всё хорошо и сконфигурировать db.ini */ if ($connection == PsConnectionParams::CONN_TEST) { dolog('Making physical schema {}', $props); $rootProps = PsConnectionParams::get(PsConnectionParams::CONN_ROOT); dolog('Root connection props: {}', $rootProps); $rootProps->execureShell($SCHEMA_SQL->getDi()); dolog('Connecting to [{}]', $props); PsConnectionPool::configure($props); $tables = PsTable::all(); /* * Нам нужно определить новый список таблиц SDK, чтобы по ним * провести валидацию новых db.ini. * * Если мы обрабатываем проект, то SDK-шный db.ini уже готов и * можем положиться на него. Если мы подготавливаем SDK-шный db.ini, * но новый список таблиц возмём из развёрнутой тестовой БД. */ $sdkTableNames = $scope == ENTITY_SCOPE_SDK ? array_keys($tables) : DbIni::getSdkTables(); if ($scope == ENTITY_SCOPE_PROJ) { //Уберём из всех таблиц - SDK`шные array_remove_keys($tables, $sdkTableNames); } $scopeTableNames = array_keys($tables); sort($scopeTableNames); /* * Составим список таблиц. * Он нам особенно не нужен, но всёже будем его формировать для наглядности - какие таблицы добавились. */ $tablesDi = $DM_AUTO->getDirItem(null, 'tables.txt')->putToFile(implode("\n", $scopeTableNames)); dolog('Tables: {} saved to {}', print_r($scopeTableNames, true), $tablesDi->getAbsPath()); /* * Загружаем полный список таблиц схемы и на основе имеющихся db.ini файлов строим новые, добавляя/удаляя * таблицы, добавленные/удалённые из схемы. */ $dbIniProps = PsDbIniHelper::makeDbIniForSchema($scope, $tables); dolog('db.ini props: {}', print_r($dbIniProps, true)); $dbIniErrors = PsDbIniHelper::validateAndSaveDbIniTableProps($scope, $dbIniProps, $sdkTableNames); if ($dbIniErrors) { PsUtil::raise('db.ini errors for {}: {}', $scope, print_r($dbIniErrors, true)); } /* * Для проекта выгружаем данные, хранящиеся в файлах */ if ($scope == ENTITY_SCOPE_PROJ) { dolog('Exporting tables data from files'); $DM_AUTO->getDirItem('data')->makePath(); $AUTO_DATA_SQL = $DI_AUTO_DATA->touch()->getSqlFileBuilder(); //Пробегаемся по таблицам foreach (DbIni::getTables() as $tableName) { $table = PsTable::inst($tableName); if ($table->isFilesync()) { $fileData = $table->exportFileAsInsertsSql(); if ($fileData) { dolog(' + {}', $tableName); $AUTO_DATA_SQL->appendFile($DM_AUTO->getDirItem('data', $tableName, 'sql')->putToFile($fileData)); } else { dolog(' - {}', $tableName); } } } $AUTO_DATA_SQL->save(); /* * Вставим данные в тестовую схему */ dolog('Inserting data to test schema.'); $props->execureShell($DI_AUTO_DATA); } /* * Теперь ещё создадим тестовые объекты. * Мы уверены, что для SDK тестовая часть есть всегда. */ $TEST_SCHEMA_SQL = $DM_AUTO->getDirItem('test', 'schema', 'sql')->makePath()->getSqlFileBuilder(); if ($scope == ENTITY_SCOPE_PROJ) { dolog('+ SDK TEST PART'); //Добавим секцию в лог $TEST_SCHEMA_SQL->appendMlComment('>>> SDK'); //CREATE CHEMA SCRIPT $TEST_SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/auto/test', 'schema.sql')); //Добавим секцию в лог $TEST_SCHEMA_SQL->appendMlComment('<<< SDK'); } $TEST_SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'schema.sql'), false); $TEST_SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'data.sql'), false); $TEST_SCHEMA_SQL->save(); /* * На тестовой схеме прогоняем скрипты с тестовыми данными */ dolog('Making test schema objects.'); $props->execureShell($TEST_SCHEMA_SQL->getDi()); } #end conn== TEST /* * Если были сгенерированы данные из файлов - добавляем их */ if ($DI_AUTO_DATA->isFile() && $DI_AUTO_DATA->getSize() > 0) { dolog('Append data inserts to {}', $SCHEMA_SQL->getDi()->getName()); $SCHEMA_SQL->appendFile($DI_AUTO_DATA); } //SAVE .sql $SCHEMA_SQL->save(); } } } dolog('Database schemas successfully exported'); }
function Show($oView = '') { global $dcl_info, $g_oSec, $g_oSession; commonHeader(); if (!$g_oSec->HasPerm(DCL_ENTITY_WORKORDER, DCL_PERM_SEARCH)) { return PrintPermissionDenied(); } $bView = is_object($oView); $aProtectedFields = array('notes', 'dcl_hotlist.hotlist_tag', 'is_public', 'timecards.actionby', 'timecards.summary'); $objJS = CreateObject('dcl.jsAttributesets'); $objJS->bModules = true; $objJS->bStatusTypes = true; $objJS->bDepartments = !$g_oSec->IsPublicUser(); $objJS->DisplayAttributeScript(); $objPersonnel = CreateObject('dcl.htmlPersonnel'); $objDepartment = CreateObject('dcl.htmlDepartments'); $objProducts = CreateObject('dcl.htmlProducts'); $objPriorities = CreateObject('dcl.htmlPriorities'); $objSeverities = CreateObject('dcl.htmlSeverities'); $objStatuses = CreateObject('dcl.htmlStatuses'); $objProjects = CreateObject('dcl.htmlProjects'); $objModules = CreateObject('dcl.htmlProductModules'); $objType = CreateObject('dcl.htmlWorkOrderType'); $oDBP = CreateObject('dcl.dbPersonnel'); $oDBP->Load($GLOBALS['DCLID']); $t =& CreateSmarty(); if ($bView) { $t->assign('VAL_REPORTTITLE', $oView->title); } else { $t->assign('VAL_REPORTTITLE', ''); } $t->assign('VAL_DEPARTMENT', $oDBP->department); $t->assign('VAL_ID', $GLOBALS['DCLID']); $aDefault = array(); $aDefault['product'] = array(); $aDefault['priority'] = array(); $aDefault['severity'] = array(); $aDefault['dcl_wo_account.account_id'] = array(); $aDefault['status'] = array(); $aDefault['project'] = array(); $aDefault['wo_type_id'] = array(); $aDefault['statuses.dcl_status_type'] = array(); $aDefault['department'] = array(); $aDefault['personnel'] = array(); $aDefault['is_public'] = array(); $aDefault['entity_source_id'] = array(); $aDefault['module_id'] = array(); $sPersonnelKey = ''; $sStatusKey = ''; $sModuleKey = ''; if ($bView) { foreach ($oView->filter as $field => $values) { if (substr($field, 1) == '.department') { if ($field[0] == 'a') { $t->assign('CHK_RESPONSIBLE', ' checked'); } else { if ($field[0] == 'b') { $t->assign('CHK_CREATEBY', ' checked'); } else { if ($field[0] == 'c') { $t->assign('CHK_CLOSEDBY', ' checked'); } } } $field = 'department'; $sPersonnelKey = ''; } else { if ($field == 'responsible' || $field == 'createby' || $field == 'closedby') { $t->assign('CHK_' . strtoupper($field), ' checked'); $field = 'personnel'; $sPersonnelKey = ''; } else { if ($field == 'account') { $field = 'dcl_wo_account.account_id'; } else { if ($field == 'dcl_projects.projectid') { $field = 'project'; } } } } if (array_key_exists($field, $aDefault)) { $aDefault[$field] = $values; } } if (isset($aDefault['personnel']) && is_array($aDefault['personnel']) && count($aDefault['personnel']) > 0) { $sPersonnel = implode(',', $aDefault['personnel']); $oDBP->Query("select department, id from personnel where id in ({$sPersonnel})"); while ($oDBP->next_record()) { if (!in_array($oDBP->f(0), $aDefault['department'])) { $aDefault['department'][] = $oDBP->f(0); } if ($sPersonnelKey != '') { $sPersonnelKey .= ':'; } $sPersonnelKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1)); } } if (isset($aDefault['status']) && is_array($aDefault['status']) && count($aDefault['status']) > 0) { $sStatus = implode(',', $aDefault['status']); $oDBP->Query("select dcl_status_type, id from statuses where id in ({$sStatus})"); while ($oDBP->next_record()) { if (!in_array($oDBP->f(0), $aDefault['statuses.dcl_status_type'])) { $aDefault['statuses.dcl_status_type'][] = $oDBP->f(0); } if ($sStatusKey != '') { $sStatusKey .= ':'; } $sStatusKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1)); } } if (isset($aDefault['module_id']) && is_array($aDefault['module_id']) && count($aDefault['module_id']) > 0) { $sModule = implode(',', $aDefault['module_id']); $oDBP->Query("select product_id, product_module_id from dcl_product_module where product_module_id in ({$sModule})"); while ($oDBP->next_record()) { if (!in_array($oDBP->f(0), $aDefault['product'])) { $aDefault['product'][] = $oDBP->f(0); } if ($sModuleKey != '') { $sModuleKey .= ':'; } $sModuleKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1)); } } } else { $aDefault['product'] = 0; $aDefault['priority'] = 0; $aDefault['severity'] = 0; $aDefault['dcl_wo_account.account_id'] = 0; $aDefault['status'] = 0; $aDefault['project'] = 0; $aDefault['wo_type_id'] = 0; $aDefault['entity_source_id'] = 0; $aDefault['is_public'] = 0; $aDefault['statuses.dcl_status_type'] = 1; $aDefault['department'] = array($oDBP->department); $aDefault['personnel'] = $GLOBALS['DCLID']; $sPersonnelKey = sprintf('%d,%d', $oDBP->department, $GLOBALS['DCLID']); $sStatusKey = ''; $sModuleKey = ''; if ($GLOBALS['g_oSec']->HasPerm(DCL_ENTITY_WORKORDER, DCL_PERM_ACTION)) { $t->assign('CHK_RESPONSIBLE', ' checked'); $t->assign('CHK_CREATEBY', ''); $t->assign('CHK_CLOSEDBY', ''); } else { $t->assign('CHK_CREATEBY', ' checked'); $t->assign('CHK_RESPONSIBLE', ''); $t->assign('CHK_CLOSEDBY', ''); } } $t->assign('VAL_DEPARTMENTS', $aDefault['department']); $t->assign('VAL_PERSONNEL', $aDefault['personnel']); $t->assign('VAL_WO_TYPE', $aDefault['wo_type_id']); $t->assign('VAL_PRODUCT', $aDefault['product']); $t->assign('VAL_MODULE', $aDefault['module_id']); $t->assign('VAL_PRIORITY', $aDefault['priority']); $t->assign('VAL_SEVERITY', $aDefault['severity']); $t->assign('VAL_SELECTPERSONNELKEY', $sPersonnelKey); $t->assign('VAL_SELECTSTATUSKEY', $sStatusKey); $t->assign('VAL_SELECTMODULEKEY', $sModuleKey); $t->assign('CMB_STATUSES', $objStatuses->GetCombo($aDefault['status'], 'status', 'name', 8)); $t->assign('IS_PUBLIC', $g_oSec->IsPublicUser()); if (!$g_oSec->IsPublicUser()) { $t->assign('CMB_PROJECTS', $objProjects->GetCombo($aDefault['project'], 'project', 'name', 8)); $t->assign('CMB_PUBLIC', GetYesNoCombo($aDefault['is_public'], 'is_public', 2, false)); } $oSelect =& CreateObject('dcl.htmlSelect'); if ($g_oSec->IsOrgUser()) { $oSelect->SetOptionsFromDb('dcl_org', 'org_id', 'name', 'org_id IN (' . $g_oSession->Value('member_of_orgs') . ')', 'name'); } else { $oSelect->SetOptionsFromDb('dcl_org', 'org_id', 'name', '', 'name'); } $oSelect->iSize = 8; $oSelect->vDefault = $aDefault['dcl_wo_account.account_id']; $oSelect->sName = 'account'; $t->assign('CMB_ACCOUNTS', $oSelect->GetHTML()); $oSource = CreateObject('dcl.htmlEntitySource'); $t->assign('CMB_SOURCE', $oSource->GetCombo($aDefault['entity_source_id'], 'entity_source_id', 8, false)); // Empty status is for selecting status type, then filtering status if desired $oSelect->sName = 'status'; $oSelect->iSize = 8; $t->assign('CMB_STATUSESEMPTY', $oSelect->GetHTML()); // Status Types $oSelect->sName = 'dcl_status_type'; $oSelect->iSize = 8; $oSelect->vDefault = $aDefault['statuses.dcl_status_type']; $oSelect->SetOptionsFromDb('dcl_status_type', 'dcl_status_type_id', 'dcl_status_type_name', '', 'dcl_status_type_id'); $t->assign('CMB_STATUSTYPES', $oSelect->GetHTML()); $t->assign('CHK_SUMMARY', ''); $t->assign('CHK_NOTES', ''); $t->assign('CHK_DESCRIPTION', ''); $t->assign('VAL_SEARCHTEXT', ''); if ($bView && count($oView->filterlike) > 0) { $searchText = ''; foreach ($oView->filterlike as $field => $values) { if ($field == 'summary' || $field == 'notes' || $field == 'description') { $t->assign('CHK_' . strtoupper($field), ' CHECKED'); $searchText = $values[0]; } } $t->assign('VAL_SEARCHTEXT', $searchText); } if (isset($oView->filter['dcl_tag.tag_desc']) && is_array($oView->filter['dcl_tag.tag_desc']) && count($oView->filter['dcl_tag.tag_desc']) > 0) { $t->assign('VAL_TAGS', join(',', $oView->filter['dcl_tag.tag_desc'])); } if (isset($oView->filter['dcl_hotlist.hotlist_tag']) && is_array($oView->filter['dcl_hotlist.hotlist_tag']) && count($oView->filter['dcl_hotlist.hotlist_tag']) > 0) { $t->assign('VAL_HOTLISTS', join(',', $oView->filter['dcl_hotlist.hotlist_tag'])); } $aDateChecks = array('createdon', 'closedon', 'statuson', 'lastactionon', 'deadlineon', 'eststarton', 'estendon', 'starton'); for ($i = 0; $i < count($aDateChecks); $i++) { $t->assign('CHK_' . strtoupper($aDateChecks[$i]), ''); } if ($bView) { $t->assign('VAL_DATEFROM', ''); $t->assign('VAL_DATETO', ''); if (count($oView->filterdate) > 0) { $fromDate = ''; $toDate = ''; foreach ($oView->filterdate as $field => $values) { $t->assign('CHK_' . strtoupper($field), ' CHECKED'); $fromDate = $values[0]; $toDate = $values[1]; } $t->assign('VAL_DATEFROM', $fromDate); $t->assign('VAL_DATETO', $toDate); } } else { $aFewDaysAgo = mktime(0, 0, 0, date('m'), date('d') - 3, date('Y')); $t->assign('VAL_DATEFROM', date($dcl_info['DCL_DATE_FORMAT'], $aFewDaysAgo)); $t->assign('VAL_DATETO', date($dcl_info['DCL_DATE_FORMAT'])); } $aCols = array('jcn' => STR_WO_JCN, 'seq' => STR_WO_SEQ, 'dcl_wo_type.type_name' => STR_WO_TYPE, 'responsible.short' => STR_WO_RESPONSIBLE, 'products.name' => STR_WO_PRODUCT, 'statuses.name' => STR_WO_STATUS, 'summary' => STR_WO_SUMMARY, 'dcl_product_module.module_name' => STR_CMMN_MODULE, 'dcl_projects.name' => STR_WO_PROJECT, 'dcl_org.name' => STR_WO_ACCOUNT, 'count(*):dcl_org' => '# ' . STR_WO_ACCOUNT, 'dcl_tag.tag_desc' => STR_CMMN_TAGS, 'dcl_hotlist.hotlist_tag' => 'Hotlists', 'createby.short' => STR_WO_OPENBY, 'createdon' => STR_WO_OPENEDON, 'closedby.short' => STR_WO_CLOSEBY, 'closedon' => STR_WO_CLOSEDON, 'statuson' => STR_WO_STATUSON, 'lastactionon' => STR_WO_LASTACTION, 'deadlineon' => STR_WO_DEADLINE, 'eststarton' => STR_WO_ESTSTART, 'estendon' => STR_WO_ESTEND, 'starton' => STR_WO_START, 'esthours' => STR_WO_ESTHOURS, 'etchours' => STR_WO_ETCHOURS, 'totalhours' => STR_WO_ACTHOURS, 'priorities.name' => STR_WO_PRIORITY, 'severities.name' => STR_WO_SEVERITY, 'reported_version_id.product_version_text' => STR_WO_REVISION, 'targeted_version_id.product_version_text' => 'Target Version', 'fixed_version_id.product_version_text' => 'Fixed Version', 'dcl_contact.last_name' => 'Contact Last Name', 'dcl_contact.first_name' => 'Contact First Name', 'dcl_contact_phone.phone_number' => STR_WO_CONTACTPHONE, 'notes' => STR_WO_NOTES, 'description' => STR_WO_DESCRIPTION, 'dcl_status_type.dcl_status_type_name' => STR_CMMN_STATUSTYPE, 'dcl_entity_source.entity_source_name' => STR_CMMN_SOURCE, 'is_public' => STR_CMMN_PUBLIC, 'actionby.short' => 'Last Time Card By', 'timecards.summary' => 'Last Time Card Summary'); if ($g_oSec->IsPublicUser()) { foreach ($aProtectedFields as $sField) { unset($aCols[$sField]); } } if ($bView) { $aShow = array(); $aGroup = array(); foreach ($oView->columns as $colName) { if ($colName == 'a.short') { $colName = 'responsible.short'; } else { if ($colName == 'b.short') { $colName = 'closedby.short'; } else { if ($colName == 'c.short') { $colName = 'createby.short'; } else { if ($colName == 'g.short') { $colName = 'actionby.short'; } } } } $aShow[$colName] = $aCols[$colName]; } foreach ($oView->groups as $colName) { if ($colName == 'a.short') { $colName = 'responsible.short'; } else { if ($colName == 'b.short') { $colName = 'closedby.short'; } else { if ($colName == 'c.short') { $colName = 'createby.short'; } else { if ($colName == 'g.short') { $colName = 'actionby.short'; } } } } $aGroup[$colName] = $aCols[$colName]; } if ($g_oSec->IsPublicUser()) { foreach ($aProtectedFields as $sField) { if (isset($aShow[$sField])) { unset($aShow[$sField]); } if (isset($aGroup[$sField])) { unset($aGroup[$sField]); } } } } else { $aShow = array('jcn' => STR_WO_JCN, 'seq' => STR_WO_SEQ, 'dcl_wo_type.type_name' => STR_WO_TYPE, 'responsible.short' => STR_WO_RESPONSIBLE, 'products.name' => STR_WO_PRODUCT, 'statuses.name' => STR_WO_STATUS, 'summary' => STR_WO_SUMMARY); $aGroup = array(); } array_remove_keys($aCols, $aShow); array_remove_keys($aCols, $aGroup); $t->assign('VAL_COLS', $aCols); $t->assign('VAL_SHOW', $aShow); $t->assign('VAL_GROUP', $aGroup); if ($bView) { $aOrder = array(); foreach ($oView->order as $val) { if ($val == 'priorities.weight') { $sText = isset($aShow['priorities.name']) ? $aShow['priorities.name'] : $aCols['priorities.name']; } else { if ($val == 'severities.weight') { $sText = isset($aShow['severities.name']) ? $aShow['severities.name'] : $aCols['severities.name']; } else { if (isset($aShow[$val])) { $sText = $aShow[$val]; } else { if (isset($aCols[$val])) { $sText = $aCols[$val]; } } } } array_push($aOrder, array($val => $sText)); } $t->assign('VAL_SORT'); } SmartyDisplay($t, 'htmlWorkOrderSearch.tpl'); }
/** * Процесс строит скрипты разворачивания БД * * @param array $argv */ function executeProcess(array $argv) { /* * СОЗДАЁМ SQL * * Нам нужны настройки таблиц, которые неоткуда взять, кроме как из базы, поэтому для экспорта данных нужна БД. */ $DB = DirManager::inst(__DIR__ . '/temp'); $SDK = DirManager::inst(__DIR__ . '/temp/ps-sdk'); //Почистим файлы, которые нам не интересны $cleanExt = array(PsConst::EXT_TXT, PsConst::EXT_SQL); dolog('Clearing not {} files from temp dir', array_to_string($cleanExt)); /* @var $item DirItem */ foreach ($DB->getDirContentFull(null, DirItemFilter::FILES) as $item) { if (!$item->checkExtension($cleanExt)) { dolog('[-] {}', $item->remove()->getRelPath()); } } //Пробежимся по скоупам и выполним обработку /* @var $DIR DirManager */ foreach (array(ENTITY_SCOPE_SDK => $SDK, ENTITY_SCOPE_PROJ => $DB) as $scope => $DM) { dolog(); dolog('***************************** SCOPE [{}] *****************************', $scope); dolog('Working directory: [{}]', $DM->absDirPath()); $SCHEMA = $DM->getDirItem(null, 'schema', PsConst::EXT_SQL); if (!$SCHEMA->isFile()) { dolog('schema.sql is not exists, skipping'); continue; //--- } //Директория с системными объектами $DM_SYSOBJECTS = DirManager::inst($DM->absDirPath(), 'sysobjects'); //Директория, в которой будет содержимое для автосгенерированных файлов $DM_BUILD = DirManager::inst($DM->absDirPath(), 'build')->clearDir(); //Создадим ссылку на файл с объектами $DM_BUILD_ALL_SQL = $DM_BUILD->getDirItem(null, 'all', PsConst::EXT_SQL)->getSqlFileBuilder(); //Строим objects.sql dolog('Processing all.sql'); /* * Получаем строки с включениями в objects.sql */ $ALL_LINES = $DM_SYSOBJECTS->getDirItem(null, 'all', PsConst::EXT_TXT)->getFileLines(false); if (empty($ALL_LINES)) { dolog('No includes'); } else { dolog('Adding {} includes from all.txt', count($ALL_LINES)); foreach ($ALL_LINES as $include) { dolog('+ {}', $include); $DM_BUILD_ALL_SQL->appendFile($DM_SYSOBJECTS->getDirItem($include)); } } // << Сохраняем objects.sql $DM_BUILD_ALL_SQL->save(); /* * Создаём скрипты инициализации для схем */ dolog('Processing default connection names: {}', array_to_string(array_values(PsConnectionParams::getDefaultConnectionNames()))); foreach (PsConnectionParams::getDefaultConnectionNames() as $connection) { //На момент обработки скоупа мы не должны быть подключены никуда PsConnectionPool::assertDisconnectied(); //Для данного скоупа не задан коннект? Пропускаем... if (PsConnectionParams::CONN_ROOT == $connection) { dolog('Skip {}', $connection); continue; //--- } if (!PsConnectionParams::has($connection, $scope)) { dolog('No connection properties for {}', $connection); continue; //--- } //Поработаем с настройками $props = PsConnectionParams::get($connection, $scope); $database = $props->database(); if (empty($database)) { continue; //Не задана БД - пропускаем (для root) } dolog('Making schema script for {}', $props); $SCHEMA_DI = $DM_BUILD->getDirItem('schemas', $database, PsConst::EXT_SQL)->makePath(); check_condition(!$SCHEMA_DI->isFile(), 'Schema file for database "{}" is already exists. Dublicate database names?', $database); $SCHEMA_SQL = $SCHEMA_DI->getSqlFileBuilder(); //DROP+USE $SCHEMA_SQL->clean(); $SCHEMA_SQL->appendLine("DROP DATABASE IF EXISTS {$database};"); $SCHEMA_SQL->appendLine("CREATE DATABASE {$database} CHARACTER SET utf8 COLLATE utf8_general_ci;"); $SCHEMA_SQL->appendLine("USE {$database};"); //CREATE USER $grant = "grant all on {}.* to '{}'@'{}' identified by '{}';"; $SCHEMA_SQL->appendMlComment('Create user with grants'); $SCHEMA_SQL->appendLine(PsStrings::replaceWithBraced($grant, $database, $props->user(), $props->host(), $props->password())); if ($scope == ENTITY_SCOPE_PROJ) { dolog('+ SDK PART'); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('>>> SDK'); //CREATE CHEMA SCRIPT $SCHEMA_SQL->appendFile($SDK->getDirItem(null, 'schema', PsConst::EXT_SQL)); //OBJECTS SCRIPT $SCHEMA_SQL->appendFile($SDK->getDirItem('build', 'all', PsConst::EXT_SQL)); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('<<< SDK'); } //CREATE CHEMA SCRIPT $SCHEMA_SQL->appendFile($SCHEMA); //OBJECTS SCRIPT $SCHEMA_SQL->appendFile($DM_BUILD_ALL_SQL->getDi()); /* * Мы должны создать тестовую схему, чтобы убедиться, что всё хорошо и сконфигурировать db.ini */ if ($connection != PsConnectionParams::CONN_TEST) { //Всё, сохраняем скрипт, работа закончена $SCHEMA_SQL->save(); continue; //--- } /* * На тестовой схеме прогоняем скрипт */ dolog('Making physical schema {}', $props); $rootProps = PsConnectionParams::get(PsConnectionParams::CONN_ROOT); dolog('Root connection props: {}', $rootProps); $rootProps->execureShell($SCHEMA_SQL->getDi()); dolog('Connecting to [{}]', $props); PsConnectionPool::configure($props); $tables = PsTable::all(); /* * Нам нужно определить новый список таблиц SDK, чтобы по ним * провести валидацию новых db.ini. * * Если мы обрабатываем проект, то SDK-шный db.ini уже готов и * можем положиться на него. Если мы подготавливаем SDK-шный db.ini, * но новый список таблиц возмём из развёрнутой тестовой БД. */ $sdkTableNames = $scope == ENTITY_SCOPE_SDK ? array_keys($tables) : $SDK->getDirItem('build', 'tables', PsConst::EXT_TXT)->getFileLines(); if ($scope == ENTITY_SCOPE_PROJ) { //Уберём из всех таблиц - SDK`шные array_remove_keys($tables, $sdkTableNames); } $scopeTableNames = array_keys($tables); sort($scopeTableNames); /* * Составим список таблиц. * Он нам особенно не нужен, но всёже будем его формировать для наглядности - какие таблицы добавились. */ $TABLES_DI = $DM_BUILD->getDirItem(null, 'tables', PsConst::EXT_TXT)->touch()->putToFile(implode("\n", $scopeTableNames)); dolog('Tables saved to {}: {}', $TABLES_DI->getRelPath(), print_r($scopeTableNames, true)); /* * Выгрузим данные из таблиц в файл, чтобы убедиться, что всё корректно вставилось. */ if ($scopeTableNames) { dolog("Exporting '{}' schema tables data to file", $database); $DATA_DI_SQL = $DM_BUILD->getDirItem(null, 'data', PsConst::EXT_SQL)->getSqlFileBuilder(); $DATA_DI_SQL->clean(); //Пробегаемся по таблицам foreach ($scopeTableNames as $tableName) { $fileData = PsTable::inst($tableName)->exportAsSqlString(); if ($fileData) { dolog(' + {} [not empty]', $tableName); $DATA_DI_SQL->appendMlComment('+ table ' . $tableName); $DATA_DI_SQL->appendLine($fileData); } else { dolog(' - {} [empty]', $tableName); } } $DATA_DI_SQL->save(); } /* * Теперь ещё создадим тестовые объекты. * Для каждого скоупа свои тестовые данные, так что таблицы можно называть одинаково. */ dolog('Add test part'); $SCHEMA_SQL->appendMlComment('Test part'); /* if ($scope == ENTITY_SCOPE_PROJ) { dolog('+ SDK TEST PART'); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('>>> SDK TEST PART'); //CREATE CHEMA SCRIPT $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/test', 'schema', PsConst::EXT_SQL)); //ADD TEST DATA $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/test', 'data', PsConst::EXT_SQL)); //Добавим секцию в лог $SCHEMA_SQL->appendMlComment('<<< SDK TEST PART'); } */ $SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'schema', PsConst::EXT_SQL), false); $SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'data', PsConst::EXT_SQL), false); $SCHEMA_SQL->save(); #end conn== TEST /* * Всё, сохраняем финальный скрипт */ //SAVE .sql $SCHEMA_SQL->save(); //Переразвернём тестовую схему с тестовыми таблицами dolog("Rebuilding checma '{}'", $database); $rootProps->execureShell($SCHEMA_SQL->getDi()); //Отключимся от схемы PsConnectionPool::disconnect(); } } dolog('Database schemas successfully exported'); }
function Show($oView = '') { global $dcl_info, $g_oSec, $g_oSession; commonHeader(); $bView = is_object($oView); $objJS =& CreateObject('dcl.jsAttributesets'); $objJS->bModules = true; $objJS->bStatusTypes = true; $objJS->bDepartments = !$g_oSec->IsPublicUser(); $objJS->DisplayAttributeScript(); $oSelect =& CreateObject('dcl.htmlSelect'); $objPersonnel =& CreateObject('dcl.htmlPersonnel'); $objProducts =& CreateObject('dcl.htmlProducts'); $objPriorities =& CreateObject('dcl.htmlPriorities'); $objSeverities =& CreateObject('dcl.htmlSeverities'); $objStatuses =& CreateObject('dcl.htmlStatuses'); $objDepartment =& CreateObject('dcl.htmlDepartments'); $objModules =& CreateObject('dcl.htmlProductModules'); $oDBP =& CreateObject('dcl.dbPersonnel'); $oDBP->Load($GLOBALS['DCLID']); $t =& CreateSmarty(); if ($bView) { $t->assign('VAL_REPORTTITLE', $oView->title); } else { $t->assign('VAL_REPORTTITLE', ''); } $t->assign('VAL_DEPARTMENT', $oDBP->department); $t->assign('VAL_ID', $GLOBALS['DCLID']); $aDefault = array(); $aDefault['product'] = array(); $aDefault['module_id'] = array(); $aDefault['priority'] = array(); $aDefault['type'] = array(); $aDefault['account'] = array(); $aDefault['status'] = array(); $aDefault['statuses.dcl_status_type'] = array(); $aDefault['department'] = array(); $aDefault['personnel'] = array(); $aDefault['entity_source_id'] = array(); $aDefault['is_public'] = array(); $sPersonnelKey = ''; $sStatusKey = ''; $sModuleKey = ''; if ($bView) { reset($oView->filter); while (list($field, $values) = each($oView->filter)) { if (substr($field, 1) == '.department') { if ($field[0] == 'a') { $t->assign('CHK_RESPONSIBLE', ' checked'); } else { if ($field[0] == 'b') { $t->assign('CHK_CREATEDBY', ' checked'); } else { if ($field[0] == 'c') { $t->assign('CHK_CLOSEDBY', ' checked'); } } } $field = 'department'; $sPersonnelKey = ''; } else { if ($field == 'responsible' || $field == 'createdby' || $field == 'closedby') { $t->assign('CHK_' . strtoupper($field), ' checked'); $field = 'personnel'; $sPersonnelKey = ''; } } if (array_key_exists($field, $aDefault)) { $aDefault[$field] = $values; } } if (is_array($aDefault['personnel']) && count($aDefault['personnel']) > 0) { $sPersonnel = implode(',', $aDefault['personnel']); $oDBP->Query("select department, id from personnel where id in ({$sPersonnel})"); while ($oDBP->next_record()) { if (!in_array($oDBP->f(0), $aDefault['department'])) { $aDefault['department'][] = $oDBP->f(0); } if ($sPersonnelKey != '') { $sPersonnelKey .= ':'; } $sPersonnelKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1)); } } if (is_array($aDefault['status']) && count($aDefault['status']) > 0) { $sStatus = implode(',', $aDefault['status']); $oDBP->Query("select dcl_status_type, id from statuses where id in ({$sStatus})"); while ($oDBP->next_record()) { if (!in_array($oDBP->f(0), $aDefault['statuses.dcl_status_type'])) { $aDefault['statuses.dcl_status_type'][] = $oDBP->f(0); } if ($sStatusKey != '') { $sStatusKey .= ':'; } $sStatusKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1)); } } if (is_array($aDefault['module_id']) && count($aDefault['module_id']) > 0) { $sModule = implode(',', $aDefault['module_id']); $oDBP->Query("select product_id, product_module_id from dcl_product_module where product_module_id in ({$sModule})"); while ($oDBP->next_record()) { if (!in_array($oDBP->f(0), $aDefault['product'])) { $aDefault['product'][] = $oDBP->f(0); } if ($sModuleKey != '') { $sModuleKey .= ':'; } $sModuleKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1)); } } } else { $aDefault['product'] = 0; $aDefault['priority'] = 0; $aDefault['type'] = 0; $aDefault['account'] = 0; $aDefault['status'] = 0; $aDefault['project'] = 0; $aDefault['entity_source_id'] = 0; $aDefault['statuses.dcl_status_type'] = 1; $aDefault['department'] = array($oDBP->department); $aDefault['personnel'] = $GLOBALS['DCLID']; $aDefault['is_public'] = ''; $sPersonnelKey = sprintf('%d,%d', $oDBP->department, $GLOBALS['DCLID']); $sStatusKey = ''; $sModuleKey = ''; if ($g_oSec->HasPerm(DCL_ENTITY_TICKET, DCL_PERM_ACTION)) { $t->assign('CHK_RESPONSIBLE', ' checked'); $t->assign('CHK_CREATEBY', ''); $t->assign('CHK_CLOSEDBY', ''); } else { $t->assign('CHK_CREATEBY', ' checked'); $t->assign('CHK_RESPONSIBLE', ''); $t->assign('CHK_CLOSEDBY', ''); } } $t->assign('VAL_DEPARTMENTS', $aDefault['department']); $t->assign('VAL_PERSONNEL', $aDefault['personnel']); $t->assign('VAL_PRODUCT', $aDefault['product']); $t->assign('VAL_MODULE', $aDefault['module_id']); $t->assign('VAL_PRIORITY', $aDefault['priority']); $t->assign('VAL_TYPE', $aDefault['type']); $t->assign('VAL_SELECTPERSONNELKEY', $sPersonnelKey); $t->assign('VAL_SELECTSTATUSKEY', $sStatusKey); $t->assign('VAL_SELECTMODULEKEY', $sModuleKey); $t->assign('CMB_STATUS', $objStatuses->GetCombo($aDefault['status'], 'status', 'name', 8)); $t->assign('IS_PUBLIC', $g_oSec->IsPublicUser()); if (!$g_oSec->IsPublicUser()) { $t->assign('CMB_PUBLIC', GetYesNoCombo($aDefault['is_public'], 'is_public', 3)); } if ($g_oSec->IsOrgUser()) { $oSelect->SetOptionsFromDb('dcl_org', 'org_id', 'name', 'org_id IN (' . $g_oSession->Value('member_of_orgs') . ')', 'name'); } else { $oSelect->SetOptionsFromDb('dcl_org', 'org_id', 'name', '', 'name'); } $oSelect->iSize = 8; $oSelect->vDefault = $aDefault['account']; $oSelect->sName = 'account'; $t->assign('CMB_ACCOUNTS', $oSelect->GetHTML()); $oSource = CreateObject('dcl.htmlEntitySource'); $t->assign('CMB_SOURCE', $oSource->GetCombo($aDefault['entity_source_id'], 'entity_source_id', 8, false)); // Modules only show for selected products $oSelect->aOptions = array(); $oSelect->sName = 'module_id'; $oSelect->iSize = 8; $t->assign('CMB_MODULES', $oSelect->GetHTML()); // Empty status is for selecting status type, then filtering status if desired $oSelect->sName = 'status'; $oSelect->iSize = 8; $t->assign('CMB_STATUSESEMPTY', $oSelect->GetHTML()); // Status Types $oSelect->sName = 'dcl_status_type'; $oSelect->iSize = 8; $oSelect->vDefault = $aDefault['statuses.dcl_status_type']; $oSelect->SetOptionsFromDb('dcl_status_type', 'dcl_status_type_id', 'dcl_status_type_name', '', 'dcl_status_type_id'); $t->assign('CMB_STATUSTYPES', $oSelect->GetHTML()); if ($g_oSec->HasPerm(DCL_ENTITY_TICKET, DCL_PERM_ACTION)) { $t->assign('CHK_SECLVLWO', ' CHECKED'); $t->assign('CHK_NOSECLVLWO', ''); } else { $t->assign('CHK_SECLVLWO', ''); $t->assign('CHK_NOSECLVLWO', ' CHECKED'); } $t->assign('VAL_SEARCHTEXT', ''); if ($bView && count($oView->filterlike) > 0) { $searchText = ''; foreach ($oView->filterlike as $field => $values) { $searchText = $values[0]; } $t->assign('VAL_SEARCHTEXT', $searchText); } if (isset($oView->filter['dcl_tag.tag_desc']) && is_array($oView->filter['dcl_tag.tag_desc']) && count($oView->filter['dcl_tag.tag_desc']) > 0) { $t->assign('VAL_TAGS', join(',', $oView->filter['dcl_tag.tag_desc'])); } $aDateChecks = array('createdon', 'closedon', 'statuson', 'lastactionon'); for ($i = 0; $i < count($aDateChecks); $i++) { $t->assign('CHK_' . strtoupper($aDateChecks[$i]), ''); } if ($bView) { $t->assign('VAL_DATEFROM', ''); $t->assign('VAL_DATETO', ''); if (count($oView->filterdate) > 0) { $fromDate = ''; $toDate = ''; reset($oView->filterdate); while (list($field, $values) = each($oView->filterdate)) { $t->assign('CHK_' . strtoupper($field), ' CHECKED'); $fromDate = $values[0]; $toDate = $values[1]; } $t->assign('VAL_DATEFROM', $fromDate); $t->assign('VAL_DATETO', $toDate); } } else { $aFewDaysAgo = mktime(0, 0, 0, date('m'), date('d') - 3, date('Y')); $t->assign('VAL_DATEFROM', date($dcl_info['DCL_DATE_FORMAT'], $aFewDaysAgo)); $t->assign('VAL_DATETO', date($dcl_info['DCL_DATE_FORMAT'])); } $aCols = array('ticketid' => STR_TCK_TICKET . '#', 'responsible.short' => STR_TCK_RESPONSIBLE, 'products.name' => STR_TCK_PRODUCT, 'dcl_org.name' => STR_TCK_ACCOUNT, 'statuses.name' => STR_TCK_STATUS, 'summary' => STR_TCK_SUMMARY, 'dcl_product_module.module_name' => STR_CMMN_MODULE, 'dcl_tag.tag_desc' => STR_CMMN_TAGS, 'version' => STR_TCK_VERSION, 'createdby.short' => STR_TCK_OPENEDBY, 'createdon' => STR_TCK_OPENEDON, 'closedby.short' => STR_TCK_CLOSEDBY, 'closedon' => STR_TCK_CLOSEDON, 'statuson' => STR_TCK_STATUSON, 'lastactionon' => STR_TCK_LASTACTIONON, 'priorities.name' => STR_TCK_PRIORITY, 'severities.name' => STR_TCK_TYPE, 'dcl_contact.last_name' => 'Contact Last Name', 'dcl_contact.first_name' => 'Contact First Name', 'dcl_contact_phone.phone_number' => STR_TCK_CONTACTPHONE, 'dcl_contact_email.email_addr' => STR_TCK_CONTACTEMAIL, 'issue' => STR_TCK_ISSUE, 'seconds' => STR_TCK_APPROXTIME, 'dcl_status_type.dcl_status_type_name' => STR_CMMN_STATUSTYPE, 'dcl_entity_source.entity_source_name' => 'Source', 'is_public' => 'Public'); if ($bView) { $aShow = array(); $aGroup = array(); foreach ($oView->columns as $colName) { if ($colName == 'a.short') { $colName = 'responsible.short'; } else { if ($colName == 'b.short') { $colName = 'closedby.short'; } else { if ($colName == 'c.short') { $colName = 'createdby.short'; } } } $aShow[$colName] = $aCols[$colName]; } foreach ($oView->groups as $colName) { if ($colName == 'a.short') { $colName = 'responsible.short'; } else { if ($colName == 'b.short') { $colName = 'closedby.short'; } else { if ($colName == 'c.short') { $colName = 'createdby.short'; } } } $aGroup[$colName] = $aCols[$colName]; } } else { $aShow = array('ticketid' => STR_TCK_TICKET . '#', 'responsible.short' => STR_TCK_RESPONSIBLE, 'products.name' => STR_TCK_PRODUCT, 'dcl_org.name' => STR_TCK_ACCOUNT, 'statuses.name' => STR_TCK_STATUS, 'summary' => STR_TCK_SUMMARY); $aGroup = array(); } array_remove_keys($aCols, $aShow); array_remove_keys($aCols, $aGroup); $t->assign('VAL_COLS', $aCols); $t->assign('VAL_SHOW', $aShow); $t->assign('VAL_GROUP', $aGroup); if ($bView) { $aOrder = array(); foreach ($oView->order as $val) { if ($val == 'priorities.weight') { $sText = $aShow['priorities.name']; } else { if ($val == 'severities.weight') { $sText = $aShow['severities.name']; } else { $sText = $aShow[$val]; } } array_push($aOrder, array($val => $sText)); } $t->assign('VAL_SORT'); } SmartyDisplay($t, 'htmlTicketSearch.tpl'); }
/** * Метод формирует сщвуржимое db.ini файла для развёрнутой схемы. * * За основу берутся текущие натсройки db.ini, которые могут быть расширены * или сокращены (если таблица удалена из схемы). * * @param string $scope - тип развёрнутой схемы. * Она может быть развёрнута, как SDK или как проектная. * Считаем, что в схему могли как добавиться новые таблицы, * так и кол-во таблиц в схеме могло быть сокращено. * @return array - настройки таблиц для db.ini */ public static function makeDbIniForSchema($scope, array $dbTables) { /* * Список таблиц SDK можно получить из db.ini, так как если мы работаем по SDK, * то нужно взять старые настройки и порядок таблиц. * Если же мы работаем по проектному скоупу, то db.ini для SDK уже актуален. */ $sdkTableNames = DbIni::getSdkTables(); $settings = array(); switch ($scope) { case ENTITY_SCOPE_SDK: foreach ($sdkTableNames as $tableName) { if (!array_key_exists($tableName, $dbTables)) { //Таблица была исключена из схемы continue; //--- } $table = array_get_value_unset($tableName, $dbTables); $settings[$tableName] = array(); /* @var $property PsTableColumnProps */ foreach (PsTableColumnProps::getAllowedTableProperties($table) as $propName => $property) { $settings[$tableName][$propName] = $table->isProperty($property); } /* @var $property PsTableColumnProps */ foreach (PsTableColumnProps::getAllowedColumnProperties($table) as $propName => $property) { /* @var $col PsTableColumn */ foreach ($table->getColumns() as $colName => $col) { if ($col->isProperty($property)) { $settings[$tableName][$propName][] = $colName; } } } } /* * Добавляем несконфигурированные таблицы */ foreach ($dbTables as $tableName => $table) { $settings[$tableName] = array(); /* @var $property PsTableColumnProps */ foreach (PsTableColumnProps::getAllowedTableProperties($dbTables[$tableName]) as $propName => $property) { $settings[$tableName][$propName] = false; } } break; case ENTITY_SCOPE_PROJ: //Сразу удаляем из списка все таблицы SDK array_remove_keys($dbTables, $sdkTableNames); foreach (DbIni::getProjectTables() as $tableName) { if (!array_key_exists($tableName, $dbTables)) { //Таблица была исключена из схемы или перенесена в SDK continue; //--- } $table = array_get_value_unset($tableName, $dbTables); $settings[$tableName] = array(); /* @var $property PsTableColumnProps */ foreach (PsTableColumnProps::getAllowedTableProperties($table) as $propName => $property) { $settings[$tableName][$propName] = $table->isProperty($property); } /* @var $property PsTableColumnProps */ foreach (PsTableColumnProps::getAllowedColumnProperties($table) as $propName => $property) { /* @var $col PsTableColumn */ foreach ($table->getColumns() as $colName => $col) { if ($col->isProperty($property)) { $settings[$tableName][$propName][] = $colName; } } } } /* * Не добавляем несконфигурированные таблицы, так как для проектных * таблиц мы не требуем полного перечисления в db.ini */ break; default: raise_error("Unknown scope [{$scope}]"); } return $settings; }