_tbl = $tblAcl->getName();
$this->_acl = $tblAcl;
$this->_zasobID = $tblAcl->getID();
$this->_pageSize = 10;
{
UserProfile::load();
$tableAjaxSettings = UserProfile::getTableAjaxSettings();
$this->_pageSize = V::get('pageSize', 10, $tableAjaxSettings, 'int');
}
$this->_pageSizes = array(10, 20, 50, 100);// default page sizes
$this->_filterInit = new stdClass();
$hash = V::get('_hash', '', $_GET);
if ($hash) {
$this->_htmlID = $hash;
$this->_readState();
} else {
$this->_htmlID = $this->generateHtmlID();
$this->_readState();
}
}
public function setSyncUrl($syncUrl) { $this->syncUrl = $syncUrl; }
public function setRootUrl($rootUrl) { $this->rootUrl = $rootUrl; }
private function _hasStateFilterInit() {
return (
array_key_exists($this->_htmlID, $_SESSION['TableAjax_Cache'])
&& array_key_exists('_filterInit', $_SESSION['TableAjax_Cache'][$this->_htmlID])
&& !empty((array)$_SESSION['TableAjax_Cache'][$this->_htmlID]['_filterInit'])
);
}
// TODO: read state from cache by key $this->_htmlID
// TODO: load filters and state: table, edit, add, etc.
// TODO: save this data in Workspace 1, 2, 3, etc.
// TODO: default filters in VIEWTABLE_AJAX
// $tbl->setLabel($zasobObj->OPIS);
// $tbl->setFilterInit($filterInit);
// $tbl->addRowFunction('edit');
// $tbl->addRowFunction('hist');
// $tbl->addRowFunction('files');
// $tbl->addRowFunction('cp');
private function _readState() {
if (!array_key_exists('TableAjax_Cache', $_SESSION)) {
$_SESSION['TableAjax_Cache'] = array();
}
//trigger_error("F." . __FUNCTION__ . " (" . (array_key_exists($this->_htmlID, $_SESSION['TableAjax_Cache'])) . ")", E_USER_NOTICE);
//trigger_error("F." . __FUNCTION__ . " (".basename($_SERVER['SCRIPT_FILENAME'])."::_filterInit: " . json_encode($_SESSION['TableAjax_Cache'][$this->_htmlID]['_filterInit']) . ")", E_USER_NOTICE);
if (array_key_exists($this->_htmlID, $_SESSION['TableAjax_Cache'])) {
foreach ($_SESSION['TableAjax_Cache'][$this->_htmlID] as $k => $v) {
//trigger_error("F." . __FUNCTION__ . " key: ({$k})", E_USER_NOTICE);
switch ($k) {
case '_label':
$this->_label = $v;
break;
case '_filterInit':
// DBG::log([ '$this->_filterInit' => $this->_filterInit ], 'array', "TODO:BUG?:filters");
$this->_filterInit = $v;
break;
// case '_rowFunctions':
// $this->_rowFunctions = $v;
// break;
default:
}
}
}
}
protected function _saveState($key = null) {
if (!array_key_exists('TableAjax_Cache', $_SESSION)) {
$_SESSION['TableAjax_Cache'] = array();
}
if (!array_key_exists($this->_htmlID, $_SESSION['TableAjax_Cache'])) {
$_SESSION['TableAjax_Cache'][$this->_htmlID] = array();
}
if (!$key) {
$_SESSION['TableAjax_Cache'][$this->_htmlID]['_label'] = $this->_label;
$_SESSION['TableAjax_Cache'][$this->_htmlID]['_filterInit'] = $this->_filterInit;
// $_SESSION['TableAjax_Cache'][$this->_htmlID]['_rowFunctions'] = $this->_rowFunctions;
} else if ($key == '_label') {
$_SESSION['TableAjax_Cache'][$this->_htmlID]['_label'] = $this->_label;
} else if ($key == '_filterInit') {
$_SESSION['TableAjax_Cache'][$this->_htmlID]['_filterInit'] = $this->_filterInit;
// } else if ($key == '_rowFunctions') {
// $_SESSION['TableAjax_Cache'][$this->_htmlID]['_rowFunctions'] = $this->_rowFunctions;
}
}
public function setPageSizes($pageSizes) {
$this->_pageSizes = $pageSizes;
}
public function setBackRefFilter($backRefFilter) {
$this->_backRefFilter = $backRefFilter;
}
public function setChildRefFilter($childRefFilter) {
$this->_childRefFilter = $childRefFilter;
}
public function setFilterInit($filterInit) {
// DBG::log([ '$this->_filterInit' => $this->_filterInit, 'hasFiltersInit' => $this->_hasStateFilterInit() ], 'array', "TODO:BUG?:filters - setFilterInit");
if ($this->_hasStateFilterInit()) {
return;
}
$this->_filterInit = (object)$filterInit;
$this->_saveState();
}
/**
* @param array $forceFilterInit
*/
public function setForceFilterInit($forceFilterInit) {
$this->_forceFilterInit = (object)$forceFilterInit;
}
private function setFilters($filterInit) {
$this->_filterInit = (object)$filterInit;
// DBG::log([ '$this->_filterInit' => $this->_filterInit ], 'array', "TODO:BUG?:filters - setFilters");
$this->_saveState();
}
function getFilters() {
return (array)$this->_filterInit;
}
public function setRowFunctions($functions) {
$this->_rowFunctions = [];
$defaultRowFunction = array();
$defaultRowFunction['edit'] = [ 'href'=>'#EDIT/{0}', 'ico'=>'glyphicon glyphicon-pencil', 'title'=>'Edytuj rekord', 'class' => "btn btn-xs btn-link" ];
$defaultRowFunction['hist'] = [ 'href'=>'#HIST/{0}', 'ico'=>'glyphicon glyphicon-book', 'title'=>'Historia', 'class' => "btn btn-xs btn-link" ];
$defaultRowFunction['files'] = [ 'href'=>'#FILES/{0}', 'ico'=>'glyphicon glyphicon-folder-open', 'title'=>'Pliki', 'class' => "btn btn-xs btn-link" ];
$defaultRowFunction['cp'] = [ 'href'=>'#', 'ico'=>'glyphicon glyphicon-plus-sign', 'title'=>'Kopiuj rekord', 'onclick'=>'return tableAjaxCopy({0});', 'class' => "btn btn-xs btn-link" ];
$defaultRowFunction['msgs'] = [ 'href'=>"index.php?_route=TableMsgs&_task=tableRow&idTable={$this->_zasobID}&idRow={0}", 'ico'=>'glyphicon glyphicon-envelope', 'title'=>'Wiadomości', 'class' => "btn btn-xs btn-link" ];
foreach ($functions as $funName => $params) {
if (true === $params) {
if (array_key_exists($funName, $defaultRowFunction)) {
$this->_rowFunctions[$funName] = $defaultRowFunction[$funName];
} else {
throw new Exception("Row function not defined '{$funName}'");
}
}
if (is_array($params)) {
$this->_rowFunctions[$funName] = $params;
}
}
// $this->_saveState('_rowFunctions');
}
public function addRowFunction($funName, $funParams = array()) {
$defaultRowFunction = array();
//$defaultRowFunction['edit'] = '';
//$defaultRowFunction['hist'] = '';
//$defaultRowFunction['files'] = '';
//$defaultRowFunction['cp'] = '';
$defaultRowFunction['edit'] = [ 'href'=>'#EDIT/{0}', 'ui-function' => "editFeature", 'ico'=>'glyphicon glyphicon-pencil', 'title'=>'Edytuj rekord', 'class' => "btn btn-xs btn-link" ];
$defaultRowFunction['hist'] = [ 'href'=>'#HIST/{0}', 'ico'=>'glyphicon glyphicon-book', 'title'=>'Historia', 'class' => "btn btn-xs btn-link" ];
$defaultRowFunction['files'] = [ 'href'=>'#FILES/{0}', 'ico'=>'glyphicon glyphicon-folder-open', 'title'=>'Pliki', 'class' => "btn btn-xs btn-link" ];
$defaultRowFunction['cp'] = [ 'href'=>'#', 'ico'=>'glyphicon glyphicon-plus-sign', 'title'=>'Kopiuj rekord', 'onclick'=>'return tableAjaxCopy({0});', 'class' => "btn btn-xs btn-link" ];
$defaultRowFunction['msgs'] = [ 'href'=>"index.php?_route=TableMsgs&_task=tableRow&idTable={$this->_zasobID}&idRow={0}", 'ico'=>'glyphicon glyphicon-envelope', 'title'=>'Wiadomości', 'class' => "btn btn-xs btn-link" ];
if (array_key_exists($funName, $defaultRowFunction)) {
$this->_rowFunctions[$funName] = $defaultRowFunction[$funName];
}
else {
$this->_rowFunctions[$funName] = $funParams;
}
// $this->_saveState('_rowFunctions');
}
private function _parseRowFunctions($idRecord = null, $pomin = array(), $showLabel = false) {
$rowFunctions = array();
foreach ($this->_rowFunctions as $kFunName => $vParams) {
if (in_array($kFunName, $pomin)) continue;
//$rowFunctionsOut .= str_replace('{0}', $idRecord, $vUrl);
$attrs = array();
// $defaultRowFunction['cp'] = (object)array('href'=>'#', 'ico'=>'glyphicon glyphicon-plus-sign', 'title'=>'Kopiuj rekord', 'onclick'=>'return tableAjaxCopy({0});');
$label = '';
$ico = '';
foreach ($vParams as $kParamName => $v) {
if ($kParamName == 'ico') {
$ico = '';
continue;
}
$attr = $v;
if ($idRecord > 0) {
$attr = str_replace('{0}', $idRecord, $attr);
}
if ($showLabel && $kParamName == 'title') {
$label = $attr;
}
$attr = $kParamName . '="' . $attr . '"';
$attrs[] = $attr;
}
$rowFunctions[$kFunName] = '' . "{$ico} {$label} " . '';
}
return $rowFunctions;
}
private function _showRowFunctions($idRecord = null, $pomin = array(), $showLabel = false) {
$rowFunctionsOut = $this->_parseRowFunctions($idRecord, $pomin, $showLabel);
$rowFunctionsOut = implode('', $rowFunctionsOut);
return $rowFunctionsOut;
}
private function _showRowFunctionsJson($idRecord = null, $pomin = array(), $showLabel = false) {
$rowFunctions = $this->_parseRowFunctions($idRecord, $pomin, $showLabel);
$rowFunctions = (object)$rowFunctions;
return $rowFunctions;
}
public function allowTreeView() {
if ($this->_tbl == 'CRM_LISTA_ZASOBOW') return true;
if ($this->_tbl == 'CRM_PROCES') return true;
return false;
}
public function renderStatic($tblAjaxMap = null) {
static $_rendered = false;
if ($_rendered) return;
if ($tblAjaxMap) $tblAjaxMap->printCSS();
if ($tblAjaxMap) $tblAjaxMap->printJS();
echo UI::h('script', ['src'=>"static/sweetalert2.min.js"]);
echo UI::h('script', ['src'=>"static/jquery.doubleScroll.js"]);
echo UI::h('link', ['rel'=>"stylesheet", 'type'=>"text/css", 'href'=>"static/jquery-ui-smoothness/jquery-ui-1.10.4.custom.min.css"]);
echo UI::h('link', ['rel'=>"stylesheet", 'type'=>"text/css", 'href'=>"static/sweetalert2.min.css"]);
UI::inlineCSS( __FILE__ . '.style.css' );
echo UI::h('script', [ 'src' => "static/vendor.js" ]); // window.p5VendorJs: {React, ReactDOM, createReactClass, Redux}
echo UI::h('script', [ 'src' => "static/p5UI/buildDom.js" ]);
$_rendered = true;
}
public function render() {
$acl = $this->_acl;
$hasGeomFlds = Core_AclHelper::hasGeomFields($acl);
// $tblAjaxMap = ($hasGeomFlds) ? new TableAjaxMap($acl, 512, 400) : null;
$tblAjaxMap = new TableAjaxMap($acl, 512, 400);
$hasPermCreate = Core_AclHelper::hasCreatePerms($acl);
$jsToogleFiltrProcesuFunctionName = 'tableAjaxToggleFiltrProcesInit';
$jsToogleTableToolsFunctionName = 'tableAjaxToggleTableTools';
ob_start();
$this->renderStatic($tblAjaxMap);
UI::startContainer();
UI::showMessagesForTable($this->_tbl);
UI::endContainer();
$namespace = $acl->getNamespace();
{
$nsSiblings = ACL::getNamespaceSiblings($namespace);
$siblingSelected = $namespace;
$baseUrl = Router::getRoute('ViewTableAjax')->getLink();
}
echo UI::h('div', [ 'class' => "AjaxTableCont" ], [
UI::h('div', [ 'class' => "AjaxTable--header" ], [ // breadcrumb
UI::h('div', [ 'class' => "pull-left", 'style' => "margin-right:12px" ], [
UI::h('a', [
'href' => "#",
'onclick' => "return tableAjaxBackToTable();",
'class' => "AjaxTable--title",
], $this->getLabelHtml(100) ),
]),
($hasPermCreate)
? UI::h('div', [ 'class' => "btn-group pull-left" ], [
UI::h('a', [ 'title' => "Dodaj nowy rekord", 'class' => "btn btn-xs btn-default", 'href' => "#CREATE" ], [
UI::h('span', [ 'class' => "glyphicon glyphicon-plus" ]),
" Dodaj nowy rekord",
]),
])
: '',
($this->showProcesInitFiltr)
? UI::h('div', [ 'class' => "btn-group pull-right" ], [
UI::h('a', [ 'class' => "btn btn-xs btn-info dropdown-toggle",
'data-toggle' => "dropdown",
'href' => "#",
'title' => "Uruchom filtr procesu powiązanego z tabelą " . $this->getLabel(),
'onclick' => "return {$jsToogleFiltrProcesuFunctionName}(this);",
], "Filtr procesu "),
UI::h('ul', [ 'class' => "dropdown-menu pull-left", 'style' => "max-height:250px;overflow:auto;" ], [
UI::h('li', [ 'class' => "disabled" ], [
UI::h('a', [ 'href' => "#", 'onclick' => "return false;" ], " loading ... "),
]),
]),
])
: '',
($this->showTableTools)
? UI::h('div', [ 'class' => "btn-group pull-right" ], [
UI::h('a', [ 'class' => "btn btn-xs btn-default dropdown-toggle",
'style' => "margin-right:16px",
'data-toggle' => "dropdown",
'href' => "#",
'title' => "Narzędzia powiązane z tabelą " . $this->getLabel(),
'onclick' => "return {$jsToogleTableToolsFunctionName}(this);",
], "Narzędzia "),
UI::h('ul', [ 'class' => "dropdown-menu pull-left", 'style' => "max-height:250px;overflow:auto;" ], [
UI::h('li', [ 'class' => "disabled" ], [
UI::h('a', [ 'href' => "#", 'onclick' => "return false;" ], " loading ... "),
]),
]),
])
: '',
($nsSiblings)
? UI::h('div', [ 'class' => "btn-group pull-right" ], [
UI::h('a', [ 'class' => "btn btn-xs btn-default dropdown-toggle",
'style' => "margin-right:16px",
'data-toggle' => "dropdown",
'href' => "#",
'title' => "Powiązane obiekty z " . $this->getLabel(),
], "Obiekty "),
UI::h('ul', [ 'class' => "dropdown-menu pull-left", 'style' => "max-height:250px;overflow:auto;" ], array_map(function ($sibling) use ($baseUrl, $siblingSelected) {
$siblingLabel = explode('/', $sibling); $siblingLabel = array_pop($siblingLabel);
return UI::h('li', [ 'class' => "" ], [
UI::h('a', [
'href' => "{$baseUrl}&namespace={$sibling}",
'class' => "btn btn-link " . ($siblingSelected === $sibling ? "active" : ""),
'style' => "text-align:left"
], $siblingLabel),
]);
}, $nsSiblings)),
])
: '',
($this->_tbl == 'IN7_MK_BAZA_DYSTRYBUCJI')
? UI::h('a', [ 'class' => "pull-right", 'style' => "padding:0 20px 0 0", 'href' => "index.php?MENU_INIT=TREEJS&ZASOB_ID={$this->_zasobID}" ], " Drzewo")
: '',
($this->_tbl !== 'IN7_MK_BAZA_DYSTRYBUCJI' && $this->allowTreeView())
? UI::h('a', [ 'class' => "pull-right", 'style' => "padding:0 20px 0 0", 'href' => "index.php?MENU_INIT=VIEWTREE_AJAX&ZASOB_ID={$this->_zasobID}" ], " Drzewo")
: '',
($this->_tbl == 'WMS_MAP_GEOREFERENCES')
? UI::h('a', [ 'class' => "pull-right", 'style' => "padding:0 20px 0 0", 'href' => "index.php?_route=GeoreferencesManager" ], " Zarządzaj punktami")
: '',
UI::h('div', [ 'style' => "clear:both" ]),
]),
($this->_backRefFilter)
? UI::h('div', [ 'class' => "container" ], [
UI::h('div', [ 'class' => "alert alert-info" ], [
"Rekordy powiązane z rekordem {$this->_backRefFilter['primaryKey']} z ",
UI::h('a', [
'href' => "index.php?_route=ViewTableAjax&namespace={$this->_backRefFilter['namespace']}",
], $this->_backRefFilter['namespace']),
" - ",
UI::h('a', [
'href' => $this->rootUrl,
'style' => "color:red",
], "usuń filtr"),
]),
])
: '',
($this->_childRefFilter)
? UI::h('div', [ 'class' => "container" ], [
UI::h('div', [ 'class' => "alert alert-info" ], [
"Rekordy powiązane z rekordem {$this->_childRefFilter['primaryKey']} z ",
UI::h('a', [
'href' => "index.php?_route=ViewTableAjax&namespace={$this->_childRefFilter['namespace']}",
], $this->_childRefFilter['namespace']),
" - ",
UI::h('a', [
'href' => $this->rootUrl,
'style' => "color:red",
], "usuń filtr"),
]),
])
: '',
UI::h('div', [ 'id' => $this->_htmlID ]),
]);
UI::inlineJS(__FILE__ . '.generateFunctionNode.js');
UI::inlineJS(__FILE__ . '.GeomField.js');
if ($this->showProcesInitFiltr) {
UI::inlineJS(__FILE__ . '.procesInitFiltr.js', [
'JS_FUNCTION_NAME' => $jsToogleFiltrProcesuFunctionName,
'URL_GET_PROCES_INIT_FILTR' => $this->showProcesInitFiltr,
'ID_ZASOB' => $this->_zasobID,
]);
}
if ($this->showTableTools) {
UI::inlineJS(__FILE__ . '.tableTools.js', [
'JS_FUNCTION_NAME' => $jsToogleTableToolsFunctionName,
'URL_GET_TABLE_TOOLS' => $this->showTableTools,
]);
}
UI::inlineJS(APP_PATH_WWW . '/static/p5UI/FieldCheckboxSearch.js', []); // p5UI__FieldCheckboxSearch
UI::inlineCSS(APP_PATH_WWW . '/static/p5UI/FieldCheckboxLoading.css');
UI::inlineJS(APP_PATH_WWW . '/static/p5UI/FieldCheckboxLoading.js', []); // p5UI__FieldCheckboxLoading
// echo UI::h('style', [ 'type' => "text/css" ], "
// .stickyCol1 { display:none }
// ");
UI::inlineJS(__FILE__ . '.createTableFiltersStateObject.js', [
'DBG' => ('1' === V::get('DBG_JS', '', $_GET)),
]);
UI::inlineJS(__FILE__ . '.createTableSelectedStateObject.js', [
'URI_WPS' => Request::getPathUri() . 'wps.php',
'DBG' => ('1' === V::get('DBG_JS', '', $_GET)),
]);
UI::inlineJS(__FILE__ . '.createTableDataStateObject.js', [
'URI_WPS' => Request::getPathUri() . 'wps.php',
'DBG' => ('1' === V::get('DBG_JS', '', $_GET)),
]);
UI::inlineJS(__FILE__ . '.p5UI__TableAjax.js', [
'DBG' => ('1' === V::get('DBG_JS', '', $_GET)),
]);
UI::inlineJS(__FILE__ . '.p5UI__TableAjaxSortableLabel.js', [
'DBG' => ('1' === V::get('DBG_JS', '', $_GET)),
]);
UI::inlineJS(__FILE__ . '.p5UI__selected.js', [
'DBG' => ('1' === V::get('DBG_JS', '', $_GET)),
]);
UI::inlineJS(__FILE__ . '.TableAjax.js', [
'URI_BASE' => Request::getPathUri(),
'URI_WPS' => Request::getPathUri() . 'wps.php',
'RENDER_AS_REACT' => V::get('TEST_RENDER_AS_REACT', '', $_GET),
'SKIP_TOTAL' => true, // TEST: ('1' === V::get('SKIP_TOTAL', '', $_GET)),
'DBG' => ('1' === V::get('DBG_JS', '', $_GET)),
]);
$filterInit = $this->_filterInit;
$forceFilterInit = $this->_forceFilterInit;
$pageSizes = $this->_pageSizes;
$pageSize = $this->_pageSize;
$rowFunctions = $this->_rowFunctions;//$this->_showRowFunctionsJson();
$exportFields = Core_AclHelper::getExportFieldList($acl);
UI::inlineJS(__FILE__ . '.hist.js', [
'TABLE_AJAX_NODE_ID' => $this->_htmlID,
'TABLE_AJAX_LABEL' => $this->getLabelHtml(),
'URL_HIST_BASE' => "index-ajax.php?_zasobID={$this->_zasobID}&_cls=" . __CLASS__ . "&_hash={$this->_htmlID}&_task=HIST", // &ID=...
'FUNCTION_HIST_ROUTE' => "TableAjax__HIST_Route",
]);
UI::inlineJS(__FILE__ . '.create.js', [
'TABLE_AJAX_NODE_ID' => $this->_htmlID,
'TABLE_AJAX_LABEL' => $this->getLabelHtml(),
'NAMESPACE' => $acl->getNamespace(),
'FIRCE_FILTER_INIT' => $forceFilterInit,
'FUNCTION_CREATE_ROUTE' => "TableAjax__CREATE_Route",
'URL_CREATE_FORM_AJAX' => "{$this->syncUrl}&_hash={$this->_htmlID}&_task=createFormJson",
]);
UI::inlineJS(__FILE__ . '.edit.js', [
'TABLE_AJAX_NODE_ID' => $this->_htmlID,
'TABLE_AJAX_LABEL' => $this->getLabelHtml(),
'NAMESPACE' => $acl->getNamespace(),
'FUNCTION_EDIT_ROUTE' => "TableAjax__EDIT_Route",
'URL_EDIT_FORM_AJAX' => "{$this->syncUrl}&_hash={$this->_htmlID}&_task=editFormJson&_primaryKey=",
]);
UI::inlineJS(__FILE__ . '.openRef.js', []); // p5UI__tableAjaxOpenRefCell
$specialFilters = (method_exists($acl, 'getSpecialFilters')) ? $acl->getSpecialFilters() : null;
$className = __CLASS__;
UI::inlineJS(__FILE__ . '.init.js', [
'GUI_SHOW_CHECKBOXES' => 1, // ('1' === V::get('TEST_CHECKBOX', '', $_GET)),
'CHECKBOX_ID_CONTEXT' => V::get('TEST_CHECKBOX_CONTEXT', '', $_GET), // TODO: test generate @selected context
'TABLE_AJAX_NODE_ID' => $this->_htmlID,
'NAMESPACE' => $acl->getNamespace(),
'FUNCTION_HIST_ROUTE' => 'TableAjax__HIST_Route',
'FUNCTION_EDIT_ROUTE' => 'TableAjax__EDIT_Route',
'URL_LOAD_AJAX_BASE' => $this->syncUrl . '&_hash=' . $this->_htmlID . '&_task=loadDataAjax',
'URL_USER_TABLE_FILTER' => ($this->useUserTableFilter) ? $this->useUserTableFilter : '',
'FILTER_INIT' => $filterInit,
'FIRCE_FILTER_INIT' => $forceFilterInit,
'PAGE_SIZE' => $pageSize,
'PAGE_SIZES' => $pageSizes,
'URL_GET_CSV_THE_GEOM_AJAX' => "{$this->syncUrl}&_hash={$this->_htmlID}&_task=getCsvTheGeomAjax",
'URL_REMOVE_THE_GEOM_AJAX' => "{$this->syncUrl}&_hash={$this->_htmlID}&_task=removeTheGeomAjax",
'URL_MORE_FUNCTIONS_CELL_AJAX' => "{$this->syncUrl}&_hash={$this->_htmlID}&_task=moreFunctionsCellAjax",
'URL_EDIT_INLINE_SAVE' => "index-ajax.php?_zasobID={$this->_zasobID}&_cls={$className}&_hash={$this->_htmlID}&_task=EDIT_INLINE_SAVE",
'URL_THE_GEOM_SAVE' => "index-ajax.php?_zasobID={$this->_zasobID}&_cls={$className}&_hash={$this->_htmlID}&_task=THE_GEOM_SAVE",
'URL_PAGE_SIZE_SAVE' => "index-ajax.php?_zasobID={$this->_zasobID}&_cls={$className}&_hash={$this->_htmlID}&_task=PAGE_SIZE_SAVE",
'URL_HIDDEN_COLS_SAVE' => "index-ajax.php?_zasobID={$this->_zasobID}&_cls={$className}&_hash={$this->_htmlID}&_task=HIDDEN_COLS_SAVE",
'URL_EDIT_INLINE' => "index-ajax.php?_zasobID={$this->_zasobID}&_cls={$className}&_hash={$this->_htmlID}&_task=EDIT_INLINE",
'URL_RECORD_COPY' => "index-ajax.php?_zasobID={$this->_zasobID}&_cls={$className}&_hash={$this->_htmlID}&_task=COPY",
'URL_RECORD_FILES' => "index-ajax.php?_zasobID={$this->_zasobID}&_cls={$className}&_hash={$this->_htmlID}&_task=FILES",
'HAS_ADDITIONAL_LAYERS' => $this->hasAdditionalLayers() ? 1 : 0,
'URL_ADD_USER_TABLE_FILTER_AJAX' => Request::getPathUri() . "index.php?_route=ViewTableAjax&_task=addUserTableFilterAjax",
'URL_RM_USER_TABLE_FILTER_AJAX' => Request::getPathUri() . "index.php?_route=ViewTableAjax&_task=rmUserTableFilterAjax",
'LABEL_HTML' => $this->getLabelHtml(100),
'SPECIAL_FILTER_FUNCTIONS' => (!empty($specialFilters)) ? $specialFilters : false,
'ROW_FUNCTIONS' => $rowFunctions,
'TABLE_FUNCTIONS' => array_merge(
[ 'shortdesc' => [ 'icon' => "align-left", 'title' => "Long desc", 'method' => "longTextChanged" ] ],
($hasGeomFlds)
? [ 'mapeditor' => [ 'icon' => "map-marker", 'title' => "Mapa", 'method' => 'mapEditorChanged' ] ]
: [],
[ 'create' => [ 'href' => '#CREATE', 'icon' => 'plus', 'title' => "Dodaj nowy rekord" ] ],
[ 'refresh' => [ 'icon' => 'refresh', 'title' => "Odśwież dane", 'method' => "refresh" ] ]
),
'SELECTED_FUNCTIONS' => Route_UrlAction::getSelectedFeatureTools($acl->getID(), User::getLogin()),
'EXPORT_FIELDS' => $exportFields,
]);
UI::inlineJS(__FILE__ . '.upload.js', [
'URL_UPLOAD_FILES_AJAX' => "index.php?_route=ViewTableAjax&_task=uploadFilesAjax",
]);
UI::setTitle($this->_acl->getRawLabel(100) . " - " . UI::getTitle());
return ob_get_clean();
}
public function hasAdditionalLayers() {
$layers = TableAjaxMap::getAdditionalLayers($this->_zasobID);
return !empty($layers);
}
public function ajaxTask($task) {
switch ($task) {
case 'EDIT_INLINE': {
$this->sendAjaxResponseJson('ajaxInlineEdit', $_REQUEST);
break;
}
case 'EDIT_INLINE_SAVE': {
$this->sendAjaxResponseJson('ajaxEditInlineSave', $_REQUEST);
break;
}
case 'COPY': {
$this->sendAjaxResponseJson('ajaxCopy', $_REQUEST);
break;
}
case 'CREATE_SAVE': { // TODO: mv to _route = ViewTableAjax & _task = createSaveAjax
$this->sendAjaxResponseJson('ajaxCreateSave', $_REQUEST);
break;
}
case 'HIST': {
$this->sendAjaxResponseJson('ajaxHist', $_REQUEST);
break;
}
case 'FILES': {
try {
$id = V::get('ID', 0, $_REQUEST, 'int');
if ($id <= 0) throw new HttpException("404", 404);
$this->sendAjaxFiles($id, $_REQUEST);
} catch (HttpException $e) {
Http::sendHeaderByCode($e->getCode());
echo $e->getMessage();
//UI::alert('danger', $e->getMessage());
} catch (Exception $e) {
echo '
';
UI::alert('danger', $e->getMessage());
echo '
';
}
break;
}
case 'FILES_UPLOAD': {
$this->sendAjaxResponseJson('ajaxFileUpload', $_REQUEST);
break;
}
case 'FILES_LIST': {
$this->sendAjaxResponseJson('ajaxFileList', $_REQUEST);
break;
}
case 'filePermsRefresh': {
$this->sendAjaxResponseJson('ajaxFilePermsRefresh', $_REQUEST);
break;
}
case 'FILES_CONN_TBL_LIST': {
$id = V::get('ID', 0, $_REQUEST, 'int');
if ($id > 0) {
$this->sendAjaxFilesConnTblList($id, $_REQUEST);
} else {
echo '404';
}
break;
}
case 'TYPESPECIAL': {
$fldID = V::get('fldID', 0, $_REQUEST, 'int');
if ($fldID > 0) {
$this->sendTypeSpecial($fldID, $_REQUEST);
} else {
echo '404';
}
break;
}
case 'HIDDEN_COLS_SAVE': {
$this->sendAjaxResponseJson('ajaxHiddenColsSave', $_POST);
break;
}
case 'PAGE_SIZE_SAVE': {
$this->sendAjaxResponseJson('ajaxPageSizeSave', $_POST);
break;
}
case 'THE_GEOM_SAVE': {
$this->sendAjaxResponseJson('ajaxTheGeomSave', $_REQUEST);
break;
}
default:
$this->sendAjaxResponseJson('ajaxData', $_REQUEST);
}
}
/**
* ajax url: &_task=EDIT_INLINE
* @param $rowID - $_GET['ID']
* @param $fieldName - $_GET['col']
*/
private function ajaxInlineEdit() {
$DBG = ('1' == V::get('DBG', '', $_REQUEST));
$args = $_REQUEST;
$idRecord = V::get('ID', 0, $_REQUEST, 'int');
$fieldName = V::get('col', '', $_REQUEST);
if ($idRecord <= 0 || empty($fieldName)) throw new HttpException("404", 404);
$response = array();
ob_start();
$fieldID = $this->_acl->getFieldIdByName($fieldName);
if (!$fieldID) die("404: No field by name ({$fieldName})");
$response['idZasob'] = $fieldID;
$response['htmlFieldName'] = "f{$fieldID}";
if ($DBG) echo "fieldID: {$fieldID}\n";
$record = $this->_acl->buildQuery([])->getItem($idRecord);
if (!$record) die("404: No item ID({$idRecord})");
$fieldVal = '';
if ($this->_acl->canReadObjectField($fieldName, $record)) {
$fieldVal = V::get($fieldName, $fieldVal, $record);
} else {
$fieldVal = '*****';
}
$fieldVal = V::get("f{$fieldID}", $fieldVal, $_POST);
$vCol = $this->_acl->getField($fieldID);
$vCol['label'] = (!empty($vCol['label']))? $vCol['label'] : $vCol['name'];
$response['fieldLabel'] = $vCol['label'];
$tsValues = array();
$typeSpecial = Typespecial::getInstance($fieldID, $vCol['name']);
if ($typeSpecial) {
if($DBG){echo'Typespecial('.$fieldID.') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($typeSpecial);echo'';}
$specialValues = $typeSpecial->getEditSelectedValuesByIds($this->_zasobID, $record['ID'], $fieldName, V::get($fieldName, $fieldVal, $record));
if($DBG){echo'Typespecial('.$fieldID.') specialValues (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($specialValues);echo'';}
if (!empty($specialValues)) {
$tsValues[ $record['ID'] ] = implode('
', $specialValues);
}
}
$fieldParams = array('widthClass'=>'inside-modal', 'maxGrid'=>6);
if (!empty($tsValues[ $record['ID'] ])) $fieldParams['typespecialValue'] = $tsValues[ $record['ID'] ];
if (!empty($tsValues[ $record['ID'] ])) $response['typespecialValue'] = $tsValues[ $record['ID'] ];
$vDefault = $this->_acl->getFieldDefaultValue($fieldName);
if (!empty($vDefault)) $fieldParams['default'] = $vDefault;
if (!empty($vDefault)) $response['defaultValue'] = $vDefault;
if (method_exists($this->_acl, 'getFormItem')) {
try {
$item = $this->_acl->getFormItem('W', $fieldID, "f{$fieldID}", $fieldVal, $fieldParams, $record);
$response['formItem'] = $item;
if (!empty($item['rawColType']['simpleType'])) $response['simpleType'] = $item['rawColType']['simpleType'];
if (!empty($item['rawColType']['restrictions'])) $response['restrictions'] = $item['rawColType']['restrictions'];
DBG::log($item, 'array', "\$item (Acl->getFormItem)");
} catch (Exception $e) {
echo '';
UI::alert('danger', $e->getMessage());
echo '
';
}
}
?>
_acl->canWriteObjectField($fieldName, $record)) {
// TODO: hide Zapisz btn on frontend side
if (!$this->_acl->canReadObjectField($fieldName, $record)) {
UI::alert('warning', "Brak uprawnień do odczytu i zapisu");
} else {
echo '' . $fieldVal . '
';
UI::alert('warning', "Brak uprawnień do zapisu");
}
} else {
echo $this->_acl->showFormItem('W', $fieldID, "f{$fieldID}", $fieldVal, $fieldParams, $record);
if ($typeSpecial
|| $this->_acl->isDateField($fieldName)
|| $this->_acl->isDateTimeField($fieldName)
) {
echo '';
}
}
$response['legacy_html'] = ob_get_clean();
//$response['legacy_html'] = utf8_encode($response['legacy_html']);// pl chars bug
return $response;
}
private function ajaxEditInlineSave($args) {
$primaryKeyField = $this->_acl->getPrimaryKeyField();
$primaryKey = V::get($primaryKeyField, 0, $args, 'int');
$fieldName = V::get('col', '', $_REQUEST);
if (empty($primaryKey)) throw new HttpException("Wrong param id!", 400);
if (empty($fieldName)) throw new HttpException("Wrong param col!", 400);
$fieldID = $this->_acl->getFieldIdByName($fieldName);
if (!$fieldID) throw new HttpException("Field not exists!", 404);
$item = $this->_acl->buildQuery([])->getItem($primaryKey);
if (!$item) throw new HttpException("Item not exists!", 404);
$itemFromUser = $this->_acl->convertObjectFromUserInput($args, $type = 'array_by_id', $prefix = 'f');
if (!isset($itemFromUser[$fieldName])) throw new HttpException("Field not set!", 400);
$itemPatch = array();
$itemPatch[$fieldName] = V::get($fieldName, null, $itemFromUser);
$itemPatch[$primaryKeyField] = $primaryKey;
$response = new stdClass();
try {
$affected = $this->_acl->updateItem($itemPatch);
if ($affected > 0) {
$response->type = 'success';
$response->msg = "Rekord zapisany pomyślnie";//"Record saved successfully";
} else if ($affected == 0) {
$response->type = 'info';
$response->msg = "Nie wprowadzono żadnych zmian";
}
$response->record = $this->_acl->buildQuery([])->getItem($primaryKey);
}
catch (Exception $e) {
$response->type = 'error';
$response->msg = $e->getMessage();
}
return $response;
}
public function sendAjaxEdit($id, $args) { // TODO: not used @see ViewTableAjax::editFormAction
header("Content-type: text/plain");
$acl = $this->_acl;
$record = $acl->buildQuery([])->getItem($id);
if (!$acl->canWriteRecord($record) && !$acl->hasPermSuperWrite()) {
UI::alert('danger', "Brak dostępu do rekordu");
return;
}
$fieldsList = array();
foreach ($acl->getFieldListByIdZasob() as $kID => $fieldName) {
if ($fieldName == 'ID') continue;
$field['name'] = $fieldName;
$field['opis'] = $acl->getFieldOpis($fieldName);
$field['label'] = $acl->getFieldLabel($fieldName);
if (empty($field['label'])) $field['label'] = str_replace('_', ' ', $fieldName);
$fieldsList[$kID] = $field;
}
$cols = array();
foreach ($fieldsList as $kID => $field) {
$cols[$kID] = '';
if ($this->_acl->canReadObjectField($field['name'], $record)) {
$cols[$kID] = V::get($field['name'], '', $record);
} else {
$cols[$kID] = '*****';
}
// if ($acl->canReadObjectField($field['name'])) {
// $cols[$kID] = V::get($field['name'], '', $record);
// } else {
// $cols[$kID] = '*****';
// }
$cols[$kID] = V::get("f{$kID}", $cols[$kID], $_POST);
}
$tsValues = array();
if (!empty($fieldsList)) {
foreach ($fieldsList as $vColID => $vCol) {
$typeSpecial = Typespecial::getInstance($vColID, $vCol['name']);
if ($typeSpecial) {
$colValue = V::get($vCol['name'], '', $record);
$specialValues = $typeSpecial->getEditSelectedValuesByIds($this->_zasobID, $record['ID'], $vCol['name'], $colValue);
if (!empty($specialValues)) {
$tsValues[$vColID] = implode('
', $specialValues);
}
}
}
}
$rowFunctionsOut = $this->_showRowFunctions($record['ID'], array('edit', 'cp'), true);
?>
_acl;
header("Content-type: text/plain");
$DBG = ('1' == V::get('DBG', '', $_REQUEST));
if (!Core_AclHelper::hasCreatePerms($acl)) {
UI::alert('danger', "Brak uprawnień do utworzenia nowego rekordu.");
return;
}
$cols = array();
$forceFilterInit = array();
$defaultAclGroup = User::getDefaultAclGroup();
if ($defaultAclGroup) {
$forceFilterInit['A_ADM_COMPANY'] = $defaultAclGroup;
$forceFilterInit['A_CLASSIFIED'] = $defaultAclGroup;
}
foreach ($_GET as $k => $v) {
if (strlen($k) > 4 && substr($k, 0, 3) == 'ff_' && !empty($v)) {// force filter prefix
$fldName = substr($k, 3);
$forceFilterInit[$fldName] = $v;
}
}
$pkField = $acl->getPrimaryKeyField();
$fieldsList = $acl->getFields();
$fieldsList = array_filter($fieldsList, function ($vCol) {
return ($vCol['name'] != $pkField);
});
foreach ($fieldsList as $kID => $vCol) {
$defaultValue = '';
if (!empty($forceFilterInit[$vCol['name']])) {
$defaultValue = $forceFilterInit[$vCol['name']];
}
// TODO: read from session cache
$cols[$kID] = V::get("f{$kID}", $defaultValue, $_POST);
$label = V::get('label', '', $vCol);
$fieldsList[$kID]['label'] = ($label) ? $label : $vCol['name'];
}
?>
_acl;
$response = new stdClass();
$createdId = null;
try {
$item = $acl->convertObjectFromUserInput($args, $type = 'array_by_id', $prefix = 'f');
$createdId = $acl->addItem($item);
if ($createdId) {
$response->type = 'success';
$response->msg = "Utworzono pomyślnie rekord nr {$createdId}";
$response->id = $createdId;
$response->record = $acl->buildQuery([])->getItem($createdId);
}
else {
$response->type = 'error';
$response->msg = "Nie udało się utworzyć nowego rekordu!";
}
}
catch (Exception $e) {
$response->type = 'error';
$response->msg = $e->getMessage();
}
return $response;
}
private function ajaxCopy($args) {
$acl = $this->_acl;
$id = V::get('ID', 0, $_REQUEST, 'int');
if ($id <= 0) {
throw new HttpException("Wrong param ID!", 404);
}
$item = $acl->buildQuery([])->getItem($id);
if (!$item) {
throw new HttpException("Item '{$id}' not exists!", 404);
}
$response = new stdClass();
$itemCopy = $acl->createItemCopy($item);
$createdId = null;
try {
$createdId = $acl->addItem($itemCopy);
if ($createdId) {
$response->type = 'success';
$response->msg = "Rekord skopiowany pomyślnie - utworzono rekord nr {$createdId}";
$response->id = $createdId;
$response->record = $acl->buildQuery([])->getItem($createdId);
}
else {
$response->type = 'error';
$response->msg = "Nie udało się skopiować rekordu!";
}
}
catch (Exception $e) {
$response->type = 'error';
$response->msg = "Wystąpiły błędy!";
$response->msg = $e->getMessage();
}
return $response;
}
private function ajaxHist($args) {
$jsonResponse = array();
$id = V::get('ID', 0, $args, 'int');
$acl = $this->_acl;
$record = $acl->buildQuery([])->getItem($id);
if (!$record) throw new HttpException("404: No item ID({$id})", 404);
$visibleCols = $acl->getRealFieldList();
try {
$rowsHist = $acl->getHistItems($id);
} catch (Exception $e) {
DBG::log($e);
$rowsHist = [];
}
$jsonResponse['row_functions'] = $this->_parseRowFunctions($record['ID'], array('hist', 'cp'), $showLabel = true);
$visibleColsWithIds = array();
$visibleColsLabels = array();
foreach ($visibleCols as $vColName) {
$fldId = $acl->getFieldIdByName($vColName);
if ($fldId) {
$visibleColsWithIds[$fldId] = $vColName;
$label = $acl->getFieldLabel($vColName);
$label = (!$label)? $vColName : '' . $label . '';
$visibleColsLabels[$fldId] = $label;
}
}
$jsonResponse['label'] = "Historia rekordu Nr {$id}";
$jsonResponse['fields'] = array_values($visibleColsWithIds);
$jsonResponse['field_label'] = $visibleColsLabels;
if (empty($rowsHist)) return $jsonResponse;
$jsonResponse['rows'] = array();
foreach ($rowsHist as $histRow) {
$histItem = array();
$histItem['ID'] = V::get('ID', '', $histRow);
$histItem['_created'] = V::get('_created', '', $histRow);
$histItem['_author'] = V::get('_author', '', $histRow);
$histItem['changes'] = array();
foreach ($visibleColsWithIds as $fldId => $fieldName) {
if (!array_key_exists($fieldName, (array)$histRow)) continue;
$value = V::get($fieldName, '', $histRow);
if ('N/S;' == $value) continue;
$changeItem = array();
$changeItem['fieldName'] = $fieldName;
$changeItem['acl_read'] = $acl->canReadObjectField($fieldName, $record);
if ($changeItem['acl_read']) {
$changeItem['value'] = V::get($fieldName, '', $histRow);
}
if ('the_geom' == $fieldName && $acl->canWriteObjectField($fieldName, $record)) {
$sourceName = $acl->getSourceName();
if ('default_db' == $sourceName && !empty($value)) {
$typeName = $acl->getName();
$idHist = V::get('ID', '', $histRow);
$changeItem['revert_function_url'] = Request::getPathUri() . "index.php?_route=ViewTableAjax&typeName=p5_{$sourceName}:{$typeName}&_task=revertFromHistAjax&ID={$id}&idHist={$idHist}&fieldName={$fieldName}";
$changeItem['revert_function_data'] = "ID={$id}&idHist={$idHist}&fieldName={$fieldName}";
}
}
$histItem['changes'][$fieldName] = $changeItem;
}
$jsonResponse['rows'][] = $histItem;
}
return $jsonResponse;
}
public function ajaxFileUpload($args) {
$id = V::get('ID', 0, $args, 'int');
if ($id <= 0) throw new HttpException("404", 404);
$dbID = $this->_acl->getDB();
$db = DB::getDB($dbID);
if (!$db) throw new HttpException("No DB ({$dbID})", 406);
$record = $this->_acl->buildQuery([])->getItem($id);
if (!$record) throw new HttpException("No item ID({$id})", 404);
if (!$this->_acl->canReadRecord($record)) throw new Exception("Brak uprawnień do odczytu");
if (!$this->_acl->canWriteRecord($record)) throw new Exception("Brak uprawnień do zapisu");
$tblName = $this->_acl->getName();
$confTblName = "{$tblName}_COLUMN";
$folderConfAll = FoldersConfig::getRawData();
if (!FoldersConfig::hasConfig($confTblName)) throw new HttpException("Brak danych konfiguracyjnych ({$tblName})", 404);
$folderConf = FoldersConfig::getAll($confTblName);
$uploader = new FileUploader($confTblName, (object)$record);
if (!$uploader->setConfig($folderConf)) throw new HttpException("Błąd danych konfiguracyjnych ({$tblName})", 404);
$uploader->findFolder();
$errorMsg = '';
if (!empty($args['SCANS_COLUMN_ADD'])) {
$uploaded = $uploader->tryMoveFromScanAjax($errorMsg);
}
else {
$uploaded = $uploader->tryUploadAjax($errorMsg);
}
$retJson = new stdClass();
if (!$uploaded) throw new Exception($errorMsg);
$uploadedFileName = '';
$uploadedFile = $uploader->getLastUploadedFile();
if ($uploadedFile) {
$uploadedFileName = explode('/', $uploadedFile);
$uploadedFileName = end($uploadedFileName);
}
//echo '{"type":"SUCCESS", "string": "Plik został poprawnie wgrany do odpowiedniego katalogu '.$uploadedFileName.'"}';
$retJson->type = 'SUCCESS';
$retJson->msg = "Plik został poprawnie wgrany do odpowiedniego katalogu {$uploadedFileName}";
if (!empty($uploadedFileName)) {
$sqlObj = new stdClass();
$sqlObj->ID = $record['ID'];
$sqlObj->M_DIST_FILES = "Wgrano plik {$uploadedFileName}";
$db->UPDATE_OBJ($this->_tbl, $sqlObj);
}
return $retJson;
}
public function ajaxFileList($args) {
$id = V::get('ID', 0, $args, 'int');
if ($id <= 0) throw new HttpException("404", 404);
$dbID = $this->_acl->getDB();
$db = DB::getDB($dbID);
if (!$db) throw new HttpException("No DB ({$dbID})", 406);
$record = $this->_acl->buildQuery([])->getItem($id);
if (!$record) throw new HttpException("No item ID({$id})", 404);
if (!$this->_acl->canReadRecord($record)) throw new Exception("Brak uprawnień do odczytu");
$tblName = $this->_acl->getName();
$confTblName = "{$tblName}_COLUMN";
$folderConfAll = FoldersConfig::getRawData();
if (!FoldersConfig::hasConfig($confTblName)) throw new HttpException("Brak danych konfiguracyjnych ({$tblName})", 404);
$folderConf = FoldersConfig::getAll($confTblName);
$uploader = new FileUploader($confTblName, (object)$record);
if (!$uploader->setConfig($folderConf)) throw new HttpException("Błąd danych konfiguracyjnych ({$tblName})", 404);
$uploader->findFolder();
$mainFolder = $uploader->getDestFolder();
$files = $uploader->getFilesFromFolder($mainFolder, false, true);
$localPath = $uploader->getLocalPath();
$folderWeb = $uploader->getFolderWeb();
$jsonFiles = $this->convertFileListToJson($files, $folderWeb, $localPath, $mainFolder);
return $jsonFiles;
}
private function ajaxFilePermsRefresh($args) {
$id = V::get('ID', 0, $args, 'int');
if ($id <= 0) throw new HttpException("Wrong param ID", 404);
$dbID = $this->_acl->getDB();
$db = DB::getDB($dbID);
if (!$db) throw new HttpException("No DB", 406);
$record = $this->_acl->buildQuery([])->getItem($id);
if (!$record) throw new Exception("No item ID({$id})", 404);
$tblName = $this->_acl->getName();
// TODO: SyncPermsCustomTables->getRecordTask($tbl, $id);
$sql_L_APPOITMENT_USER = V::get('L_APPOITMENT_USER', '', $record);
$sql_A_ADM_COMPANY = V::get('A_ADM_COMPANY', '', $record);
$sql_A_CLASSIFIED = V::get('A_CLASSIFIED', '', $record);
$mainDB = DB::getDB();
if ('IN7_MK_BAZA_DYSTRYBUCJI' == $tblName) {
$sql = "insert into `_SYNC_FILE_PERMS` (
`ID_PROJECT`,
`A_SYNCHRONIZED`
)
values (
'{$record['ID']}'
, 0
)
ON DUPLICATE KEY UPDATE
`A_SYNCHRONIZED`=0
";
}
else if ('IN7_DZIENNIK_KORESP' == $tblName) {
$sql = "insert into `_SYNC_FILE_PERMS` (
`ID_PROJECT`,
`A_SYNCHRONIZED`
)
values (
'{$record['ID_PROJECT']}'
, 0
)
ON DUPLICATE KEY UPDATE
`A_SYNCHRONIZED`=0
";
}
else {
$sql = "insert into `_SYNC_TABLE_FILE_PERMS` (
`TBL_NAME`,
`TBL_ID`,
`L_APPOITMENT_USER`,
`A_ADM_COMPANY`,
`A_CLASSIFIED`,
`A_SYNCHRONIZED`
)
values (
'{$tblName}'
, '{$id}'
, '{$sql_L_APPOITMENT_USER}'
, '{$sql_A_ADM_COMPANY}'
, '{$sql_A_CLASSIFIED}'
, 0
)
ON DUPLICATE KEY UPDATE
`A_SYNCHRONIZED`=0
";
}
$res = $mainDB->query($sql);
if ($mainDB->has_errors()) {
//echo' (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sql);echo'';
//echo' (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($mainDB->get_errors());echo'';
throw new Exception("Nie udało się dodać zadania");
}
// TODO: this blocks browser ajax query
//$limit = 3;
//while ($limit--) {
// sleep(10);
// TODO: check if task is done
//}
$confTblName = "{$tblName}_COLUMN";
$folderConfAll = FoldersConfig::getRawData();
if (!FoldersConfig::hasConfig($confTblName)) {
throw new Exception("Brak danych konfiguracyjnych ({$tblName})", 404);
}
$folderConf = FoldersConfig::getAll($confTblName);
$uploader = new FileUploader($confTblName, (object)$record);
if (!$uploader->setConfig($folderConf)) {
throw new Exception("Błąd danych konfiguracyjnych ({$tblName})", 404);
}
$uploader->findFolder();
$mainFolder = $uploader->getDestFolder();
$files = $uploader->getFilesFromFolder($mainFolder, false, true);
$localPath = $uploader->getLocalPath();
$folderWeb = $uploader->getFolderWeb();
$jsonData = new stdClass();
$jsonData->msg = 'Zadanie dodane';
$jsonData->type = 'success';
$jsonData->files = $this->convertFileListToJson($files, $folderWeb, $localPath, $mainFolder);
return $jsonData;
}
private function sendAjaxFilesConnTblList($id, $args) {
header("Content-type: application/json");
$DBG = ('1' == V::get('DBG', '', $_REQUEST));
$dbID = $this->_acl->getDB();
$db = DB::getDB($dbID);
if (!$db) {
header('HTTP/1.0 406 Not Acceptable');
echo 'No DB (' . $dbID . ')';
exit;
}
$record = $this->_acl->buildQuery([])->getItem($id);
if (!$record) {
header('HTTP/1.0 404 Not Found');
echo 'No item ID(' . $rowID . ')';
exit;
}
$connTblName = '';
$connTblID = V::get('connTblID', 0, $_REQUEST, 'int');
if ($connTblID <= 0) {
header('HTTP/1.0 406 Not Acceptable');
echo 'No conn Table ID';
exit;
}
$connTblTypespecials = $this->getConnectedTblTypespecials($connTblID);
if (empty($connTblTypespecials)) {
header('HTTP/1.0 406 Not Acceptable');
echo "No conn Table (ID={$connTblID})";
exit;
}
if($DBG){echo'connTblTypespecials (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($connTblTypespecials);echo'';}
if(1) {
header('HTTP/1.0 404 Not Found');
echo 'TODO: ...';
exit;
}
$tblName = $this->_acl->getName();
$confTblName = "{$tblName}_COLUMN";
$folderConfAll = FoldersConfig::getRawData();
if (!FoldersConfig::hasConfig($confTblName)) {
header('HTTP/1.0 404 Not Found');
echo '{"type":"ERROR", "string": "Brak danych konfiguracyjnych (' . $tblName . ')"}';
exit;
}
$folderConf = FoldersConfig::getAll($confTblName);
$uploader = new FileUploader($confTblName, (object)$record);
if (!$uploader->setConfig($folderConf)) {
header('HTTP/1.0 404 Not Found');
echo '{"type":"ERROR", "string": "Błąd danych konfiguracyjnych (' . $tblName . ')"}';
exit;
}
$uploader->findFolder();
$mainFolder = $uploader->getDestFolder();
$files = $uploader->getFilesFromFolder($mainFolder, false, true);
$localPath = $uploader->getLocalPath();
$folderWeb = $uploader->getFolderWeb();
$jsonFiles = $this->convertFileListToJson($files, $folderWeb, $localPath, $mainFolder);
echo json_encode($jsonFiles);
exit;
}
public function convertFileListToJson($files, $folderWeb, $localPath, $mainFolder) {
$jsonFiles = array();
if (!is_array($files) || empty($files)) {
return $jsonFiles;
}
sort($files);
foreach ($files as $vFilePath) {
$file = new stdClass();
$file->name = str_replace("{$localPath}/{$mainFolder}/", '', $vFilePath);
//$file->name = explode('/', $vFilePath);
//$file->name = end($file->name);
$file->size = filesize($vFilePath);
$file->sizeStr = V::humanFileSize($file->size);
$file->type = '';
$file->created = date("Y-m-d H:i:s", filectime($vFilePath));
$file->web = str_replace($localPath, $folderWeb, $vFilePath);
$jsonFiles[] = $file;
}
return $jsonFiles;
}
private function getConnectedTables() {
$connTbls = array();
return $connTbls;// TODO: OFF - hardlinki tworzone w bash_sync_perms.php
$fields = $this->_acl->getVirtualFieldListByIdZasob();
if (!empty($fields)) {
foreach ($fields as $vColID => $vCol) {
$typeSpecial = Typespecial::getInstance($vColID);
if ($typeSpecial) {
$tsConnTbls = $typeSpecial->getTblAliasList();
if (!empty($tsConnTbls)) {
foreach ($tsConnTbls as $kID => $vName) {
$connTbls[$kID] = $vName;
}
}
}
}
}
return $connTbls;
}
private function getConnectedTblTypespecials($connTblID) {
$connTblTypespecials = array();
$fields = $this->_acl->getVirtualFieldListByIdZasob();
if (!empty($fields)) {
foreach ($fields as $vColID => $vCol) {
$typeSpecial = Typespecial::getInstance($vColID);
if ($typeSpecial) {
$tsConnTbls = $typeSpecial->getTblAliasList();
if (array_key_exists($connTblID, $tsConnTbls)) {
$connTblTypespecials[] = $typeSpecial;
}
}
}
}
return $connTblTypespecials;
}
private function sendAjaxFiles($id, $args) {
header("Content-type: text/plain");
$DBG = ('1' == V::get('DBG', '', $_REQUEST));
$acl = $this->_acl;
$dbID = $acl->getDB();
$db = DB::getDB($dbID);
if (!$db) throw new HttpException("", 406);
$record = $acl->buildQuery([])->getItem($id);
if (!$record) throw new HttpException("404: No item ID({$rowID})", 404);
if (!$acl->canReadRecord($record)) throw new Exception("Brak uprawnień do odczytu");
$tblName = $acl->getName();
$confTblName = "{$tblName}_COLUMN";
$folderConfAll = FoldersConfig::getRawData();
if (!FoldersConfig::hasConfig($confTblName)) throw new HttpException("Brak danych konfiguracyjnych", 404);
$folderConf = FoldersConfig::getAll($confTblName);
//echo'$folderConf (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($folderConf);echo'';
$uploader = new FileUploader($confTblName, (object)$record);
$errMsg = '';
if (!$uploader->setConfig($folderConf, $errMsg)) throw new HttpException("Błąd danych konfiguracyjnych ({$tblName})" . '
' . "\n" . $errMsg, 404);
$uploader->findFolder();
if($DBG){ echo'uploader (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($uploader);echo'
'; }
$mainFolder = $uploader->getDestFolder();
if($DBG){ echo'mainFolder (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($mainFolder);echo'
'; }
if (!$mainFolder) {
$destFolderPath = $uploader->getDestLocalPath(true);
$folderCreated = $uploader->tryCreateDestFolder($destFolderPath);
if ($folderCreated) {
//UI::alert('info', "Utworzono katalog");
$uploader->findFolder();
$mainFolder = $uploader->getDestFolder();
} else {
UI::alert('warning', "Nie udało się utworzyć katalogu");
}
}
$files = $uploader->getFilesFromFolder($mainFolder, false, true);
if($DBG){ echo'files (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($files);echo''; }
$sharePoint = V::get('share_point', null, $folderConf);
if ($sharePoint) {
if ('//' == substr($mainFolder, 0, 2)) {
$sharePoint = FoldersConfig::getNfsOsPath() . "{$mainFolder}";
} else {
$sharePoint = FoldersConfig::getNfsOsPath() . "{$sharePoint}/{$mainFolder}";
}
}
$localPath = $uploader->getLocalPath();
$folderWeb = $uploader->getFolderWeb();
$jsonFiles = $this->convertFileListToJson($files, $folderWeb, $localPath, $mainFolder);
if($DBG){ echo'jsonFiles (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($jsonFiles);echo''; }
$folderSkanyConf = FoldersConfig::getAll('SCANS_COLUMN');
$skanyLocalPath = V::get('mount_point', null, $folderSkanyConf);
$skanySharePoint = V::get('share_point', null, $folderSkanyConf);
$skanyFolderWeb = V::get('www_share_point', null, $folderSkanyConf);
$skanyFiles = $uploader->getFilesFromSkany($folderSkanyConf, false);
sort($skanyFiles);
$fileTypes = FoldersConfig::getAll('m_dist_files_types');
$rowFunctionsOut = $this->_showRowFunctions($record['ID'], array('files', 'cp'), true);
$fileIndexField = V::get('DEST_FILE_INDEX_FIELD', 'ID', $folderConf);
$fileIndex = V::get($fileIndexField, $record['ID'], $record);
$namespace = $acl->getNamespace();
echo UI::h('div', [ 'class' => "container" ], [
UI::h('h4', [ 'style' => "margin:20px 0 3px 0;" ], [
"Pliki w katalogu ",
($sharePoint)
? UI::h('a', [ 'href' => $sharePoint ], [
UI::h('span', [ 'class' => "glyphicon glyphicon-folder-open" ]),
UI::h('code', [ 'style' => "margin-left:6px" ], $mainFolder),
])
: UI::h('code', [], $mainFolder),
UI::h('span', [ 'class' => "pull-right valign-btns-bottom" ], [
UI::h('span', [ 'id' => "FILES_LIST_ACTIONS_{$this->_htmlID}" ]),
" {$rowFunctionsOut}",
]),
]),
UI::h('div', [ 'style' => "clear:both; max-height:180px; overflow:auto; border-bottom:1px solid #ddd;" ], [
UI::h('table', [ 'class' => "table table-bordered table-hover" ], [
UI::h('colgroup', [], [
UI::h('col', [ 'style' => "" ]),
UI::h('col', [ 'style' => "width:30px" ]),
($sharePoint)
? UI::h('col', [ 'style' => "width:30px" ])
: '',
UI::h('col', [ 'style' => "width:80px" ]),
UI::h('col', [ 'style' => "width:140px" ]),
]),
UI::h('tbody', [ 'id' => "FILES_LIST_{$this->_htmlID}" ], [
(empty($mainFolder) || empty($files))
? UI::h('tr', [], [
UI::h('td', [ 'colspan' => "5" ], [
(empty($mainFolder))
? UI::h('div', [ 'class' => "alert alert-warning" ], [
UI::h('h4', [], "Brak folderu!"),
"Folder dla tego rekordu nie został utworzony."
])
: UI::h('div', [ 'class' => "alert alert-info" ], [
UI::h('h4', [], "Brak plików!"),
])
]),
])
: '',
]),
]),
]),
UI::h('br'),
UI::h('br'),
(!$this->_acl->canWriteRecord($record))
? UI::h('div', [ 'class' => "alert alert-warning" ], [
"Brak uprawnień do dodawania plików",
])
: UI::h('div', [ 'id' => "FILES_CONN_TBLS_{$this->_htmlID}" ]),
(!$this->_acl->canWriteRecord($record))
? ''
: UI::h('form', [ 'enctype' => "multipart/form-data", 'method' => "POST", 'action' => "", 'id' => "FILES_FRM_{$this->_htmlID}", 'class' => "form-inline" ], [
UI::h('input', [ 'type' => "hidden", 'name' => "M_DIST_UPLOAD_SOURCE", 'value' => "local" ]),
UI::h('ul', [ 'id' => "FILES_TAB_{$this->_htmlID}", 'class' => "nav nav-tabs", 'style' => "margin:0;"], [
UI::h('li', [ 'class' => "active" ], [ UI::h('a', [ 'href' => "#local", 'data-toggle' => "local" ], "Wybierz plik lokalny"), ]),
UI::h('li', [], [ UI::h('a', [ 'href' => "#scan", 'data-toggle' => "scan" ], "Wybierz plik ze skanów" ), ]),
UI::h('li', [], [ UI::h('a', [ 'href' => "#multiple", 'data-toggle' => "multiple" ], "Wgraj wiele plików" ), ]),
]),
UI::h('div', [ 'id' => "myTabContent", 'class' => "tab-content" ], [
UI::h('div', [ 'class' => "tab-pane fade in active", 'id' => "local", 'style' => "text-align: center;" ], [
UI::h('input', [ 'name' => "M_DIST_FILES_NAME", 'type' => "file", 'size' => "60", 'class' => "field-upload btn",
'style' => "width:86%;margin:10px auto;padding:10px 4%;background:#eee;text-align:center",
'ondragover' => "this.style.backgroundColor='#D9EDF7'",
'ondragleave' => "this.style.backgroundColor='#eee'",
'ondragend' => "this.style.backgroundColor='#eee'",
]),
]),
UI::h('div', [ 'class' => "tab-pane fade", 'id' => "multiple" ], [
UI::h('div', [
'id' => "FILES_MULTIPLE_UPLOAD_{$this->_htmlID}",
'style' => "width:86%; margin:10px auto; padding:40px 100px; background-color:#eee; border-radius:4px; text-align:center",
'ondrop' => "p5TAFiles_onDropMultiple(event, this, '{$id}', '{$namespace}')",
'ondragover' => "p5TAFiles_onDragOverMultiple(event, this)", // "event.preventDefault(); this.style.backgroundColor='#D9EDF7'",
'ondragleave' => "p5TAFiles_onDragLeaveMultiple(event, this)", // "event.preventDefault(); this.style.backgroundColor='#eee'",
'ondragend' => "p5TAFiles_onDragEndMultiple(event, this)", // "event.preventDefault(); this.style.backgroundColor='#eee'",
], [
"Upuść pliki tutaj",
]),
]),
UI::h('div', [ 'class' => "tab-pane fade", 'id' => "scan" ], [
(empty($skanyFiles))
? UI::h('div', [ 'class' => "alert alert-info" ], [
UI::h('h4', [], "Brak plików"),
(!empty($skanyFolderWeb))
? "skonfiguruj urządzenie biurowe aby wysyłało skany na ftp://skaner:(h*a*s*l*o)@".$_SERVER['SERVER_NAME']."
lub ".FoldersConfig::getNfsOsPath().$skanySharePoint.""
: '',
])
: UI::h('div', [ 'style' => "max-height:150px; overflow:auto; border-bottom:1px solid #ddd;" ], [
UI::h('table', [ 'class' => "table table-bordered table-hover" ], [
UI::h('colgroup', [], [
UI::h('col', [ 'style' => "width:30px;" ]),
UI::h('col', [ 'style' => "" ]),
UI::h('col', [ 'style' => "width:30px;" ]),
UI::h('col', [ 'style' => "width:80px;" ]),
UI::h('col', [ 'style' => "width:140px;" ]),
]),
UI::h('tbody', [], array_map(function ($vFilePath) use ($skanyLocalPath, $skanyFolderWeb) {
$vFileName = explode('/', $vFilePath);
$vFileName = end($vFileName);
$vFileSize = filesize($vFilePath);
$vFileSizeOut = V::humanFileSize($vFileSize);
return UI::h('tr', [], [
UI::h('td', [], [ UI::h('input', [ 'style' => "margin:0", 'type' => "radio", 'name' => "SCANS_COLUMN_ADD", 'value' => $vFileName]) ]),
UI::h('td', [], [ UI::h('div', [ 'style' => "overflow:hidden; white-space:nowrap", 'title' => $vFileName ], $vFileName) ]),
UI::h('td', [ 'style' => "white-space:nowrap; text-align:center" ], [
UI::h('a', [ 'href' => str_replace($skanyLocalPath, $skanyFolderWeb, $vFilePath), 'target' => "_blank", 'class' => "glyphicon glyphicon-download-alt" ])
]),
UI::h('td', [ 'style' => "white-space:nowrap; text-align:right" ], $vFileSizeOut),
UI::h('td', [ 'style' => "white-space:nowrap" ], date("Y-m-d H:i:s", filectime($vFilePath))),
]);
}, $skanyFiles)),
])
]),
])
]),
UI::h('br'),
UI::h('h4', [], [
"Ustal nazwę pliku zgodną z obiegiem dokumentów",
//TODO: link do procesu o obiegu dokumentów
]),
UI::h('table', [ 'style' => "width:100%", 'class' => "table table-bordered" ], [
UI::h('tr', [], [
UI::h('th', [], "Nr"),
UI::h('th', [], "Typ"),
UI::h('th', [ 'style' => "width:40%" ], [
"Opis ",
UI::h('i', [ 'class' => "glyphicon glyphicon-question-sign", 'title' => "kogo dotyczy / czego / sprawa / nazwa_firmy itp" ]),
]),
UI::h('th', [ 'style' => "width:16%" ], "Data wersji"),
UI::h('th', [ 'style' => "width:12%" ], "Numer wersji"),
]),
UI::h('tr', [], [
UI::h('td', [], $fileIndex),
UI::h('td', [], [
UI::h('select', [ 'class' => "form-control", 'name' => "M_DIST_FILES_TYPE" ], array_map(function ($vLabel, $kType) {
return UI::h('option', array_merge([ 'value' => $kType],
($kType == 'TODO')
? [ 'selected' => "selected"]
: []
), $vLabel);
}, $fileTypes, array_keys($fileTypes)) ),
UI::h('br'),
UI::h('label', [ 'class' => "checkbox" ], [
UI::h('input', [ 'type' => "checkbox", 'name' => "M_DIST_FILES_TYPE_AUTO" ]),
" Wykrycie automatyczne typu z wysylanego pliku",
]),
UI::h('label', [ 'class' => "checkbox" ], [
UI::h('input', [ 'type' => "checkbox", 'name' => "M_DIST_FILES_TEMP" ]),
" Plik tymczasowy / roboczy / nieoficjalny (_TEMP)",
]),
]),
UI::h('td', [], [
UI::h('input', [ 'class' => "form-control", 'style' => "width:100%", 'type' => "text", 'name' => "M_DIST_FILES_DESCRIPTION", 'value' => "", 'maxlength' => "50" ]),
"
",
]),
UI::h('td', [], [
UI::h('div', [ 'class' => "input-group" ], [
UI::h('input', [ 'name' => "M_DIST_FILES_DATE", 'type' => "text", 'value' => date('Y-m-d'), 'class' => "se_type-date form-control", 'data-format' => "yyyy-MM-dd", 'maxlength' => "10" ]),
UI::h('span', [ 'class' => "input-group-addon" ], [
UI::h('span', [ 'class' => "glyphicon glyphicon-calendar" ]),
]),
]),
// UI::h('input', [ 'class' => "form-control", 'type' => "date", 'name' => "M_DIST_FILES_DATE", 'value' => date('Y-m-d'), 'maxlength' => "10" ]),
"
",
]),
UI::h('td', [], [
UI::h('input', [ 'class' => "form-control", 'style' => "width:100%", 'type' => "number", 'name' => "M_DIST_FILES_VERSION" ]),
UI::h('br'),
UI::h('label', [ 'class' => "checkbox" ], [
UI::h('input', [ 'type' => "checkbox", 'name' => "M_DIST_FILES_VERSION_AUTO" ]),
" Automatycznie dodaj wersje",
]),
]),
]),
UI::h('tr', [], [
UI::h('td', [ 'colspan' => "5" ], [
UI::h('div', [ 'id' => "FRM_UPLOAD_RESULTS_{$this->_htmlID}" ]),
UI::h('p', [], [
UI::h('input', [ 'type' => "submit", 'value' => "Wyślij", 'class' => "btn btn-primary" ], "wybrany plik do folderu:"),
]),
UI::h('p', [], [
UI::h('code', [], [
UI::h('b', [], $uploader->getDestPathShare(true)),
]),
UI::h('br'),
UI::h('i', [ 'style' => "color:#777" ], "(Jeśli folder nie istnieje to zostanie utworzony automatycznie)"),
]),
]),
]),
]),
]),
]);
$className = __CLASS__;
$namespace = $acl->getNamespace();
UI::inlineJS(__FILE__ . '.files.js', [
'UNIQ_HASH' => $this->_htmlID,
'FUNCTION_FILE_LIST_UPDATE_AJAX' => "fileListUpdateAjax{$this->_htmlID}", // fileListUpdateAjax
'FUNCTION_FILE_LIST_UPDATE' => "fileListUpdate{$this->_htmlID}", // fileListUpdate
'FUNCTION_CONN_TBL_LIST_UPDATE_AJAX' => "connTblListUpdateAjax{$this->_htmlID}", // connTblListUpdateAjax
'FUNCTION_CONN_TBL_LIST_UPDATE' => "connTblListUpdate{$this->_htmlID}", // connTblListUpdate
'FUNCTION_FILE_LIST_ACTIONS' => "fileListActions{$this->_htmlID}", // fileListActions
'CONN_TABLES' => $this->getConnectedTables(),
'NODE_ID_FILES_FRM' => "FILES_FRM_{$this->_htmlID}",
'NODE_ID_FRM_UPLOAD_RESULTS' => "FRM_UPLOAD_RESULTS_{$this->_htmlID}",
'NODE_ID_FILES_TAB' => "FILES_TAB_{$this->_htmlID}",
'NODE_ID_FILES_LIST' => "FILES_LIST_{$this->_htmlID}",
'NODE_ID_FILES_CONN_TBLS' => "FILES_CONN_TBLS_{$this->_htmlID}",
'NODE_ID_FILES_LIST_ACTIONS' => "FILES_LIST_ACTIONS_{$this->_htmlID}",
'NODE_ID_FILES_MULTIPLE_UPLOAD' => "FILES_MULTIPLE_UPLOAD_{$this->_htmlID}",
'URL_FILE_LIST_UPDATE_AJAX' => "index-ajax.php?_zasobID={$this->_zasobID};&_cls={$className}&_hash={$this->_htmlID}&_task=FILES_LIST&ID={$record['ID']}",
'URL_FILE_REMOVE_AJAX' => "index.php?_route=ViewTableAjax&namespace={$namespace}&_task=removeFileAjax&ID={$record['ID']}",
'URL_CONNECTED_TABLE_LIST' => "index-ajax.php?_zasobID={$this->_zasobID}&_cls={$className}&_hash={$this->_htmlID}&_task=FILES_CONN_TBL_LIST&ID={$record['ID']}",
'URL_FILE_PERMS_REFRESH' => "index-ajax.php?_zasobID={$this->_zasobID}&_cls={$className}&_hash={$this->_htmlID}&_task=filePermsRefresh&ID={$record['ID']}",
'URL_FILE_UPLOAD' => "index-ajax.php?_zasobID={$this->_zasobID}&_cls={$className}&_hash={$this->_htmlID}&_task=FILES_UPLOAD&ID={$record['ID']}",
'CAN_WRITE_RECORD' => (int)$this->_acl->canWriteRecord($record),
'SHARE_POINT' => $sharePoint,
'JSON_FILES' => $jsonFiles,
]);
exit;
}
private function sendTypeSpecial($fldID, $args) { // TODO: mv to index.php?_route=ViewTableAjax&_task=typespecial&idField=" + idField, // &q=... or &selected=... or &idRecord=...
$DBG = ('1' == V::get('DBG', '', $_REQUEST));
header("Content-type: application/json");
$fldName = '';
$fld = $this->_acl->getField($fldID);
DBG::log($fld, 'array', "\$fld({$fldID})");
if (!$fld) {
// 404
} else {
$fldName = $fld['name'];
}
$jsonData = array();
$typeSpecial = Typespecial::getInstance($fldID, $fldName);
if ($typeSpecial) {
$query = V::get('q', '', $_REQUEST);
DBG::log("\$query({$query})");
$rawRows = null;
$rows = $typeSpecial->getValuesWithExports($query);
DBG::log($rows, 'array', "\$rows({$query})");
foreach ($rows as $kID => $vItem) {
$itemJson = new stdClass();
$itemJson->id = $vItem->id;
$itemJson->name = $vItem->param_out;
if (!empty($vItem->exports)) {
$itemJson->exports = $vItem->exports;
}
if (!empty($vItem->{'$order'})) {
$itemJson->{'$order'} = $vItem->{'$order'};
}
$jsonData[] = $itemJson;
}
}
/*
MENU_INIT:VIEWTABLE_AJAX
ZASOB_ID:1188
_task:TYPESPECIAL
fldID:3866
Form Dataview sourceview URL encoded
q:te
*/
echo json_encode($jsonData);
exit;
}
public function ajaxData($args) {// executed from url: "{$this->syncUrl"&_hash={$this->_htmlID}&_task=loadDataAjax"
$acl = $this->_acl;
$pageSize = V::get('pageSize', $this->_pageSize, $args, 'int');
$page = V::get('page', 0, $args, 'int');
$page = ($page > 0) ? $page - 1 : $page;
$currSortCol = V::get('currSortCol', '', $args);
$currSortFlip = V::get('currSortFlip', '', $args);
$params = array();
$params['limit'] = $pageSize;
$params['limitstart'] = $page * $params['limit'];
$params['order_by'] = ($currSortCol)? $currSortCol : '';
$params['order_dir'] = $currSortFlip;
foreach ($args as $k => $v) {
if (strlen($k) > 3 && substr($k, 0, 2) == 'f_' && strlen($v) > 0) {// filter prefix
$params[$k] = $v;
}
else if (strlen($k) > 4 && substr($k, 0, 3) == 'sf_' && strlen($v) > 0) {// special filter prefix
$params[$k] = $v;
}
}
if ($this->_backRefFilter) {
$params['__backRef'] = $this->_backRefFilter;
DBG::log($params, 'array', '$params __backRef');
}
if ($this->_childRefFilter) {
$params['__childRef'] = $this->_childRefFilter;
DBG::log($params, 'array', '$params __childRef');
}
$filters = new stdClass();
$filters->currSortCol = $currSortCol;
$filters->currSortFlip = $currSortFlip;
foreach ($args as $k => $v) {
if (strlen($k) > 3 && substr($k, 0, 2) == 'f_' && strlen($v) > 0) {// filter prefix
$filters->{$k} = $v;
}
else if (strlen($k) > 4 && substr($k, 0, 3) == 'sf_' && strlen($v) > 0) {// special filter prefix
$filters->{$k} = $v;
}
}
$this->setFilters($filters);
session_write_close();
$vCols = $acl->getVirtualFieldListByIdZasob();
DBG::log($vCols, 'array', "\$vCols");
$visibleCols = $acl->getVisibleFieldListByIdZasob();
DBG::log($visibleCols, 'array', "\$visibleCols");
$jsonData = new stdClass();
$jsonData->page = $page + 1;
$jsonData->pageSize = $pageSize;
$jsonData->filters = $filters;
$jsonData->cols = new stdClass();
$jsonData->primaryKey = $acl->getPrimaryKeyField();
$ind = 0;
$gui__hideRefFields = empty(UserProfile::getStorageTableHiddenCols($acl->getID())); // TODO: by default now - change to user settings in Kolumny dropdown
foreach ($visibleCols as $fieldID => $col) {
$ind++;
$columnConfig = (object)array('index'=>$ind);
if (in_array($col, array('A_STATUS','A_STATUS_CURRENT','A_SERVICES_STATUS_CURRENT'))) {
$columnConfig->format = '{0}
';
}
else if (in_array($col, array('Status'))) {
// Ahmes problems Status colors
$columnConfig->format = '{0}
';
}
else if ($acl->isGeomField($col)) {
$columnConfig->type = 'geom';
}
if ('' !== ($label = $acl->getFieldLabel($col))) {
$columnConfig->friendly = $label;
}
$colType = $acl->getFieldType($col);
if ($colType) {// @see MarkTableAjaxFilterColType
if ($colType['type'] == 'date') {
// $columnConfig->type = 'date';// TODO: require datetimepicker
}
if (!empty($colType['simpleType'])) $columnConfig->type = $colType['simpleType'];
} else {// typespecial - no type
$columnConfig->type = 'special';
}
$columnConfig->xsdType = $acl->getXsdFieldType($col);
if ($columnConfig->xsdType) {
list($prefix, $typeName, $refTypeName) = explode(":", $columnConfig->xsdType);
DBG::log([$prefix, $typeName, $refTypeName], 'array', "col '{$col}' xsdType");
switch ($prefix) {
case 'ref':
case 'alias_ref':
if (!$refTypeName) throw new HttpException("Schema Error for field({$col}) xsdType({$columnConfig->xsdType})", 500);
$columnConfig->type = 'ref';
$columnConfig->xsdRefUri = Api_WfsNs::getNsUri($typeName);
$columnConfig->xsdRefType = $refTypeName;
$columnConfig->xsdRefNsPrefix = $typeName;
break;
case 'xsd':
switch ($typeName) {
case 'string': $columnConfig->type = 'string'; break;
case 'NMTOKEN': $columnConfig->type = 'string'; break; // xsd:NMTOKEN - non empty string without space - pattern: \c+
case 'NCName': $columnConfig->type = 'string'; break; // xsd:NCName - non empty without ':' and not started with '-' - pattern: [\i-[:]][\c-[:]]*
case 'integer': $columnConfig->type = 'number'; break;
case 'int': $columnConfig->type = 'number'; break;
case 'long': $columnConfig->type = 'number'; break;
case 'date': $columnConfig->type = 'string'; break;
case 'datetime': $columnConfig->type = 'string'; break;
case 'dateTime': $columnConfig->type = 'string'; break;
case 'double': $columnConfig->type = 'string'; break;
}
break;
case 'p5':
switch ($typeName) {
case 'enum': $columnConfig->type = 'string'; break;
case 'alias': {
if ($format = $acl->getXsdFieldParam($col, 'format')) $columnConfig->format = $format;
if ($aliasMap = $acl->getXsdFieldParam($col, 'aliasMap')) $columnConfig->aliasMap = $aliasMap;
} break;
case 'string': {
$columnConfig->type = 'p5:string';
$columnConfig->format = $acl->getXsdFieldParam($col, 'format');
$columnConfig->formatByValue = $acl->getXsdFieldParam($col, 'formatByValue');
$columnConfig->formatEmpty = $acl->getXsdFieldParam($col, 'formatEmpty');
if ($aliasMap = $acl->getXsdFieldParam($col, 'aliasMap')) $columnConfig->aliasMap = $aliasMap;
} break;
}
break;
case 'gml': $columnConfig->type = 'geom'; break;
case 'p5Type':
switch ($typeName) {
case 'enum': $columnConfig->type = 'string'; break;
case 'alias': {
$format = $acl->getXsdFieldParam($col, 'format');
if ($format) $columnConfig->format = $format;
} break;
case 'integer': $columnConfig->type = 'number'; break;
case 'string': {
$columnConfig->type = 'p5:string';
$columnConfig->formatByValue = $acl->getXsdFieldParam($col, 'formatByValue');
if ($aliasMap = $acl->getXsdFieldParam($col, 'aliasMap')) $columnConfig->aliasMap = $aliasMap;
} break;
case 'polygon':
case 'lineString':
case 'point': {
$columnConfig->type = 'geom';
} break;
}
break;
}
}
$typeSpecial = Typespecial::getInstance($fieldID, $col);
if ($typeSpecial) {
DBG::log($typeSpecial, 'array', "\$typeSpecial id({$fieldID}) col({$col})");
$columnConfig->_tsRetId = $typeSpecial->getReturnId();
if ($columnConfig->_tsRetId == 0) {
$columnConfig->sortable = false;
$columnConfig->filterable = false;
$tsParamOut = V::get('param_out', null, $typeSpecial);
if ($tsParamOut) {
$tsFormat = V::get('format', null, $tsParamOut);
$tsValues = V::get('values', null, $tsParamOut);
$tsAliases = V::get('alias', null, $tsParamOut);
if (false !== strpos($tsFormat, ' Array([ID] => 1467), [alias] => Array([1467] => ID) */
$bugTsColsNotVisible = array();
foreach ($tsValues as $kVarName => $vIdZasob) {
if (array_key_exists($vIdZasob, $tsAliases)) {
$tsAliasMap[$kVarName] = $tsAliases[$vIdZasob];
} else {
$bugTsColsNotVisible[] = "noAliasFor {$vIdZasob}";
}
if (!array_key_exists($vIdZasob, $visibleCols)) {
$bugTsColsNotVisible[] = $vIdZasob;
}
}
if (empty($bugTsColsNotVisible)) {
$tsSimpleLink = new stdClass();
$tsSimpleLink->format = $tsFormat;
$tsSimpleLink->aliasMap = $tsAliasMap;
$columnConfig->_tsSimpleLink = $tsSimpleLink;
$columnConfig->type = 'simpleLink';
} else {
$columnConfig->_tsSimpleLinkBug = $bugTsColsNotVisible;
}
}
}
}
// TODO: hot fix for filterable TypespecialVariable fields, @see more in TypespecialVariable::getInstance
{
switch ($col) {
case 'A_ADM_COMPANY':
case 'A_CLASSIFIED':
case 'K_OD_KOGO':
case 'OD_KOGO_ADRES':
case 'M_DISTRIBUTOR':
case 'DEFAULT_ACL_GROUP':
{
$columnConfig->sortable = true;
$columnConfig->filterable = true;
} break;
}
}
}
if ($columnConfig->xsdType) {// fix fields type p5:typeSpecialSimpleLink (previously defined by Typespecial)
switch ($columnConfig->xsdType) {
case 'p5:typeSpecialSimpleLink': {
$columnConfig->type = 'simpleLink';
$columnConfig->_tsRetId = 0;
$columnConfig->_tsSimpleLink = new stdClass();
$columnConfig->_tsSimpleLink->format = $acl->getXsdFieldParam($col, 'format');
$columnConfig->_tsSimpleLink->aliasMap = $acl->getXsdFieldParam($col, 'aliasMap');
} break;
case 'p5:link': { // more general then typeSpecialSimpleLink
// appInfo: {"simpleLink":{"@href":"index.php?MENU_INIT=POKAZ_OFERTY_AKTUALNE_FUNC&task=activate_deal&id_deal={ID}","@target":"_blank","@label":"Aktywuj umow\u0119 {ID}"}}
$columnConfig->type = 'p5:link';
$columnConfig->_appInfo = $acl->getXsdFieldParam($col, 'appInfo');
} break;
}
}
// @see ajaxHiddenColsSave
if (UserProfile::isHiddenColumn($acl->getID(), $fieldID)
|| ($gui__hideRefFields && 'ref:' === substr($columnConfig->xsdType, 0, strlen('ref:')))
) {
$columnConfig->hidden = true;
}
$columnConfig->description = $acl->getFieldOpis($col);
$jsonData->cols->{$col} = $columnConfig;
}
DBG::log($jsonData->cols, 'array', "\$jsonData->cols");
$jsonData->rows = array();
if ($acl instanceof AntAclBase) {
$params['f_is_instance'] = $acl->getNamespace();
}
$queryFeatures = $acl->buildQuery($params);
$jsonData->total = ('1' === V::get('SKIP_TOTAL', '', $args)) ? -1 : $queryFeatures->getTotal();
if ('1' === V::get('ONLY_TOTAL', '', $args)) {
$jsonData->type = 'success';
$jsonData->msg = 'pobrano nowe dane';
return $jsonData;
}
$listItems = $queryFeatures->getItems();
$primaryKeyField = $acl->getPrimaryKeyField();
$items = []; foreach ($listItems as $item) $items[ $item[$primaryKeyField] ] = $item;
// TODO: add virtual data by Typespecial
if (!empty($vCols) && !empty($items)) {
foreach ($vCols as $vColID => $vCol) {
$colType = $acl->getFieldTypeById($vColID);
if ($colType) continue;// pomin Typespecial dla realnych komorek w bazie danych
$typeSpecial = Typespecial::getInstance($vColID, $vCol);
if ($typeSpecial) {
$columnConfig = V::get($vCol, null, $jsonData->cols);
if ($columnConfig && !empty($columnConfig->_tsSimpleLink)) {
// pomin simple link values - mved to js render
} else {
DBG::log($typeSpecial, 'array', "Typespecial({$vColID})");
$ids = array_keys($items);
$specialValues = $typeSpecial->getValuesByIds($this->_zasobID, $ids);
DBG::log($specialValues, 'array', "Typespecial({$vColID}) \$specialValues");
if (!empty($specialValues)) foreach ($specialValues as $kItemID => $vValues) {
$tsValue = implode('
', $vValues);
DBG::log($items[$kItemID], 'array', "Typespecial({$vColID}) Item[{$kItemID}].{$vCol}");
if (!empty($items[$kItemID][$vCol]) && !empty($tsValue)) {
$items[$kItemID][$vCol] .= ": {$tsValue}";
} else {
$items[$kItemID][$vCol] = $tsValue;
}
}
}
}
}
}
{
if(V::get('DBG', '', $_GET)){$jsonData->__DBG__ = [];}
$p5Alias = [];
foreach ((array)$jsonData->cols as $fieldName => $conf) {
if ('p5:alias' == V::get('xsdType', '', $conf)) {
if(V::get('DBG', '', $_GET)){$jsonData->__DBG__[$fieldName] = $conf;}
$aliasType = $acl->getXsdFieldParam($fieldName, 'type');// 'type' => 'sql_table_alias',
if ('sql_table_alias' == $aliasType) {
$p5Alias[$fieldName] = (array)$conf;
$p5Alias[$fieldName]['type'] = 'sql_table_alias';
$p5Alias[$fieldName]['local_join_key'] = $acl->getXsdFieldParam($fieldName, 'local_join_key');// 'local_join_key' => 'ID',
$p5Alias[$fieldName]['remote_table_name'] = $acl->getXsdFieldParam($fieldName, 'remote_table_name');// 'remote_table_name' => 'CRM_LISTA_ZASOBOW_ORDERS_summary_view',
$p5Alias[$fieldName]['remote_join_key'] = $acl->getXsdFieldParam($fieldName, 'remote_join_key');// 'remote_join_key' => 'ID',
$p5Alias[$fieldName]['remote_column_value'] = $acl->getXsdFieldParam($fieldName, 'remote_column_value');// 'remote_column_value' => 'SUM_POS',
} else if ('sql_query_alias' == $aliasType) {
$p5Alias[$fieldName] = (array)$conf;
$p5Alias[$fieldName]['type'] = 'sql_query_alias';
$p5Alias[$fieldName]['local_join_key'] = $acl->getXsdFieldParam($fieldName, 'local_join_key');
$p5Alias[$fieldName]['join_query_format'] = $acl->getXsdFieldParam($fieldName, 'join_query_format');
}
}
}
if(V::get('DBG', '', $_GET)){$jsonData->__DBG__['$p5Alias'] = $p5Alias;}
if(V::get('DBG', '', $_GET)){$jsonData->__DBG__['$aliasValuesRaw'] = [];}
if ($p5Alias) {
$sqlLocalTableName = $acl->getRootTableName();
$primaryKeyField = $acl->getPrimaryKeyField();
foreach ($p5Alias as $fieldName => $conf) {
$aliasValuesRaw = [];
if ('sql_table_alias' == $conf['type']) {
$localKeys = [];
$localKeyName = V::get('local_join_key', '', $conf);
if ($localKeyName) {
if (!array_key_exists($localKeyName, $localKeys)) {
$localKeys[$localKeyName] = [];
foreach ($items as $item) {
$keyLocal = V::get($localKeyName, 0, $item);
if ($keyLocal) $localKeys[$localKeyName][] = DB::getPDO()->quote($keyLocal, PDO::PARAM_STR);
}
}
if(V::get('DBG', '', $_GET)){$jsonData->__DBG__['$localKeys'] = $localKeys;}
if (!empty($localKeys[$localKeyName])) {
$sqlRemoteTable = V::get('remote_table_name', '', $conf);
$sqlRemoteValueFieldName = V::get('remote_column_value', '', $conf);
$sqlRemoteKeyName = V::get('remote_join_key', '', $conf);
$sqlLocalKeyName = $acl->getSqlFieldName($localKeyName);
try {
$aliasValuesRaw = DB::getPDO()->fetchAllByKey("
select r.{$sqlRemoteKeyName} as {$sqlLocalKeyName}, r.{$sqlRemoteValueFieldName} as remote_value
from {$sqlRemoteTable} r
where r.{$sqlRemoteKeyName} in(" . implode(",", $localKeys[$localKeyName]) . ")
", $sqlLocalKeyName);
} catch (Exception $e) {
// TODO: error msg for GUI
DBG::log($e);
}
if(V::get('DBG', '', $_GET)){$jsonData->__DBG__['$aliasValuesRaw'][$fieldName] = $aliasValuesRaw;}
}
}
} else if ('sql_query_alias' == $conf['type']) {
$localKeys = [];
$localKeyName = V::get('local_join_key', '', $conf);
$sqlFormat = V::get('join_query_format', '', $conf);
if ($localKeyName && $sqlFormat) {
if (!array_key_exists($localKeyName, $localKeys)) {
$localKeys[$localKeyName] = [];
foreach ($items as $item) {
$keyLocal = V::get($localKeyName, 0, $item);
if ($keyLocal) $localKeys[$localKeyName][] = DB::getPDO()->quote($keyLocal, PDO::PARAM_STR);
}
}
}
if (!empty($localKeys[$localKeyName])) {
$sql = str_replace('{sql_in_local_join_key}', implode(",", $localKeys[$localKeyName]), $sqlFormat);
$sqlLocalKeyName = $acl->getSqlFieldName($localKeyName);
try {
$aliasValuesRaw = DB::getPDO()->fetchAllByKey($sql, $sqlLocalKeyName);
} catch (Exception $e) {
// TODO: error msg for GUI
DBG::log($e);
}
}
}
DBG::log($aliasValuesRaw, 'array', '$aliasValuesRaw');
if (!empty($aliasValuesRaw)) {
DBG::log($aliasValuesRaw, 'array', "DBG_P5: \$aliasValuesRaw");
array_walk($items, function (&$item) use ($fieldName, $sqlLocalKeyName, $aliasValuesRaw) {
$sqlValue = V::get($sqlLocalKeyName, null, $item);
DBG::log($sqlValue, 'array', "DBG_P5: \$sqlValue");
DBG::log($aliasValuesRaw[$sqlValue]['remote_value'], 'array', "DBG_P5: \$aliasValuesRaw[{$sqlValue}]['remote_value']");
DBG::log($item, 'array', "DBG_P5: \$item");
if ($sqlValue !== null && array_key_exists($sqlValue, $aliasValuesRaw)) {
DBG::log($aliasValuesRaw[$sqlValue]['remote_value'], 'array', "DBG_P5: TODO_update_value");
$item[$fieldName] = $aliasValuesRaw[$sqlValue]['remote_value'];
DBG::log($item[$fieldName], 'array', "DBG_P5: TODO_updated_value");
}
});
}
}
}
}
foreach ($items as $item) {
// TODO: hide items without 'R'
foreach ($visibleCols as $fieldName) {
// TODO: ID default 'R'
if (!$acl->canReadObjectField($fieldName, $item)) $item[$fieldName] = '*****';
// null => empty string
if (!isset($item[$fieldName]) || (!$item[$fieldName] && $item[$fieldName] !== '0')) {
// DBG::log($item[$fieldName], 'array', "isEmptyString[{$fieldName}]");
$item[$fieldName] = '';
}
}
$jsonData->rows[] = $item;
}
$jsonData->type = 'success';
$jsonData->msg = 'pobrano nowe dane';
// { // TODO: BUG - race condition in requests
// session_write_close();
// if (!empty($params['f_L_APPOITMENT_USER']) && strlen($params['f_L_APPOITMENT_USER']) === 3) sleep(2); // TODO: DBG
// if (!empty($params['f_L_APPOITMENT_USER']) && strlen($params['f_L_APPOITMENT_USER']) === 3) $jsonData->__DBG__sleep = 2; // TODO: DBG
// }
return $jsonData;
}
private function fixEmptyValueFromUser($fieldID) {// TODO: moved to TableAcl->fixEmptyValueFromUser
$value = '';
$type = $this->_acl->getFieldTypeById($fieldID);
if ($type) {
if ($type['type'] == 'date') {
$value = $type['default'];
}
// fix bug when field is unique and is null allowed: change empty string to null
if ($type['null']) {
$value = 'NULL';
}
// fix bug when field is enum and is set to '0': for php '0' is empty
if (substr($type['type'], 0, 4) == 'enum') {// && $args["f{$fieldID}"] === '0') {
if (false !== strpos($type['type'], "''")) {
// enum('', '1','2')
$value = '';
} else if (false !== strpos($type['type'], "'0'")) {
// enum('0', '1','2')
$value = '0';
} else {
$value = $type['default'];
}
}
}
return $value;
}
/**
* set hidden cols in $_SESSION['USER_PROFILE'][$this->_zasobID];
* $_SESSION['USER_PROFILE'][$this->_zasobID][fld_id] => boolean
*/
private function ajaxHiddenColsSave($args) { // $args[ idField ] => 'SHOW' | 'HIDE'
$response = new stdClass();
if (empty($args)) {
$response->type = 'info';
return $response;
}
UserProfile::load();
{
// clean up old, wrong values
if (array_key_exists("{$this->_tbl}_COLUMN", $_SESSION['USER_PROFILE'])) {
unset($_SESSION['USER_PROFILE']["{$this->_tbl}_COLUMN"]);
}
$fields = $this->_acl->getFieldListByIdZasob();
foreach ($fields as $idField => $fieldName) {
if (isset($args[$fieldName])) {
if ($args[$fieldName] == 'SHOW') {
UserProfile::setTableFieldVisible($this->_zasobID, $idField);
} else if ($args[$fieldName] == 'HIDE') {
UserProfile::setTableFieldHidden($this->_zasobID, $idField);
}
}
}
}
UserProfile::save();
$response->type = 'success';
return $response;
}
private function ajaxPageSizeSave($args) {
$response = new stdClass();
if (empty($args)) {
$response->type = 'info';
return $response;
}
$pageSize = V::get('pageSize', 0, $args, 'int');
UserProfile::load();
// clean up old, wrong values
if (array_key_exists("{$this->_tbl}_COLUMN", $_SESSION['USER_PROFILE'])) {
unset($_SESSION['USER_PROFILE']["{$this->_tbl}_COLUMN"]);
}
$tableAjaxSettings = UserProfile::getTableAjaxSettings();
$tableAjaxSettings['pageSize'] = $pageSize;
UserProfile::setTableAjaxSettings($tableAjaxSettings);
UserProfile::save();
$response->type = 'success';
return $response;
}
private function ajaxTheGeomSave($args) {
$primaryKeyField = $this->_acl->getPrimaryKeyField();
$primaryKey = V::get($primaryKeyField, 0, $args, 'int');
$polygon = V::get('polygon', 0, $args);
$geomFieldName = 'the_geom';
if ($primaryKey <= 0) {
throw new HttpException("Wrong param ID", 404);
}
// TODO: validate polygon - ex.: POLYGON((2072030.2315435 7234115.910678,2072029.4815435 7234093.660678,2072115.2315435 7234091.160678,2072115.4815435 7234113.660678,2072115.2315435 7234113.660678,2072094.2315435 7234113.910678,2072030.2315435 7234115.910678)))
$record = $this->_acl->buildQuery([])->getItem($primaryKey);
if (!$this->_acl->canWriteRecord($record) && !$this->_acl->hasPermSuperWrite()) {
throw new HttpException("Brak dostępu do rekordu", 403);
}
if (!$this->_acl->canWriteObjectField($geomFieldName, $record)) {
throw new HttpException("Brak dostępu do zapisu dla pola {$geomFieldName}", 403);
}
$itemPatch = array();
$itemPatch[$geomFieldName] = "GeomFromText('{$polygon}')";
$itemPatch[$primaryKeyField] = $primaryKey;
$response = new stdClass();
try {
$affected = $this->_acl->updateItem($itemPatch);
if ($affected > 0) {
$response->type = 'success';
$response->msg = "Rekord zapisany pomyślnie";//"Record saved successfully";
} else if ($affected == 0) {
$response->type = 'info';
$response->msg = "Nie wprowadzono żadnych zmian";
}
$response->record = $this->_acl->buildQuery([])->getItem($primaryKey);
}
catch (Exception $e) {
$response->type = 'error';
$response->msg = $e->getMessage();
}
return $response;
}
public function sendAjaxResponseJson($method, $args) {
try {
$response = $this->{$method}($args);
}
catch (HttpException $e) {
$response = new stdClass();
$response->type = 'error';
$response->msg = $e->getMessage();
$response->errorCode = $e->getCode();
Http::sendHeaderByCode($e->getCode());
}
catch (Exception $e) {
$response = new stdClass();
$response->type = 'error';
$response->msg = $e->getMessage();
$response->errorCode = $e->getCode();
}
header('Content-type: application/json');
if (!$response) $response = new stdClass();
echo json_encode($response);
exit;
}
}