_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" ]); // p5UI__buildDom $_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': return $this->sendAjaxResponseJson('ajax__EDIT_INLINE__Task', $_REQUEST); case 'EDIT_INLINE_SAVE': return $this->sendAjaxResponseJson('ajax__EDIT_INLINE_SAVE__Task', $_REQUEST); case 'COPY': return $this->sendAjaxResponseJson('ajax__CUPY__Task', $_REQUEST); case 'CREATE_SAVE': return $this->sendAjaxResponseJson('ajax__CREATE_SAVE__Task', $_REQUEST); // TODO: mv to _route = ViewTableAjax & _task = createSaveAjax case 'HIST': return $this->sendAjaxResponseJson('ajax__HIST__Task', $_REQUEST); 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': return $this->sendAjaxResponseJson('ajax__FILES_UPLOAD__Task', $_REQUEST); case 'FILES_LIST': return $this->sendAjaxResponseJson('ajax__FILES_LIST__Task', $_REQUEST); case 'filePermsRefresh': return $this->sendAjaxResponseJson('ajax__filePermsRefresh__Task', $_REQUEST); 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': return $this->sendAjaxResponseJson('ajax__HIDDEN_COLS_SAVE__Task', $_POST); case 'PAGE_SIZE_SAVE': return $this->sendAjaxResponseJson('ajax__PAGE_SIZE_SAVE__Task', $_POST); case 'THE_GEOM_SAVE': return $this->sendAjaxResponseJson('ajax__THE_GEOM_SAVE__Task', $_REQUEST); default: return $this->sendAjaxResponseJson('ajaxData', $_REQUEST); } } /** * ajax url: &_task=EDIT_INLINE * @param $rowID - $_GET['ID'] * @param $fieldName - $_GET['col'] */ private function ajax__EDIT_INLINE__Task() { // TODO: convert to fetch gui as struct (not raw html) like editFormJson $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); // DBG::log("ACL->canReadObjectField({$fieldName}) value({$fieldVal})"); } else { $fieldVal = '*****'; // DBG::log("ACL->canReadObjectField({$fieldName}) value({$fieldVal})"); } $fieldVal = V::get("f{$fieldID}", $fieldVal, $_POST); // DBG::log("ACL->canReadObjectField({$fieldName}) value({$fieldVal}) after 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 '
'; } } // DBG::log("ACL->canReadObjectField({$fieldName}) value({$fieldVal}) end - TODO: showFormItem"); ?> _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 ajax__EDIT_INLINE_SAVE__Task($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); ?>
Edycja rekordu Nr $vCol) : ?> canWriteObjectField($vCol['name'], $record)) : ?>
true, 'tabindex'=>(++$tabindex), 'maxGrid'=>8); if (!empty($tsValues[$kID])) { $fieldParams['typespecialValue'] = $tsValues[$kID]; } echo $acl->showFormItem('W', $kID, "f{$kID}", $cols[$kID], $fieldParams, $record); ?>
canReadObjectField($vCol['name'], $record)) : ?>

showFormItem('R', $kID, "f{$kID}", $cols[$kID], array('appendBack'=>true), $record); if (!empty($tsValues[$kID])) { echo $tsValues[$kID]; } else if (!empty($record[ $vCol['name'] ])) { echo $record[ $vCol['name'] ]; } ?>

_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']; } ?>
Dodaj nowy rekord $vCol) : ?> canCreateField($vCol['name'])) : ?>
true, 'tabindex'=>(++$tabindex), 'maxGrid'=>8); echo $acl->showFormItem('C', $kID, "f{$kID}", $cols[$kID], $fieldParams); ?>
_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 ajax__CUPY__Task($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) { DBG::log($e); $response->type = 'error'; $response->msg = "Wystąpiły błędy!"; $response->msg = $e->getMessage(); } return $response; } private function ajax__HIST__Task($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 ajax__FILES_UPLOAD__Task($args) { $id = V::get('ID', 0, $args, 'int'); if ($id <= 0) throw new HttpException("404", 404); $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)) { $toUpdate = [ 'M_DIST_FILES' => "Wgrano plik {$uploadedFileName}", 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(), 'A_RECORD_UPDATE_DATE' => "NOW()", ]; DB::getPDO($this->_acl->getDB())->update($this->_tbl, 'ID', $record['ID'], $toUpdate); DB::getPDO($this->_acl->getDB())->insert("{$this->_tbl}_HIST", array_merge($toUpdate, [ 'ID_USERS2' => $record['ID'], ])); } return $retJson; } public function ajax__FILES_LIST__Task($args) { $id = V::get('ID', 0, $args, 'int'); if ($id <= 0) throw new HttpException("404", 404); $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 ajax__filePermsRefresh__Task($args) { $id = V::get('ID', 0, $args, 'int'); if ($id <= 0) throw new HttpException("Wrong param ID", 404); $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); 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 "; } try { DB::getPDO()->execSql($sql); } catch (Exception $e) { DBG::log($e); 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)); $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; $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 ajax__HIDDEN_COLS_SAVE__Task 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(); // check instances turned off @see: ACL::fetchBackRefs } $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 ajax__HIDDEN_COLS_SAVE__Task($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 ajax__PAGE_SIZE_SAVE__Task($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 ajax__THE_GEOM_SAVE__Task($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; } }