diff --git a/gulliver/methods/pagedTableAjax.php b/gulliver/methods/pagedTableAjax.php index 37d343798..57186acfd 100755 --- a/gulliver/methods/pagedTableAjax.php +++ b/gulliver/methods/pagedTableAjax.php @@ -30,7 +30,7 @@ G::LoadAllPluginModelClasses(); require_once ( 'classes/class.xmlfield_InputPM.php' ); $id=get_ajax_value('ptID'); - $ntable= unserialize($_SESSION['pagedTable['.$id.']']); + $ntable = unserialize(base64_decode($_SESSION['pagedTable[' . $id . ']'])); $page=get_ajax_value('page'); $function=get_ajax_value('function'); diff --git a/gulliver/methods/propelTableAjax.php b/gulliver/methods/propelTableAjax.php index d76a17f72..5d6813dbb 100755 --- a/gulliver/methods/propelTableAjax.php +++ b/gulliver/methods/propelTableAjax.php @@ -30,7 +30,7 @@ G::LoadAllPluginModelClasses(); require_once ( 'classes/class.xmlfield_InputPM.php' ); $id = get_ajax_value('ptID'); - $ntable= unserialize($_SESSION['pagedTable['.$id.']']); + $ntable = unserialize(base64_decode($_SESSION['pagedTable[' . $id . ']'])); $page = get_ajax_value('page'); $function = get_ajax_value('function'); diff --git a/gulliver/system/class.pagedTable.php b/gulliver/system/class.pagedTable.php index 9439bbcfe..20de73aef 100755 --- a/gulliver/system/class.pagedTable.php +++ b/gulliver/system/class.pagedTable.php @@ -1018,7 +1018,7 @@ class pagedTable unset( $this->tpl ); unset( $this->dbc ); unset( $this->ses ); - $_SESSION['pagedTable[' . $this->id . ']'] = serialize( $this ); + $_SESSION['pagedTable[' . $this->id . ']'] = base64_encode(serialize($this)); return; } diff --git a/workflow/engine/classes/class.propelTable.php b/workflow/engine/classes/class.propelTable.php index afdf59f4b..c5fef27fa 100755 --- a/workflow/engine/classes/class.propelTable.php +++ b/workflow/engine/classes/class.propelTable.php @@ -1,916 +1,916 @@ -. - * - * For more information, contact Colosa Inc, 2566 Le Jeune Rd., - * Coral Gables, FL, 33134, USA, or email info@colosa.com. - * - */ - -G::LoadClass( 'filterForm' ); -G::LoadClass( 'xmlMenu' ); -G::LoadClass( "BasePeer" ); -G::LoadClass( "ArrayPeer" ); - -/** - * Class pagedTable - * - * @author David S. Callizaya S. * - * @access public - * @package workflow.gulliver.system - * dependencies TemplatePower Form XmlForm - */ - -class propelTable -{ - public $xmlFormFile; - public $currentPage; - public $orderBy = ''; - public $filter = array (); - public $filterType = array (); - public $searchBy = ''; - public $fastSearch = ''; - public $order = ''; - public $template = 'templates/paged-table.html'; - public $tpl; - public $style = array (); - public $rowsPerPage = 25; - public $ownerPage; - public $popupPage; - public $popupSubmit; - public $popupWidth = 450; - public $popupHeight = 200; - public $ajaxServer; - public $fields; - public $query; - public $totPages; - public $totRows; - public $sortable = '1'; - - //SQL QUERIES - public $criteria; - public $sql = ''; - public $sqlWhere = ''; - public $sqlGroupBy = ''; - public $sqlSelect = 'SELECT 1'; - public $sqlDelete = ''; - public $sqlInsert = ''; - public $sqlUpdate = ''; - public $fieldDataList = ''; - - //Configuration - public $xmlPopup = ''; - public $addRow = false; - public $deleteRow = false; - public $editRow = false; - public $notFields = ' title button linknew begingrid2 endgrid2 '; // These are not considered to build the sql queries (update,insert,delete) - - - //JavaScript Object attributes - public $onUpdateField = ""; - public $onDeleteField = ""; - public $afterDeleteField = ""; - public $onInsertField = ""; - - //New gulliver - public $xmlForm; - public $menu = ''; - public $filterForm = ''; - public $filterForm_Id = ''; - public $name = 'pagedTable'; - public $id = 'A1'; - public $disableFooter = false; - //This attribute is used to set STYLES to groups of TD, using the field type "cellMark" (see XmlForm_Field_cellMark) - public $tdStyle = ''; - public $tdClass = ''; - //Config Save definition - public $__Configuration = 'orderBy,filter,fastSearch,style/*/showInTable'; //order,rowsPerPage,disableFooter'; - - - //Variable for MasterDetail feature - public $masterdetail = ''; - public $title; - - /** - * Function prepareQuery - * - * @author David S. Callizaya S. - * @access public - * @param string $limitPage - * @return string - */ - public function prepareQuery ($limitPage = false) - { - // process the QuickSearch string and add the fields and expression needed to run the search - if ($this->searchBy !== '') { - $aSB = explode( '|', $this->searchBy ); //fields are separated by pipes - //subfilter - $subFilter = ''; - foreach ($aSB as $sBy) { - $subFilter .= ($subFilter !== '') ? ' OR ' : ''; - //TODO: Get DATABASE type from Criteria, I think sql delimeter is needed too - $subFilter .= $sBy . ' LIKE "%' . G::sqlEscape( $this->fastSearch ) . '%"'; - } - if ($subFilter !== '') { - //Get the first defined table in Criteria. - $aCurrentTables = $this->criteria->getTables(); - if (isset( $aCurrentTables[0] )) { - $this->criteria->add( $aCurrentTables[0] . ".*", '(' . $subFilter . ')', Criteria::CUSTOM ); - } - } - } - - //Merge sort array defined by USER with the array defined by SQL - parse_str( $this->order, $orderFields ); - parse_str( $this->orderBy, $orderFields2 ); - //User sort is more important (first in merge). - $orderFields3 = array_merge( $orderFields2, $orderFields ); - //User sort is overwrites XMLs definition. - $orderFields = array_merge( $orderFields3, $orderFields2 ); - //Order (BY SQL DEFINITION AND USER'S DEFINITION) - $this->aOrder = array (); - $order = ''; - foreach ($orderFields as $field => $fieldOrder) { - $field = G::getUIDName( $field, '' ); - $fieldOrder = strtoupper( $fieldOrder ); - if ($fieldOrder === 'A') { - $fieldOrder = 'ASC'; - } - if ($fieldOrder === 'D') { - $fieldOrder = 'DESC'; - } - switch ($fieldOrder) { - case 'ASC': - case 'DESC': - if ($order !== '') { - $order .= ', '; - } - $order .= $field . ' ' . $fieldOrder; - $this->aOrder[$field] = $fieldOrder; - } - } - //master detail :O - if (count( $this->masterdetail ) > 0) { - $this->criteria->clearOrderByColumns(); - foreach ($this->masterdetail as $idMasterDetail => $fieldMasterDetail) { - $this->criteria->addAscendingOrderByColumn( $fieldMasterDetail ); - } - } - if (! empty( $this->aOrder )) { - if (count( $this->masterdetail ) <= 0) { - $this->criteria->clearOrderByColumns(); - } - foreach ($this->aOrder as $field => $ascending) { - if ($ascending == 'ASC') { - $this->criteria->addAscendingOrderByColumn( $field ); - } else { - $this->criteria->addDescendingOrderByColumn( $field ); - } - } - } - /** - * Add limits - */ - $this->criteria->setLimit( 0 ); - $this->criteria->setOffset( 0 ); - if ($this->criteria->getDbName() == 'dbarray') { - $this->totRows = ArrayBasePeer::doCount( $this->criteria ); - } else { - $this->totRows = GulliverBasePeer::doCount( $this->criteria ); - } - $this->totPages = ceil( $this->totRows / $this->rowsPerPage ); - if ($limitPage) { - $this->criteria->setLimit( $this->rowsPerPage ); - $this->criteria->setOffset( ($this->currentPage - 1) * $this->rowsPerPage ); - } - return; - } - - /** - * Function setupFromXmlform - * - * @author David S. Callizaya S. - * editedby Hugo Loza - * @access public - * @param eter string xmlForm - * @return string - */ - public function setupFromXmlform ($xmlForm) - { - $this->xmlForm = $xmlForm; - //Config - $this->name = $xmlForm->name; - $this->id = $xmlForm->id; - //$this->sqlConnection=((isset($this->xmlForm->sqlConnection))?$this->xmlForm->sqlConnection:''); - if (isset( $_GET['page'] )) { - $this->currentPage = $_GET['page']; - } else { - $this->currentPage = 1; - } - if (isset( $_GET['order'] )) { - $this->orderBy = urldecode( $_GET['order'] ); - } else { - $this->orderBy = ""; - } - if (isset( $_GET['filter'] )) { - $this->filter = urldecode( $_GET['filter'] ); - } else { - $this->filter = ""; - } - if ($xmlForm->ajaxServer != '') { - $this->ajaxServer = G::encryptLink( $xmlForm->ajaxServer ); - } else { - $this->ajaxServer = G::encryptLink( '../gulliver/propelTableAjax' ); - } - $this->ownerPage = G::encryptLink( SYS_CURRENT_URI ); - // Config attributes from XMLFORM file - $myAttributes = get_class_vars( get_class( $this ) ); - foreach ($this->xmlForm->xmlform->tree->attribute as $atrib => $value) { - if (array_key_exists( $atrib, $myAttributes )) { - eval( 'settype($value, gettype($this->' . $atrib . '));' ); - if ($value !== '') { - eval( '$this->' . $atrib . '=$value;' ); - } - } - } - if ($this->masterdetail != "") { - $this->masterdetail = explode( ",", $this->masterdetail ); - foreach ($this->masterdetail as $keyMasterDetail => $valueMasterDetail) { - $this->masterdetail[$keyMasterDetail] = trim( $valueMasterDetail ); - } - } else { - $this->masterdetail = array (); - } - //Prepare the fields - $this->style = array (); - $this->gridWidth = ""; - $this->gridFields = ""; - $this->fieldsType = array (); - foreach ($this->xmlForm->fields as $f => $v) { - $r = $f; - $this->fields[$r]['Name'] = $this->xmlForm->fields[$f]->name; - $this->fields[$r]['Type'] = $this->xmlForm->fields[$f]->type; - if (isset( $this->xmlForm->fields[$f]->size )) { - $this->fields[$r]['Size'] = $this->xmlForm->fields[$f]->size; - } - $this->fields[$r]['Label'] = $this->xmlForm->fields[$f]->label; - } - //Set the default settings - $this->defaultStyle(); - //continue with the setup - $this->gridWidth = ''; - $this->gridFields = ''; - foreach ($this->xmlForm->fields as $f => $v) { - $r = $f; - //Parse the column properties - foreach ($this->xmlForm->fields[$f] as $attribute => $value) { - if (! is_object( $value )) { - $this->style[$r][$attribute] = $value; - } - } - //Needed for javascript - //only the visible columns's width and name are stored - if ($this->style[$r]['showInTable'] != '0') { - $this->gridWidth .= ',' . $this->style[$r]['colWidth']; - $this->gridFields .= ',"form[' . $this->fields[$r]['Name'] . ']"'; - } - } - $totalWidth = 0; - foreach ($this->fields as $r => $rval) { - if ($this->style[$r]['showInTable'] != '0') { - $totalWidth += $this->style[$r]['colWidth']; - } - } - $this->totalWidth = $totalWidth; - } - - /** - * Function count - * - * @author David S. Callizaya S. - * @access public - * @return string - */ - public function count () - { - $this->prepareQuery(); - return $this->totRows; - } - - /** - * Function renderTitle - * - * @author David S. Callizaya S. - * @access public - * @return string - */ - public function renderTitle () - { - //fix the bug about showing hidden fields in propel table. - foreach ($this->fields as $r => $rval) { - if ($this->style[$r]['type'] == 'hidden') { - $this->style[$r]['showInTable'] = '0'; - } - } - - //Render headers - $this->colCount = 0; - $this->shownFields = '['; - foreach ($this->fields as $r => $rval) { - if (($this->style[$r]['showInTable'] != '0') && (! (in_array( $this->fields[$r]['Name'], $this->masterdetail )))) { - //if (($this->style[$r]['showInTable'] != '0' )) - $this->tpl->newBlock( "headers" ); - - $sortDir = "ASC"; - - if (isset($this->aOrder[$this->fields[$r]["Name"]])) { - $sortDir = ($this->aOrder[$this->fields[$r]["Name"]] == "ASC")? "DESC" : "ASC"; - } - - if ($this->style[$r]['titleVisibility'] != '0') { - $this->style[$r]["href"] = "javascript:;"; - $this->style[$r]["onsort"] = $this->id . ".doSort(\"" . G::createUID("", $this->fields[$r]["Name"]) . "\", \"" . (($this->sortable == "0")? "" : $sortDir) . "\"); return false;"; - } else { - $this->style[$r]["href"] = "javascript:;"; - $this->style[$r]['onsort'] = 'return false;'; - } - if (isset( $this->style[$r]['href'] )) { - $this->tpl->assign( "href", $this->style[$r]['href'] ); - } - if (isset( $this->style[$r]['onsort'] )) { - $this->tpl->assign( "onsort", htmlentities( $this->style[$r]['onsort'], ENT_QUOTES, 'UTF-8' ) ); - } - - /* BUG 8080 - erik: don't setup onclick on page table header, doesn't have sense and causing problems - if (isset($this->style[$r]['onclick'])) - $this->tpl->assign( "onclick" , htmlentities( $this->style[$r]['onclick'] , ENT_QUOTES, 'UTF-8' ) ); - */ - - if (isset( $this->style[$r]['colWidth'] )) { - $this->tpl->assign( "width", $this->style[$r]['colWidth'] ); - } - if (isset( $this->style[$r]['colWidth'] )) { - $this->tpl->assign( "widthPercent", ($this->style[$r]['colWidth'] * 100 / $this->totalWidth) . "%" ); - //Hook for special skin with RTL languajes - } - if (defined( 'SYS_LANG_DIRECTION' ) && SYS_LANG_DIRECTION == 'R') { - $this->style[$r]['titleAlign'] = 'right'; - } - if (isset( $this->style[$r]['titleAlign'] )) { - $this->tpl->assign( "align", 'text-align:' . $this->style[$r]['titleAlign'] . ';' ); - } - if ($this->style[$r]['titleVisibility'] != '0') { - $sortDirImg = ""; - - if (isset($this->aOrder[$this->fields[$r]["Name"]])) { - $sortDirImg = ($this->aOrder[$this->fields[$r]["Name"]] == "ASC")? "" : ""; - } - - $this->tpl->assign("header", $this->fields[$r]["Label"] . $sortDirImg); - $this->tpl->assign("displaySeparator", ($this->colCount == 0 || !isset($this->fields[$r]["Label"]) || $this->fields[$r]["Label"] == "")? "display: none;" : ""); - } else { - $this->tpl->assign( 'displaySeparator', 'display:none;' ); - } - $this->colCount += 2; - $this->shownFields .= ($this->shownFields !== '[') ? ',' : ''; - $this->shownFields .= '"' . $r . '"'; - } - } - $this->shownFields .= ']'; - } - - /** - * Function renderField - * - * @author David S. Callizaya S. - * @access public - * @param eter string row - * @param eter string r - * @param eter string result - * @return string - */ - public function renderField ($row, $r, $result) - { - global $G_DATE_FORMAT; - //to do: special content?? - //$result['row__'] = $row; //Special content: - $styleData = $this->style[$r]; - $fielDataName = $styleData['data']; - $fieldClassName = isset( $styleData['colClassName'] ) && ($styleData['colClassName']) ? $styleData['colClassName'] : $this->tdClass; - if ($fielDataName != '') { - $value = ((isset( $result[$fielDataName] )) ? $result[$fielDataName] : ''); - } else { - $value = $this->fields[$r]['Label']; - } - $this->tpl->newBlock( "field" ); - $this->tpl->assign( 'width', $this->style[$r]['colWidth'] ); - $classAttr = (trim( $fieldClassName ) != '') ? " class=\"$fieldClassName\"" : ''; - $this->tpl->assign( 'classAttr', $classAttr ); - //to do: style is needed or not? - //$this->tpl->assign('style', $this->tdStyle); - $alignAttr = (isset( $this->style[$r]['align'] ) && strlen( $this->style[$r]['align'] > 0 )) ? " align=\"" . $this->style[$r]['align'] . "\"" : ''; - $this->tpl->assign( "alignAttr", $alignAttr ); - $fieldName = $this->fields[$r]['Name']; - $fieldClass = get_class( $this->xmlForm->fields[$fieldName] ); - /** - * * BEGIN : Reeplace of @@, @%,... - * in field's attributes like onclick, link, - */ - if (isset( $this->xmlForm->fields[$this->fields[$r]['Name']]->link )) { - $this->xmlForm->fields[$this->fields[$r]['Name']]->link = G::replaceDataField( $this->style[$r]['link'], $result ); - } - if (isset( $this->xmlForm->fields[$fieldName]->value )) { - $this->xmlForm->fields[$fieldName]->value = G::replaceDataField( $styleData['value'], $result ); - } - /** - * * END : Reeplace of @@, @%,... - */ - /** - * * Rendering of the field - */ - $this->xmlForm->fields[$fieldName]->mode = 'view'; - $this->xmlForm->setDefaultValues(); - $this->xmlForm->setValues( $result ); - //var_dump($fieldName, $fieldClass );echo '

'; - if (array_search( 'renderTable', get_class_methods( $fieldClass ) ) !== false) { - if ($value == '-') { - $htmlField = $value; - } else { - $htmlField = $this->xmlForm->fields[$fieldName]->renderTable( $value, $this->xmlForm, true ); - } - if (is_object( $value )) { - $value = ''; - } - // checking if the value variable is a html field, a html tag content can't contain   as white spaces - $testValue = preg_match( "/(.*)<\/a>/i", $htmlField, $value ); - $this->tpl->assign( "value", $htmlField ); - if ($testValue > 0 && (isset( $value[1] ) && strlen( trim( $value[1] ) ) == 0)) { - if ((trim( $value[0] )) == '') { - $this->tpl->assign( "value", " " ); - } - // $this->tpl->assign( "value" , (preg_match('^[[:space:]]^', $value) && (substr($fieldName,0,3)!="PRO"))? str_ireplace(" "," ",$htmlField):$htmlField ); - } else { - $this->tpl->assign( "value", $htmlField ); - } - - /* $testValue = preg_match( "/<\/?\w+((\s+(\w|\w[\w-]*\w)(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i", $value, $matches ); */ - // if (empty($matches)){ - // $this->tpl->assign( "value" , (preg_match('^[[:space:]]^', $value) && (substr($fieldName,0,3)!="PRO"))? str_ireplace(" "," ",$htmlField):$htmlField ); - // } else { - // $this->tpl->assign( "value" , $htmlField ); - // } - } - return $this->fields[$r]['Type']; - } - - /** - * Function defaultStyle - * - * @author David S. Callizaya S. - * @access public - * @return string - */ - public function defaultStyle () - { - foreach ($this->fields as $r => $rval) { - $this->style[$r] = array ('showInTable' => '1','titleVisibility' => '1','colWidth' => '150','onclick' => '','event' => '' - ); - //Some widths - if (! (strpos( ' date linknew ', ' ' . $this->fields[$r]['Type'] . ' ' ) === false)) { - $this->style[$r]['colWidth'] = '70'; - } - //Data source: - if (! (strpos( ' title button linknew image-text jslink ', ' ' . $this->fields[$r]['Type'] . ' ' ) === false)) { - $this->style[$r]['data'] = ''; //If the control is a link it shows the label - } else { - $this->style[$r]['data'] = $this->fields[$r]['Name']; //ELSE: The data value for that field - //Hidden fields - } - if (! isset( $this->style[$r]['showInTable'] )) { - if (! (strpos( ' title button endgrid2 submit password ', ' ' . $this->fields[$r]['Type'] . ' ' ) === false)) { - $this->style[$r]['showInTable'] = '0'; - } else { - $this->style[$r]['showInTable'] = '1'; - } - } - //Hidden titles - if (! (strpos( ' linknew button link endgrid2 ', ' ' . $this->fields[$r]['Type'] . ' ' ) === false)) { - $this->style[$r]['titleVisibility'] = '0'; - } - //Align titles - $this->style[$r]['titleAlign'] = 'center'; - //Align fields - if (defined( 'SYS_LANG_DIRECTION' ) && SYS_LANG_DIRECTION == 'R') { - $this->style[$r]['align'] = 'right'; - } else { - $this->style[$r]['align'] = 'left'; - } - if (! (strpos( ' linknew date ', ' ' . $this->fields[$r]['Type'] . ' ' ) === false)) { - $this->style[$r]['align'] = 'center'; - } - } - // Adjust the columns width to prevent overflow the page width - //Render headers - $totalWidth = 0; - foreach ($this->fields as $r => $rval) { - if ($this->style[$r]['showInTable'] != '0') { - $totalWidth += $this->style[$r]['colWidth']; - } - } - $this->totalWidth = $totalWidth; - $maxWidth = 1800; - $proportion = $totalWidth / $maxWidth; - if ($proportion > 1) { - $this->totalWidth = 1800; - } - if ($proportion > 1) { - foreach ($this->fields as $r => $rval) { - if ($this->style[$r]['showInTable'] != '0') { - $this->style[$r]['colWidth'] = $this->style[$r]['colWidth'] / $proportion; - } - } - } - } - - /** - * Function renderTable - * - * @author David S. Callizaya S. - * @param eter $block : = 'content'(Prints contentBlock only) - * @access public - * @return string - */ - public function renderTable ($block = '', $fields = '') - { - G::LoadSystem('inputfilter'); - $filter = new InputFilter(); - $fields = $filter->xssFilterHard($fields); - $this->orderBy = $filter->xssFilterHard($this->orderBy); - $this->currentPage = $filter->xssFilterHard($this->currentPage); - - //Render Title - $thereisnotitle = true; - foreach ($this->fields as $r => $rval) { - if ($this->fields[$r]['Type'] === 'title') { - $this->title = $this->fields[$r]['Label']; - unset( $this->fields[$r] ); - $thereisnotitle = false; - } - } - if ($thereisnotitle) { - $this->title = ''; - } - $oHeadPublisher = & headPublisher::getSingleton(); - $oHeadPublisher->addInstanceModule( 'leimnud', 'panel' ); - $time_start = microtime( true ); - $this->prepareQuery( true ); - $time_end = microtime( true ); - $time = $time_end - $time_start; - // verify if there are templates folders registered, template and method folders are the same - $folderTemplate = explode( '/', $this->template ); - $oPluginRegistry = & PMPluginRegistry::getSingleton(); - if ($oPluginRegistry->isRegisteredFolder( $folderTemplate[0] )) { - $templateFile = PATH_PLUGINS . $this->template . '.html'; - } else { - $templateFile = PATH_TPL . $this->template . '.html'; - // Prepare the template - } - $this->tpl = new TemplatePower( $templateFile ); - $this->tpl->prepare(); - if (is_array( $fields )) { - foreach ($fields as $key => $val) { - $this->tpl->assignGlobal( $key, $val ); //Changed to Global by JHL on Dec 14,2009.. then thes fields are available for all Blocks - } - } - /** - * ******** HEAD BLOCK ************** - */ - if (($block === '') || ($block === 'head')) { - $this->tpl->newBlock( 'headBlock' ); - $this->tpl->assign( 'pagedTable_Id', $this->id ); - $this->tpl->assign( 'pagedTable_Name', $this->name ); - $this->tpl->assign( 'pagedTable_Height', $this->xmlForm->height ); - $this->tpl->assign( "title", $this->title ); - - $this->xmlForm->home = $filter->xssFilterHard($this->xmlForm->home); - $this->filterForm = $filter->xssFilterHard($this->filterForm); - $this->menu = $filter->xssFilterHard($this->menu); - - if (file_exists( $this->xmlForm->home . $this->filterForm . '.xml' )) { - $filterForm = new filterForm( $this->filterForm, $this->xmlForm->home ); - if ($this->menu === '') { - $this->menu = 'gulliver/pagedTable_Options'; - } - } - if (file_exists( $this->xmlForm->home . $this->menu . '.xml' )) { - $menu = new xmlMenu( $this->menu, $this->xmlForm->home ); - $this->tpl->newBlock( 'headerBlock' ); - $template = PATH_CORE . 'templates' . PATH_SEP . $menu->type . '.html'; - $menu->setValues( $this->xmlForm->values ); - $menu->setValues( array ('PAGED_TABLE_ID' => $this->id - ) ); - if (isset( $filterForm->name )) { - $menu->setValues( array ('SEARCH_FILTER_FORM' => $filterForm->name - ) ); - } - $this->tpl->assign( 'content', $menu->render( $template, $scriptCode ) ); - $oHeadPublisher->addScriptFile( $menu->scriptURL ); - $oHeadPublisher->addScriptCode( $scriptCode ); - } - if (file_exists( $this->xmlForm->home . $this->filterForm . '.xml' )) { - $this->tpl->newBlock( 'headerBlock' ); - $this->filterForm_Id = $filterForm->id; - $filterForm->type = 'filterform'; - $filterForm->ajaxServer = '../gulliver/defaultAjax'; - $template = PATH_CORE . 'templates/' . $filterForm->type . '.html'; - $filterForm->setValues( $this->xmlForm->values ); - $filterForm->setValues( array ('PAGED_TABLE_ID' => $this->id - ) ); - $filterForm->setValues( array ('PAGED_TABLE_FAST_SEARCH' => $this->fastSearch - ) ); - $this->tpl->assign( 'content', $filterForm->render( $template, $scriptCode ) ); - $oHeadPublisher->addScriptFile( $filterForm->scriptURL ); - $oHeadPublisher->addScriptCode( $scriptCode ); - if (isset( $_SESSION )) { - $_SESSION[$filterForm->id] = $filterForm->values; - } - } - - } - - /** - * ******** CONTENT BLOCK ************** - */ - if (($block === '') || ($block === 'content')) { - $this->tpl->newBlock( 'contentBlock' ); - $this->tpl->assign( 'gridWidth', '=[' . substr( $this->gridWidth, 1 ) . ']' ); - $this->tpl->assign( 'fieldNames', '=[' . substr( $this->gridFields, 1 ) . ']' ); - $this->tpl->assign( 'ajaxUri', '="' . addslashes( $this->ajaxServer ) . '"' ); - $this->tpl->assign( 'currentUri', '="' . addslashes( $this->ownerPage ) . '"' ); - $this->tpl->assign( 'currentOrder', '="' . addslashes( $this->orderBy ) . '"' ); - $this->tpl->assign( 'currentPage', '=' . $this->currentPage ); - $this->tpl->assign( 'currentFilter', '="' . '"' ); - $this->tpl->assign( 'totalRows', '=' . $this->totRows ); - $this->tpl->assign( 'rowsPerPage', '=' . $this->rowsPerPage ); - $this->tpl->assign( 'popupPage', '="' . addslashes( $this->popupPage ) . '"' ); - $this->tpl->assign( 'popupWidth', '=' . $this->popupWidth ); - $this->tpl->assign( 'popupHeight', '=' . $this->popupHeight ); - $this->tpl->assign( 'pagedTable_Id', $this->id ); - $this->tpl->assign( 'pagedTable_Name', $this->name ); - $this->tpl->assign( "pagedTable_JS", "{$this->id}.element=document.getElementById('pagedtable[{$this->id}]');" ); - $this->renderTitle(); - //Render rows - if ($this->criteria->getDbName() == 'dbarray') { - $rs = ArrayBasePeer::doSelectRs( $this->criteria ); - } else { - $rs = GulliverBasePeer::doSelectRs( $this->criteria ); - } - $rs->setFetchmode( ResultSet::FETCHMODE_ASSOC ); - /* - print "
"; - $rs->next(); - $row = $rs->getRow(); - while ( is_array ( $row ) ) { - print ""; - foreach ( $row as $k=>$v ) print ""; - print ""; - $rs->next(); - $row = $rs->getRow(); - } - print "
$v
"; die;*/ - $gridRows = 0; - $rs->next(); - //Initialize the array of breakFields for Master Detail View - foreach ($this->masterdetail as $keyMasterDetail => $fieldMasterDetail) { - $breakField[$fieldMasterDetail] = "novaluehere"; - } - $breakFieldKeys = array_flip( $this->masterdetail ); - for ($j = 0; $j < $rs->getRecordCount(); $j ++) { - $result = $rs->getRow(); - $rs->next(); - $gridRows ++; - $this->tpl->newBlock( "row" ); - $this->tpl->assign( "class", "Row" . (($j % 2) + 1) ); - $this->tdStyle = ''; - $this->tdClass = ''; - //Start Master Detail: This enable the MasterDEtail view. By JHL November 2008 - if (count( $this->masterdetail ) > 0) { - //TODO: Validate if there is a Field that doesn't exist - //TODO: Style - //TODO: Improve Collapse function.... - foreach ($this->masterdetail as $keyMasterDetail => $fieldMasterDetail) { - if ($breakField[$fieldMasterDetail] != $result[$fieldMasterDetail]) { - $this->tpl->newBlock( "rowMaster" ); - $this->tpl->newBlock( "fieldMaster" ); - $this->tpl->assign( "alignAttr", " colspan=" . (count( $this->fields ) * 2) ); - $this->tpl->assign( "value", $this->fields[$fieldMasterDetail]['Label'] == "" ? "" : $this->fields[$fieldMasterDetail]['Label'] . ": " . $this->xmlForm->fields[$fieldMasterDetail]->renderTable( $result[$fieldMasterDetail], $this->xmlForm, true ) ); - $breakField[$fieldMasterDetail] = $result[$fieldMasterDetail]; - for ($i = $breakFieldKeys[$fieldMasterDetail] + 1; $i < count( $breakField ); $i ++) { - $breakField[$this->masterdetail[$i]] = "novaluehere"; - } - $rowName = array (); - foreach ($breakField as $key => $value) { - if ($value != "novaluehere") { - $rowName[$key] = $key . "_" . $value; - } - } - $this->tpl->assign( "masterRowName", implode( ",", $rowName ) ); - $this->tpl->assign( 'pagedTable_Name', $this->name ); - $many = ""; - $this->tpl->assign( "value1", str_pad( $many, count( $rowName ) - 1, "-" ) ); - $this->tpl->gotoblock( "rowMaster" ); - $this->tpl->assign( "masterRowName", "_MD_" . implode( ",", $rowName ) ); - $this->tpl->assign( "masterRowClass", $keyMasterDetail == 0 ? "masterDetailMain" : "masterDetailOther" ); - } - } - $this->tpl->gotoblock( "row" ); - if (! isset( $rowName )) { - $rowName = array (); - } - $this->tpl->assign( "rowName", implode( ",", $rowName ) ); - } - //End Master Detail: This enable the MasterDEtail view - //Merge $result with $xmlForm values (for default valuesSettings) - if (is_array( $this->xmlForm->values )) { - $result = array_merge( $this->xmlForm->values, $result ); - } - foreach ($this->fields as $r => $rval) { - if (strcasecmp( $this->fields[$r]['Type'], 'cellMark' ) == 0) { - $result1 = $result; - $result1['row__'] = $j + 1; - $result1 = array_merge( $this->xmlForm->values, $result1 ); - $this->xmlForm->setDefaultValues(); - $this->xmlForm->setValues( $result1 ); - $this->tdStyle = $this->xmlForm->fields[$this->fields[$r]['Name']]->tdStyle( $result1, $this->xmlForm ); - $this->tdClass = $this->xmlForm->fields[$this->fields[$r]['Name']]->tdClass( $result1, $this->xmlForm ); - } elseif ($this->style[$r]['showInTable'] != '0') { - if (($this->style[$r]['showInTable'] != '0') && (! (in_array( $this->fields[$r]['Name'], $this->masterdetail )))) { - $this->renderField( $j + 1, $r, $result ); - } - } - } - } - - $strjsCurrentOrder = $this->id . ".currentOrder = '" . addslashes($this->orderBy) . "';"; - - $this->tpl->assign( '_ROOT.gridRows', '=' . $gridRows ); //number of rows in the current page - $this->tpl->newBlock( 'rowTag' ); - $this->tpl->assign( 'rowId', 'insertAtLast' ); - if ($this->currentPage > 1) { - $prevpage = $this->currentPage - 1; - - $firstAjax = $strjsCurrentOrder . $this->id . ".doGoToPage(1); return false;"; - $prevAjax = $strjsCurrentOrder . $this->id . ".doGoToPage(" . $prevpage . "); return false;"; - $first = "
     "; - $prev = "     "; - } else { - $first = "     "; - $prev = "     "; - } - if ($this->currentPage < $this->totPages) { - $nextpage = $this->currentPage + 1; - - $nextAjax = $strjsCurrentOrder . $this->id . ".doGoToPage(" . $nextpage . "); return false;"; - $lastAjax = $strjsCurrentOrder . $this->id . ".doGoToPage(" . $this->totPages . "); return false;"; - $next = "     "; - $last = "     "; - } else { - $next = "     "; - $last = "     "; - } - $pagesEnum = ''; - for ($r = 1; $r <= $this->totPages; $r ++) { - if (($r >= ($this->currentPage - 5)) && ($r <= ($this->currentPage + 5))) { - $pageAjax = $strjsCurrentOrder . $this->id . ".doGoToPage(" . $r . "); return false;"; - - if ($r != $this->currentPage) { - $pagesEnum .= " " . $r . ""; - } else { - $pagesEnum .= " " . $r . ""; - } - } - } - if ($this->totRows === 0) { - $this->tpl->newBlock( 'norecords' ); - $this->tpl->assign( "columnCount", $this->colCount ); - $noRecordsFound = 'ID_NO_RECORDS_FOUND'; - if (G::LoadTranslation( $noRecordsFound )) { - $noRecordsFound = G::LoadTranslation( $noRecordsFound ); - } - $this->tpl->assign( "noRecordsFound", $noRecordsFound ); - } - if (! $this->disableFooter) { - $this->tpl->newBlock( "bottomFooter" ); - $this->tpl->assign( "columnCount", $this->colCount ); - $this->tpl->assign( "pagedTableId", $this->id ); - if (($this->totRows !== 0)) { - if ($this->totPages > 1) { - $this->tpl->assign( "first", $first ); - $this->tpl->assign( "prev", $prev ); - $this->tpl->assign( "next", $next ); - $this->tpl->assign( "last", $last ); - } - $this->tpl->assign( "currentPage", $this->currentPage ); - $this->tpl->assign( "totalPages", $this->totPages ); - $firstRow = ($this->currentPage - 1) * $this->rowsPerPage + 1; - $lastRow = $firstRow + $rs->getRecordCount() - 1; - $this->tpl->assign( "firstRow", $firstRow ); - $this->tpl->assign( "lastRow", $lastRow ); - $this->tpl->assign( "totalRows", $this->totRows ); - } else { - $this->tpl->assign( "indexStyle", 'visibility:hidden;' ); - } - if ($this->searchBy) { - $this->tpl->assign( "fastSearchValue", $this->fastSearch ); - } else { - $this->tpl->assign( "fastSearchStyle", 'visibility:hidden;' ); - } - if ($this->addRow) { - if ($this->sqlInsert != '') { - $this->tpl->assign( "insert", ''./*G::LoadXml('labels','ID_ADD_NEW')*/ 'ID_ADD_NEW' . '' ); - } - } - $this->tpl->assign( "pagesEnum", $pagesEnum ); - } - - $this->name = $filter->xssFilterHard($this->name); - $this->orderBy = $filter->xssFilterHard($this->orderBy); - $this->currentPage = $filter->xssFilterHard($this->currentPage); - $this->id = $filter->xssFilterHard($this->id); - - ?> - - - tpl->newBlock( "closeBlock" ); - } - //By JHL - //Put the content of the table in a variable to be used for other puposes - //Like rendering as PDF - global $_TABLE_CONTENT_; - $_TABLE_CONTENT_ = $this->tpl->getOutputContent(); - $this->tpl->printToScreen(); - unset( $this->tpl ); - //unset($this->dbc); - //unset($this->ses); - $_SESSION['pagedTable[' . $this->id . ']'] = serialize( $this ); - $this->fastSearch = ''; - return; - } - - /** - * Function printForm - * - * @param string $filename - * @param array $data - * @return void - */ - public function printForm ($filename, $data = array()) - { - global $G_PUBLISH; - $G_PUBLISH = new Publisher(); - $G_PUBLISH->AddContent( 'xmlform', 'xmlform', $filename, '', $data, $this->popupSubmit ); - G::RenderPage( "publish", "blank" ); - } -} - +. + * + * For more information, contact Colosa Inc, 2566 Le Jeune Rd., + * Coral Gables, FL, 33134, USA, or email info@colosa.com. + * + */ + +G::LoadClass( 'filterForm' ); +G::LoadClass( 'xmlMenu' ); +G::LoadClass( "BasePeer" ); +G::LoadClass( "ArrayPeer" ); + +/** + * Class pagedTable + * + * @author David S. Callizaya S. * + * @access public + * @package workflow.gulliver.system + * dependencies TemplatePower Form XmlForm + */ + +class propelTable +{ + public $xmlFormFile; + public $currentPage; + public $orderBy = ''; + public $filter = array (); + public $filterType = array (); + public $searchBy = ''; + public $fastSearch = ''; + public $order = ''; + public $template = 'templates/paged-table.html'; + public $tpl; + public $style = array (); + public $rowsPerPage = 25; + public $ownerPage; + public $popupPage; + public $popupSubmit; + public $popupWidth = 450; + public $popupHeight = 200; + public $ajaxServer; + public $fields; + public $query; + public $totPages; + public $totRows; + public $sortable = '1'; + + //SQL QUERIES + public $criteria; + public $sql = ''; + public $sqlWhere = ''; + public $sqlGroupBy = ''; + public $sqlSelect = 'SELECT 1'; + public $sqlDelete = ''; + public $sqlInsert = ''; + public $sqlUpdate = ''; + public $fieldDataList = ''; + + //Configuration + public $xmlPopup = ''; + public $addRow = false; + public $deleteRow = false; + public $editRow = false; + public $notFields = ' title button linknew begingrid2 endgrid2 '; // These are not considered to build the sql queries (update,insert,delete) + + + //JavaScript Object attributes + public $onUpdateField = ""; + public $onDeleteField = ""; + public $afterDeleteField = ""; + public $onInsertField = ""; + + //New gulliver + public $xmlForm; + public $menu = ''; + public $filterForm = ''; + public $filterForm_Id = ''; + public $name = 'pagedTable'; + public $id = 'A1'; + public $disableFooter = false; + //This attribute is used to set STYLES to groups of TD, using the field type "cellMark" (see XmlForm_Field_cellMark) + public $tdStyle = ''; + public $tdClass = ''; + //Config Save definition + public $__Configuration = 'orderBy,filter,fastSearch,style/*/showInTable'; //order,rowsPerPage,disableFooter'; + + + //Variable for MasterDetail feature + public $masterdetail = ''; + public $title; + + /** + * Function prepareQuery + * + * @author David S. Callizaya S. + * @access public + * @param string $limitPage + * @return string + */ + public function prepareQuery ($limitPage = false) + { + // process the QuickSearch string and add the fields and expression needed to run the search + if ($this->searchBy !== '') { + $aSB = explode( '|', $this->searchBy ); //fields are separated by pipes + //subfilter + $subFilter = ''; + foreach ($aSB as $sBy) { + $subFilter .= ($subFilter !== '') ? ' OR ' : ''; + //TODO: Get DATABASE type from Criteria, I think sql delimeter is needed too + $subFilter .= $sBy . ' LIKE "%' . G::sqlEscape( $this->fastSearch ) . '%"'; + } + if ($subFilter !== '') { + //Get the first defined table in Criteria. + $aCurrentTables = $this->criteria->getTables(); + if (isset( $aCurrentTables[0] )) { + $this->criteria->add( $aCurrentTables[0] . ".*", '(' . $subFilter . ')', Criteria::CUSTOM ); + } + } + } + + //Merge sort array defined by USER with the array defined by SQL + parse_str( $this->order, $orderFields ); + parse_str( $this->orderBy, $orderFields2 ); + //User sort is more important (first in merge). + $orderFields3 = array_merge( $orderFields2, $orderFields ); + //User sort is overwrites XMLs definition. + $orderFields = array_merge( $orderFields3, $orderFields2 ); + //Order (BY SQL DEFINITION AND USER'S DEFINITION) + $this->aOrder = array (); + $order = ''; + foreach ($orderFields as $field => $fieldOrder) { + $field = G::getUIDName( $field, '' ); + $fieldOrder = strtoupper( $fieldOrder ); + if ($fieldOrder === 'A') { + $fieldOrder = 'ASC'; + } + if ($fieldOrder === 'D') { + $fieldOrder = 'DESC'; + } + switch ($fieldOrder) { + case 'ASC': + case 'DESC': + if ($order !== '') { + $order .= ', '; + } + $order .= $field . ' ' . $fieldOrder; + $this->aOrder[$field] = $fieldOrder; + } + } + //master detail :O + if (count( $this->masterdetail ) > 0) { + $this->criteria->clearOrderByColumns(); + foreach ($this->masterdetail as $idMasterDetail => $fieldMasterDetail) { + $this->criteria->addAscendingOrderByColumn( $fieldMasterDetail ); + } + } + if (! empty( $this->aOrder )) { + if (count( $this->masterdetail ) <= 0) { + $this->criteria->clearOrderByColumns(); + } + foreach ($this->aOrder as $field => $ascending) { + if ($ascending == 'ASC') { + $this->criteria->addAscendingOrderByColumn( $field ); + } else { + $this->criteria->addDescendingOrderByColumn( $field ); + } + } + } + /** + * Add limits + */ + $this->criteria->setLimit( 0 ); + $this->criteria->setOffset( 0 ); + if ($this->criteria->getDbName() == 'dbarray') { + $this->totRows = ArrayBasePeer::doCount( $this->criteria ); + } else { + $this->totRows = GulliverBasePeer::doCount( $this->criteria ); + } + $this->totPages = ceil( $this->totRows / $this->rowsPerPage ); + if ($limitPage) { + $this->criteria->setLimit( $this->rowsPerPage ); + $this->criteria->setOffset( ($this->currentPage - 1) * $this->rowsPerPage ); + } + return; + } + + /** + * Function setupFromXmlform + * + * @author David S. Callizaya S. + * editedby Hugo Loza + * @access public + * @param eter string xmlForm + * @return string + */ + public function setupFromXmlform ($xmlForm) + { + $this->xmlForm = $xmlForm; + //Config + $this->name = $xmlForm->name; + $this->id = $xmlForm->id; + //$this->sqlConnection=((isset($this->xmlForm->sqlConnection))?$this->xmlForm->sqlConnection:''); + if (isset( $_GET['page'] )) { + $this->currentPage = $_GET['page']; + } else { + $this->currentPage = 1; + } + if (isset( $_GET['order'] )) { + $this->orderBy = urldecode( $_GET['order'] ); + } else { + $this->orderBy = ""; + } + if (isset( $_GET['filter'] )) { + $this->filter = urldecode( $_GET['filter'] ); + } else { + $this->filter = ""; + } + if ($xmlForm->ajaxServer != '') { + $this->ajaxServer = G::encryptLink( $xmlForm->ajaxServer ); + } else { + $this->ajaxServer = G::encryptLink( '../gulliver/propelTableAjax' ); + } + $this->ownerPage = G::encryptLink( SYS_CURRENT_URI ); + // Config attributes from XMLFORM file + $myAttributes = get_class_vars( get_class( $this ) ); + foreach ($this->xmlForm->xmlform->tree->attribute as $atrib => $value) { + if (array_key_exists( $atrib, $myAttributes )) { + eval( 'settype($value, gettype($this->' . $atrib . '));' ); + if ($value !== '') { + eval( '$this->' . $atrib . '=$value;' ); + } + } + } + if ($this->masterdetail != "") { + $this->masterdetail = explode( ",", $this->masterdetail ); + foreach ($this->masterdetail as $keyMasterDetail => $valueMasterDetail) { + $this->masterdetail[$keyMasterDetail] = trim( $valueMasterDetail ); + } + } else { + $this->masterdetail = array (); + } + //Prepare the fields + $this->style = array (); + $this->gridWidth = ""; + $this->gridFields = ""; + $this->fieldsType = array (); + foreach ($this->xmlForm->fields as $f => $v) { + $r = $f; + $this->fields[$r]['Name'] = $this->xmlForm->fields[$f]->name; + $this->fields[$r]['Type'] = $this->xmlForm->fields[$f]->type; + if (isset( $this->xmlForm->fields[$f]->size )) { + $this->fields[$r]['Size'] = $this->xmlForm->fields[$f]->size; + } + $this->fields[$r]['Label'] = $this->xmlForm->fields[$f]->label; + } + //Set the default settings + $this->defaultStyle(); + //continue with the setup + $this->gridWidth = ''; + $this->gridFields = ''; + foreach ($this->xmlForm->fields as $f => $v) { + $r = $f; + //Parse the column properties + foreach ($this->xmlForm->fields[$f] as $attribute => $value) { + if (! is_object( $value )) { + $this->style[$r][$attribute] = $value; + } + } + //Needed for javascript + //only the visible columns's width and name are stored + if ($this->style[$r]['showInTable'] != '0') { + $this->gridWidth .= ',' . $this->style[$r]['colWidth']; + $this->gridFields .= ',"form[' . $this->fields[$r]['Name'] . ']"'; + } + } + $totalWidth = 0; + foreach ($this->fields as $r => $rval) { + if ($this->style[$r]['showInTable'] != '0') { + $totalWidth += $this->style[$r]['colWidth']; + } + } + $this->totalWidth = $totalWidth; + } + + /** + * Function count + * + * @author David S. Callizaya S. + * @access public + * @return string + */ + public function count () + { + $this->prepareQuery(); + return $this->totRows; + } + + /** + * Function renderTitle + * + * @author David S. Callizaya S. + * @access public + * @return string + */ + public function renderTitle () + { + //fix the bug about showing hidden fields in propel table. + foreach ($this->fields as $r => $rval) { + if ($this->style[$r]['type'] == 'hidden') { + $this->style[$r]['showInTable'] = '0'; + } + } + + //Render headers + $this->colCount = 0; + $this->shownFields = '['; + foreach ($this->fields as $r => $rval) { + if (($this->style[$r]['showInTable'] != '0') && (! (in_array( $this->fields[$r]['Name'], $this->masterdetail )))) { + //if (($this->style[$r]['showInTable'] != '0' )) + $this->tpl->newBlock( "headers" ); + + $sortDir = "ASC"; + + if (isset($this->aOrder[$this->fields[$r]["Name"]])) { + $sortDir = ($this->aOrder[$this->fields[$r]["Name"]] == "ASC")? "DESC" : "ASC"; + } + + if ($this->style[$r]['titleVisibility'] != '0') { + $this->style[$r]["href"] = "javascript:;"; + $this->style[$r]["onsort"] = $this->id . ".doSort(\"" . G::createUID("", $this->fields[$r]["Name"]) . "\", \"" . (($this->sortable == "0")? "" : $sortDir) . "\"); return false;"; + } else { + $this->style[$r]["href"] = "javascript:;"; + $this->style[$r]['onsort'] = 'return false;'; + } + if (isset( $this->style[$r]['href'] )) { + $this->tpl->assign( "href", $this->style[$r]['href'] ); + } + if (isset( $this->style[$r]['onsort'] )) { + $this->tpl->assign( "onsort", htmlentities( $this->style[$r]['onsort'], ENT_QUOTES, 'UTF-8' ) ); + } + + /* BUG 8080 - erik: don't setup onclick on page table header, doesn't have sense and causing problems + if (isset($this->style[$r]['onclick'])) + $this->tpl->assign( "onclick" , htmlentities( $this->style[$r]['onclick'] , ENT_QUOTES, 'UTF-8' ) ); + */ + + if (isset( $this->style[$r]['colWidth'] )) { + $this->tpl->assign( "width", $this->style[$r]['colWidth'] ); + } + if (isset( $this->style[$r]['colWidth'] )) { + $this->tpl->assign( "widthPercent", ($this->style[$r]['colWidth'] * 100 / $this->totalWidth) . "%" ); + //Hook for special skin with RTL languajes + } + if (defined( 'SYS_LANG_DIRECTION' ) && SYS_LANG_DIRECTION == 'R') { + $this->style[$r]['titleAlign'] = 'right'; + } + if (isset( $this->style[$r]['titleAlign'] )) { + $this->tpl->assign( "align", 'text-align:' . $this->style[$r]['titleAlign'] . ';' ); + } + if ($this->style[$r]['titleVisibility'] != '0') { + $sortDirImg = ""; + + if (isset($this->aOrder[$this->fields[$r]["Name"]])) { + $sortDirImg = ($this->aOrder[$this->fields[$r]["Name"]] == "ASC")? "" : ""; + } + + $this->tpl->assign("header", $this->fields[$r]["Label"] . $sortDirImg); + $this->tpl->assign("displaySeparator", ($this->colCount == 0 || !isset($this->fields[$r]["Label"]) || $this->fields[$r]["Label"] == "")? "display: none;" : ""); + } else { + $this->tpl->assign( 'displaySeparator', 'display:none;' ); + } + $this->colCount += 2; + $this->shownFields .= ($this->shownFields !== '[') ? ',' : ''; + $this->shownFields .= '"' . $r . '"'; + } + } + $this->shownFields .= ']'; + } + + /** + * Function renderField + * + * @author David S. Callizaya S. + * @access public + * @param eter string row + * @param eter string r + * @param eter string result + * @return string + */ + public function renderField ($row, $r, $result) + { + global $G_DATE_FORMAT; + //to do: special content?? + //$result['row__'] = $row; //Special content: + $styleData = $this->style[$r]; + $fielDataName = $styleData['data']; + $fieldClassName = isset( $styleData['colClassName'] ) && ($styleData['colClassName']) ? $styleData['colClassName'] : $this->tdClass; + if ($fielDataName != '') { + $value = ((isset( $result[$fielDataName] )) ? $result[$fielDataName] : ''); + } else { + $value = $this->fields[$r]['Label']; + } + $this->tpl->newBlock( "field" ); + $this->tpl->assign( 'width', $this->style[$r]['colWidth'] ); + $classAttr = (trim( $fieldClassName ) != '') ? " class=\"$fieldClassName\"" : ''; + $this->tpl->assign( 'classAttr', $classAttr ); + //to do: style is needed or not? + //$this->tpl->assign('style', $this->tdStyle); + $alignAttr = (isset( $this->style[$r]['align'] ) && strlen( $this->style[$r]['align'] > 0 )) ? " align=\"" . $this->style[$r]['align'] . "\"" : ''; + $this->tpl->assign( "alignAttr", $alignAttr ); + $fieldName = $this->fields[$r]['Name']; + $fieldClass = get_class( $this->xmlForm->fields[$fieldName] ); + /** + * * BEGIN : Reeplace of @@, @%,... + * in field's attributes like onclick, link, + */ + if (isset( $this->xmlForm->fields[$this->fields[$r]['Name']]->link )) { + $this->xmlForm->fields[$this->fields[$r]['Name']]->link = G::replaceDataField( $this->style[$r]['link'], $result ); + } + if (isset( $this->xmlForm->fields[$fieldName]->value )) { + $this->xmlForm->fields[$fieldName]->value = G::replaceDataField( $styleData['value'], $result ); + } + /** + * * END : Reeplace of @@, @%,... + */ + /** + * * Rendering of the field + */ + $this->xmlForm->fields[$fieldName]->mode = 'view'; + $this->xmlForm->setDefaultValues(); + $this->xmlForm->setValues( $result ); + //var_dump($fieldName, $fieldClass );echo '

'; + if (array_search( 'renderTable', get_class_methods( $fieldClass ) ) !== false) { + if ($value == '-') { + $htmlField = $value; + } else { + $htmlField = $this->xmlForm->fields[$fieldName]->renderTable( $value, $this->xmlForm, true ); + } + if (is_object( $value )) { + $value = ''; + } + // checking if the value variable is a html field, a html tag content can't contain   as white spaces + $testValue = preg_match( "/(.*)<\/a>/i", $htmlField, $value ); + $this->tpl->assign( "value", $htmlField ); + if ($testValue > 0 && (isset( $value[1] ) && strlen( trim( $value[1] ) ) == 0)) { + if ((trim( $value[0] )) == '') { + $this->tpl->assign( "value", " " ); + } + // $this->tpl->assign( "value" , (preg_match('^[[:space:]]^', $value) && (substr($fieldName,0,3)!="PRO"))? str_ireplace(" "," ",$htmlField):$htmlField ); + } else { + $this->tpl->assign( "value", $htmlField ); + } + + /* $testValue = preg_match( "/<\/?\w+((\s+(\w|\w[\w-]*\w)(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i", $value, $matches ); */ + // if (empty($matches)){ + // $this->tpl->assign( "value" , (preg_match('^[[:space:]]^', $value) && (substr($fieldName,0,3)!="PRO"))? str_ireplace(" "," ",$htmlField):$htmlField ); + // } else { + // $this->tpl->assign( "value" , $htmlField ); + // } + } + return $this->fields[$r]['Type']; + } + + /** + * Function defaultStyle + * + * @author David S. Callizaya S. + * @access public + * @return string + */ + public function defaultStyle () + { + foreach ($this->fields as $r => $rval) { + $this->style[$r] = array ('showInTable' => '1','titleVisibility' => '1','colWidth' => '150','onclick' => '','event' => '' + ); + //Some widths + if (! (strpos( ' date linknew ', ' ' . $this->fields[$r]['Type'] . ' ' ) === false)) { + $this->style[$r]['colWidth'] = '70'; + } + //Data source: + if (! (strpos( ' title button linknew image-text jslink ', ' ' . $this->fields[$r]['Type'] . ' ' ) === false)) { + $this->style[$r]['data'] = ''; //If the control is a link it shows the label + } else { + $this->style[$r]['data'] = $this->fields[$r]['Name']; //ELSE: The data value for that field + //Hidden fields + } + if (! isset( $this->style[$r]['showInTable'] )) { + if (! (strpos( ' title button endgrid2 submit password ', ' ' . $this->fields[$r]['Type'] . ' ' ) === false)) { + $this->style[$r]['showInTable'] = '0'; + } else { + $this->style[$r]['showInTable'] = '1'; + } + } + //Hidden titles + if (! (strpos( ' linknew button link endgrid2 ', ' ' . $this->fields[$r]['Type'] . ' ' ) === false)) { + $this->style[$r]['titleVisibility'] = '0'; + } + //Align titles + $this->style[$r]['titleAlign'] = 'center'; + //Align fields + if (defined( 'SYS_LANG_DIRECTION' ) && SYS_LANG_DIRECTION == 'R') { + $this->style[$r]['align'] = 'right'; + } else { + $this->style[$r]['align'] = 'left'; + } + if (! (strpos( ' linknew date ', ' ' . $this->fields[$r]['Type'] . ' ' ) === false)) { + $this->style[$r]['align'] = 'center'; + } + } + // Adjust the columns width to prevent overflow the page width + //Render headers + $totalWidth = 0; + foreach ($this->fields as $r => $rval) { + if ($this->style[$r]['showInTable'] != '0') { + $totalWidth += $this->style[$r]['colWidth']; + } + } + $this->totalWidth = $totalWidth; + $maxWidth = 1800; + $proportion = $totalWidth / $maxWidth; + if ($proportion > 1) { + $this->totalWidth = 1800; + } + if ($proportion > 1) { + foreach ($this->fields as $r => $rval) { + if ($this->style[$r]['showInTable'] != '0') { + $this->style[$r]['colWidth'] = $this->style[$r]['colWidth'] / $proportion; + } + } + } + } + + /** + * Function renderTable + * + * @author David S. Callizaya S. + * @param eter $block : = 'content'(Prints contentBlock only) + * @access public + * @return string + */ + public function renderTable ($block = '', $fields = '') + { + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $fields = $filter->xssFilterHard($fields); + $this->orderBy = $filter->xssFilterHard($this->orderBy); + $this->currentPage = $filter->xssFilterHard($this->currentPage); + + //Render Title + $thereisnotitle = true; + foreach ($this->fields as $r => $rval) { + if ($this->fields[$r]['Type'] === 'title') { + $this->title = $this->fields[$r]['Label']; + unset( $this->fields[$r] ); + $thereisnotitle = false; + } + } + if ($thereisnotitle) { + $this->title = ''; + } + $oHeadPublisher = & headPublisher::getSingleton(); + $oHeadPublisher->addInstanceModule( 'leimnud', 'panel' ); + $time_start = microtime( true ); + $this->prepareQuery( true ); + $time_end = microtime( true ); + $time = $time_end - $time_start; + // verify if there are templates folders registered, template and method folders are the same + $folderTemplate = explode( '/', $this->template ); + $oPluginRegistry = & PMPluginRegistry::getSingleton(); + if ($oPluginRegistry->isRegisteredFolder( $folderTemplate[0] )) { + $templateFile = PATH_PLUGINS . $this->template . '.html'; + } else { + $templateFile = PATH_TPL . $this->template . '.html'; + // Prepare the template + } + $this->tpl = new TemplatePower( $templateFile ); + $this->tpl->prepare(); + if (is_array( $fields )) { + foreach ($fields as $key => $val) { + $this->tpl->assignGlobal( $key, $val ); //Changed to Global by JHL on Dec 14,2009.. then thes fields are available for all Blocks + } + } + /** + * ******** HEAD BLOCK ************** + */ + if (($block === '') || ($block === 'head')) { + $this->tpl->newBlock( 'headBlock' ); + $this->tpl->assign( 'pagedTable_Id', $this->id ); + $this->tpl->assign( 'pagedTable_Name', $this->name ); + $this->tpl->assign( 'pagedTable_Height', $this->xmlForm->height ); + $this->tpl->assign( "title", $this->title ); + + $this->xmlForm->home = $filter->xssFilterHard($this->xmlForm->home); + $this->filterForm = $filter->xssFilterHard($this->filterForm); + $this->menu = $filter->xssFilterHard($this->menu); + + if (file_exists( $this->xmlForm->home . $this->filterForm . '.xml' )) { + $filterForm = new filterForm( $this->filterForm, $this->xmlForm->home ); + if ($this->menu === '') { + $this->menu = 'gulliver/pagedTable_Options'; + } + } + if (file_exists( $this->xmlForm->home . $this->menu . '.xml' )) { + $menu = new xmlMenu( $this->menu, $this->xmlForm->home ); + $this->tpl->newBlock( 'headerBlock' ); + $template = PATH_CORE . 'templates' . PATH_SEP . $menu->type . '.html'; + $menu->setValues( $this->xmlForm->values ); + $menu->setValues( array ('PAGED_TABLE_ID' => $this->id + ) ); + if (isset( $filterForm->name )) { + $menu->setValues( array ('SEARCH_FILTER_FORM' => $filterForm->name + ) ); + } + $this->tpl->assign( 'content', $menu->render( $template, $scriptCode ) ); + $oHeadPublisher->addScriptFile( $menu->scriptURL ); + $oHeadPublisher->addScriptCode( $scriptCode ); + } + if (file_exists( $this->xmlForm->home . $this->filterForm . '.xml' )) { + $this->tpl->newBlock( 'headerBlock' ); + $this->filterForm_Id = $filterForm->id; + $filterForm->type = 'filterform'; + $filterForm->ajaxServer = '../gulliver/defaultAjax'; + $template = PATH_CORE . 'templates/' . $filterForm->type . '.html'; + $filterForm->setValues( $this->xmlForm->values ); + $filterForm->setValues( array ('PAGED_TABLE_ID' => $this->id + ) ); + $filterForm->setValues( array ('PAGED_TABLE_FAST_SEARCH' => $this->fastSearch + ) ); + $this->tpl->assign( 'content', $filterForm->render( $template, $scriptCode ) ); + $oHeadPublisher->addScriptFile( $filterForm->scriptURL ); + $oHeadPublisher->addScriptCode( $scriptCode ); + if (isset( $_SESSION )) { + $_SESSION[$filterForm->id] = $filterForm->values; + } + } + + } + + /** + * ******** CONTENT BLOCK ************** + */ + if (($block === '') || ($block === 'content')) { + $this->tpl->newBlock( 'contentBlock' ); + $this->tpl->assign( 'gridWidth', '=[' . substr( $this->gridWidth, 1 ) . ']' ); + $this->tpl->assign( 'fieldNames', '=[' . substr( $this->gridFields, 1 ) . ']' ); + $this->tpl->assign( 'ajaxUri', '="' . addslashes( $this->ajaxServer ) . '"' ); + $this->tpl->assign( 'currentUri', '="' . addslashes( $this->ownerPage ) . '"' ); + $this->tpl->assign( 'currentOrder', '="' . addslashes( $this->orderBy ) . '"' ); + $this->tpl->assign( 'currentPage', '=' . $this->currentPage ); + $this->tpl->assign( 'currentFilter', '="' . '"' ); + $this->tpl->assign( 'totalRows', '=' . $this->totRows ); + $this->tpl->assign( 'rowsPerPage', '=' . $this->rowsPerPage ); + $this->tpl->assign( 'popupPage', '="' . addslashes( $this->popupPage ) . '"' ); + $this->tpl->assign( 'popupWidth', '=' . $this->popupWidth ); + $this->tpl->assign( 'popupHeight', '=' . $this->popupHeight ); + $this->tpl->assign( 'pagedTable_Id', $this->id ); + $this->tpl->assign( 'pagedTable_Name', $this->name ); + $this->tpl->assign( "pagedTable_JS", "{$this->id}.element=document.getElementById('pagedtable[{$this->id}]');" ); + $this->renderTitle(); + //Render rows + if ($this->criteria->getDbName() == 'dbarray') { + $rs = ArrayBasePeer::doSelectRs( $this->criteria ); + } else { + $rs = GulliverBasePeer::doSelectRs( $this->criteria ); + } + $rs->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + /* + print "
"; + $rs->next(); + $row = $rs->getRow(); + while ( is_array ( $row ) ) { + print ""; + foreach ( $row as $k=>$v ) print ""; + print ""; + $rs->next(); + $row = $rs->getRow(); + } + print "
$v
"; die;*/ + $gridRows = 0; + $rs->next(); + //Initialize the array of breakFields for Master Detail View + foreach ($this->masterdetail as $keyMasterDetail => $fieldMasterDetail) { + $breakField[$fieldMasterDetail] = "novaluehere"; + } + $breakFieldKeys = array_flip( $this->masterdetail ); + for ($j = 0; $j < $rs->getRecordCount(); $j ++) { + $result = $rs->getRow(); + $rs->next(); + $gridRows ++; + $this->tpl->newBlock( "row" ); + $this->tpl->assign( "class", "Row" . (($j % 2) + 1) ); + $this->tdStyle = ''; + $this->tdClass = ''; + //Start Master Detail: This enable the MasterDEtail view. By JHL November 2008 + if (count( $this->masterdetail ) > 0) { + //TODO: Validate if there is a Field that doesn't exist + //TODO: Style + //TODO: Improve Collapse function.... + foreach ($this->masterdetail as $keyMasterDetail => $fieldMasterDetail) { + if ($breakField[$fieldMasterDetail] != $result[$fieldMasterDetail]) { + $this->tpl->newBlock( "rowMaster" ); + $this->tpl->newBlock( "fieldMaster" ); + $this->tpl->assign( "alignAttr", " colspan=" . (count( $this->fields ) * 2) ); + $this->tpl->assign( "value", $this->fields[$fieldMasterDetail]['Label'] == "" ? "" : $this->fields[$fieldMasterDetail]['Label'] . ": " . $this->xmlForm->fields[$fieldMasterDetail]->renderTable( $result[$fieldMasterDetail], $this->xmlForm, true ) ); + $breakField[$fieldMasterDetail] = $result[$fieldMasterDetail]; + for ($i = $breakFieldKeys[$fieldMasterDetail] + 1; $i < count( $breakField ); $i ++) { + $breakField[$this->masterdetail[$i]] = "novaluehere"; + } + $rowName = array (); + foreach ($breakField as $key => $value) { + if ($value != "novaluehere") { + $rowName[$key] = $key . "_" . $value; + } + } + $this->tpl->assign( "masterRowName", implode( ",", $rowName ) ); + $this->tpl->assign( 'pagedTable_Name', $this->name ); + $many = ""; + $this->tpl->assign( "value1", str_pad( $many, count( $rowName ) - 1, "-" ) ); + $this->tpl->gotoblock( "rowMaster" ); + $this->tpl->assign( "masterRowName", "_MD_" . implode( ",", $rowName ) ); + $this->tpl->assign( "masterRowClass", $keyMasterDetail == 0 ? "masterDetailMain" : "masterDetailOther" ); + } + } + $this->tpl->gotoblock( "row" ); + if (! isset( $rowName )) { + $rowName = array (); + } + $this->tpl->assign( "rowName", implode( ",", $rowName ) ); + } + //End Master Detail: This enable the MasterDEtail view + //Merge $result with $xmlForm values (for default valuesSettings) + if (is_array( $this->xmlForm->values )) { + $result = array_merge( $this->xmlForm->values, $result ); + } + foreach ($this->fields as $r => $rval) { + if (strcasecmp( $this->fields[$r]['Type'], 'cellMark' ) == 0) { + $result1 = $result; + $result1['row__'] = $j + 1; + $result1 = array_merge( $this->xmlForm->values, $result1 ); + $this->xmlForm->setDefaultValues(); + $this->xmlForm->setValues( $result1 ); + $this->tdStyle = $this->xmlForm->fields[$this->fields[$r]['Name']]->tdStyle( $result1, $this->xmlForm ); + $this->tdClass = $this->xmlForm->fields[$this->fields[$r]['Name']]->tdClass( $result1, $this->xmlForm ); + } elseif ($this->style[$r]['showInTable'] != '0') { + if (($this->style[$r]['showInTable'] != '0') && (! (in_array( $this->fields[$r]['Name'], $this->masterdetail )))) { + $this->renderField( $j + 1, $r, $result ); + } + } + } + } + + $strjsCurrentOrder = $this->id . ".currentOrder = '" . addslashes($this->orderBy) . "';"; + + $this->tpl->assign( '_ROOT.gridRows', '=' . $gridRows ); //number of rows in the current page + $this->tpl->newBlock( 'rowTag' ); + $this->tpl->assign( 'rowId', 'insertAtLast' ); + if ($this->currentPage > 1) { + $prevpage = $this->currentPage - 1; + + $firstAjax = $strjsCurrentOrder . $this->id . ".doGoToPage(1); return false;"; + $prevAjax = $strjsCurrentOrder . $this->id . ".doGoToPage(" . $prevpage . "); return false;"; + $first = "
     "; + $prev = "     "; + } else { + $first = "     "; + $prev = "     "; + } + if ($this->currentPage < $this->totPages) { + $nextpage = $this->currentPage + 1; + + $nextAjax = $strjsCurrentOrder . $this->id . ".doGoToPage(" . $nextpage . "); return false;"; + $lastAjax = $strjsCurrentOrder . $this->id . ".doGoToPage(" . $this->totPages . "); return false;"; + $next = "     "; + $last = "     "; + } else { + $next = "     "; + $last = "     "; + } + $pagesEnum = ''; + for ($r = 1; $r <= $this->totPages; $r ++) { + if (($r >= ($this->currentPage - 5)) && ($r <= ($this->currentPage + 5))) { + $pageAjax = $strjsCurrentOrder . $this->id . ".doGoToPage(" . $r . "); return false;"; + + if ($r != $this->currentPage) { + $pagesEnum .= " " . $r . ""; + } else { + $pagesEnum .= " " . $r . ""; + } + } + } + if ($this->totRows === 0) { + $this->tpl->newBlock( 'norecords' ); + $this->tpl->assign( "columnCount", $this->colCount ); + $noRecordsFound = 'ID_NO_RECORDS_FOUND'; + if (G::LoadTranslation( $noRecordsFound )) { + $noRecordsFound = G::LoadTranslation( $noRecordsFound ); + } + $this->tpl->assign( "noRecordsFound", $noRecordsFound ); + } + if (! $this->disableFooter) { + $this->tpl->newBlock( "bottomFooter" ); + $this->tpl->assign( "columnCount", $this->colCount ); + $this->tpl->assign( "pagedTableId", $this->id ); + if (($this->totRows !== 0)) { + if ($this->totPages > 1) { + $this->tpl->assign( "first", $first ); + $this->tpl->assign( "prev", $prev ); + $this->tpl->assign( "next", $next ); + $this->tpl->assign( "last", $last ); + } + $this->tpl->assign( "currentPage", $this->currentPage ); + $this->tpl->assign( "totalPages", $this->totPages ); + $firstRow = ($this->currentPage - 1) * $this->rowsPerPage + 1; + $lastRow = $firstRow + $rs->getRecordCount() - 1; + $this->tpl->assign( "firstRow", $firstRow ); + $this->tpl->assign( "lastRow", $lastRow ); + $this->tpl->assign( "totalRows", $this->totRows ); + } else { + $this->tpl->assign( "indexStyle", 'visibility:hidden;' ); + } + if ($this->searchBy) { + $this->tpl->assign( "fastSearchValue", $this->fastSearch ); + } else { + $this->tpl->assign( "fastSearchStyle", 'visibility:hidden;' ); + } + if ($this->addRow) { + if ($this->sqlInsert != '') { + $this->tpl->assign( "insert", ''./*G::LoadXml('labels','ID_ADD_NEW')*/ 'ID_ADD_NEW' . '' ); + } + } + $this->tpl->assign( "pagesEnum", $pagesEnum ); + } + + $this->name = $filter->xssFilterHard($this->name); + $this->orderBy = $filter->xssFilterHard($this->orderBy); + $this->currentPage = $filter->xssFilterHard($this->currentPage); + $this->id = $filter->xssFilterHard($this->id); + + ?> + + + tpl->newBlock( "closeBlock" ); + } + //By JHL + //Put the content of the table in a variable to be used for other puposes + //Like rendering as PDF + global $_TABLE_CONTENT_; + $_TABLE_CONTENT_ = $this->tpl->getOutputContent(); + $this->tpl->printToScreen(); + unset( $this->tpl ); + //unset($this->dbc); + //unset($this->ses); + $_SESSION['pagedTable[' . $this->id . ']'] = base64_encode(serialize($this)); + $this->fastSearch = ''; + return; + } + + /** + * Function printForm + * + * @param string $filename + * @param array $data + * @return void + */ + public function printForm ($filename, $data = array()) + { + global $G_PUBLISH; + $G_PUBLISH = new Publisher(); + $G_PUBLISH->AddContent( 'xmlform', 'xmlform', $filename, '', $data, $this->popupSubmit ); + G::RenderPage( "publish", "blank" ); + } +} + diff --git a/workflow/engine/methods/dynaforms/dynaforms_PagedTableAjax.php b/workflow/engine/methods/dynaforms/dynaforms_PagedTableAjax.php index a569a9d7e..93b76e52c 100755 --- a/workflow/engine/methods/dynaforms/dynaforms_PagedTableAjax.php +++ b/workflow/engine/methods/dynaforms/dynaforms_PagedTableAjax.php @@ -43,7 +43,7 @@ G::LoadSystem( 'pagedTable' ); G::LoadInclude( 'ajax' ); $id = get_ajax_value( 'ptID' ); -$ntable = unserialize( $_SESSION['pagedTable[' . $id . ']'] ); +$ntable = unserialize(base64_decode($_SESSION['pagedTable[' . $id . ']'])); $page = get_ajax_value( 'page' ); $function = get_ajax_value( 'function' );