Conn =& $this->Application->GetADODBConnection(); } /** * Returns view menu name for current prefix * * @param Array $params * @return string */ function GetItemName($params) { $item_name = $this->Application->getUnitOption($this->Prefix,'ViewMenuPhrase'); return $this->Application->Phrase($item_name); } /** * Draw filter menu content (for ViewMenu) based on filters defined in config * * @param Array $params * @return string */ function DrawFilterMenu($params) { $block_params = $this->prepareTagParams($params); $block_params['name'] = $params['spearator_block']; $separator = $this->Application->ParseBlock($block_params); $filter_menu = $this->Application->getUnitOption($this->Prefix,'FilterMenu'); // Params: label, filter_action, filter_status $block_params['name'] = $params['item_block']; $view_filter = $this->Application->RecallVar($this->getPrefixSpecial().'_view_filter'); if($view_filter === false) { $event_params = Array('prefix'=>$this->Prefix,'special'=>$this->Special,'name'=>'OnRemoveFilters'); $this->Application->HandleEvent( new kEvent($event_params) ); $view_filter = $this->Application->RecallVar($this->getPrefixSpecial().'_view_filter'); } $view_filter = unserialize($view_filter); $filters = Array(); $prefix_special = $this->getPrefixSpecial(); foreach($filter_menu['Filters'] as $filter_key => $filter_params) { if(!$filter_params) { $filters[] = $separator; continue; } $block_params['label'] = addslashes( $this->Application->Phrase($filter_params['label']) ); if( getArrayValue($view_filter,$filter_key) ) { $submit = 0; $status = 1; } else { $submit = 1; $status = 0; } $block_params['filter_action'] = 'set_filter("'.$prefix_special.'","'.$filter_key.'","'.$submit.'");'; $block_params['filter_status'] = $status; $filters[] = $this->Application->ParseBlock($block_params); } return implode('', $filters); } function IterateGridFields($params) { $mode = $params['mode']; $def_block = $params['block']; $grids = $this->Application->getUnitOption($this->Prefix,'Grids'); $grid_config = $grids[$params['grid']]['Fields']; $std_params['pass_params']='true'; $std_params['PrefixSpecial']=$this->getPrefixSpecial(); $o = ''; foreach ($grid_config as $field => $options) { $block_params = Array(); $block_params['name'] = isset($options[$mode.'_block']) ? $options[$mode.'_block'] : $def_block; $block_params['field'] = $field; $block_params['sort_field'] = isset($options['sort_field']) ? $options['sort_field'] : $field; $block_params = array_merge($std_params, $block_params, $options); $o.= $this->Application->ParseBlock($block_params, 1); } return $o; } /** * Prints list content using block specified * * @param Array $params * @return string * @access public */ function PrintList($params) { $list =& $this->Application->recallObject( $this->getPrefixSpecial(), $this->Prefix.'_List',$params); $id_field = $this->Application->getUnitOption($this->Prefix,'IDField'); $list->Query(); $o = ''; $list->GoFirst(); $block_params=$this->prepareTagParams($params); $block_params['name']=$params['block']; $block_params['pass_params']='true'; while (!$list->EOL()) { $this->Application->SetVar( $this->getPrefixSpecial().'_id', $list->GetDBField($id_field) ); // for edit/delete links using GET $o.= $this->Application->ParseBlock($block_params, 1); $list->GoNext(); } $this->Application->SetVar( $this->getPrefixSpecial().'_id', ''); return $o; } /** * Prints list content using block specified * * @param Array $params * @return string * @access public */ function PrintList2($params) { $prefix_special = $this->getPrefixSpecial(); $list =& $this->Application->recallObject( $prefix_special, $this->Prefix.'_List',$params); if ( !($list->OriginalParams == $params) ) { $this->Application->removeObject($prefix_special); $list =& $this->Application->recallObject($prefix_special,$this->Prefix.'_List',$params); } $id_field = $this->Application->getUnitOption($this->Prefix,'IDField'); $list->Query(); $o = ''; $direction = (isset($params['direction']) && $params['direction']=="H")?"H":"V"; $columns = (isset($params['columns']))?$params['columns']:1; if ($columns>1 && $direction=="V") { $list->Records = $this->LinearToVertical($list->Records, $columns, $params['per_page']); $list->SelectedCount=count($list->Records); ksort($list->Records); } $list->GoFirst(); $block_params=$this->prepareTagParams($params); $block_params['name']=$params['block']; $block_params['pass_params']='true'; $block_start_row_params=$this->prepareTagParams($params); $block_start_row_params['name']=$params['row_start_block']; $block_end_row_params=$this->prepareTagParams($params); $block_end_row_params['name']=$params['row_end_block']; $i=0; $backup_id=$this->Application->GetVar($this->Prefix."_id"); while (!$list->EOL()) { if (!$list->getCurrentRecord()){ //$list->GoNext(); //continue; $block_params['name']=$params['block_empty_cell']; }else{ $block_params['name']=$params['block']; } $this->Application->SetVar( $this->getPrefixSpecial().'_id', $list->GetDBField($id_field) ); // for edit/delete links using GET $this->Application->SetVar( $this->Prefix.'_id', $list->GetDBField($id_field) ); if ($i%$params['columns'] == 0) $o.= $this->Application->ParseBlock($block_start_row_params, 1); $o.= $this->Application->ParseBlock($block_params, 1); if (($i+1)%$params['columns'] == 0) $o.= $this->Application->ParseBlock($block_end_row_params, 1); $list->GoNext(); $i++; } $this->Application->SetVar( $this->Prefix.'_id', $backup_id); $this->Application->SetVar( $this->getPrefixSpecial().'_id', ''); return $o; } /** * Append prefix and special to tag * params (get them from tagname) like * they were really passed as params * * @param Array $tag_params * @return Array * @access protected */ function prepareTagParams($tag_params) { $ret=$tag_params; $ret['Prefix']=$this->Prefix; $ret['Special']=$this->Special; $ret['PrefixSpecial']=$this->getPrefixSpecial(); return $ret; } /** * Get's requested field value * * @param Array $params * @return string * @access public */ function Field($params) { $field = $params['field']; $object =& $this->Application->recallObject($this->getPrefixSpecial(),$this->Prefix, $params); if ( getArrayValue($params, 'db') !== false ) { $value = $object->GetDBField($field); } else { $format = getArrayValue($params, 'format'); if (!$format) { $format = null; } else { if (preg_match("/_regional_(.*)/", $format, $regs)) { $lang = $this->Application->recallObject('lang'); $format = $lang->GetDBField($regs[1]); } } $value = $object->GetField($field, $format); } if( getArrayValue($params,'nl2br' ) ) $value = nl2br($value); if( !getArrayValue($params,'no_special') ) $value = htmlspecialchars($value); if( getArrayValue($params,'checked' ) ) $value = ($value == 1) ? 'checked' : ''; if( getArrayValue($params,'as_label') ) $value = $this->Application->Phrase($value); $cut_first = getArrayValue($params,'cut_first'); if($cut_first) { $needs_cut = strlen($value) > $cut_first; $value = substr($value,0,$cut_first); if($needs_cut) $value .= ' ...'; } if ($value != '') $this->Application->Parser->DataExists = true; return $value; } function Error($params) { $field = $params['field']; $object =& $this->Application->recallObject($this->getPrefixSpecial(),$this->Prefix, $params); $msg = $object->GetErrorMsg($field); return $msg; } function HasError($params) { return $this->Error($params) != ''; } function IsRequired($params) { $field = $params['field']; $object =& $this->Application->recallObject($this->getPrefixSpecial(),$this->Prefix, $params); $options = $object->GetFieldOptions($field); return getArrayValue($options,'required'); } function PredefinedOptions($params) { $field = $params['field']; $object =& $this->Application->recallObject($this->getPrefixSpecial(),$this->Prefix, $params); $value = $object->GetDBField($field); $options = $object->GetFieldOptions($field); $block_params['name'] = $params['block']; $block_params['pass_params'] = 'true'; $selected = $params['selected']; $o = ''; foreach ($options['options'] as $key => $val) { $block_params['key'] = $key; $block_params['option'] = $val; $block_params[$selected] = ( $key == $value ? ' '.$selected : ''); $o .= $this->Application->ParseBlock($block_params, 1); } return $o; } function Format($params) { $field = $params['field']; $object =& $this->Application->recallObject($this->getPrefixSpecial(),$this->Prefix, $params); $options = $object->GetFieldOptions($field); if (isset($options['formatter']) && (isset($params['human']) || isset($params['edit_size'])) ) { $formatter =& $this->Application->recallObject($options['formatter']); $format = $formatter->HumanFormat($options['format']); return isset($params['edit_size']) ? strlen($format) : $format; } return $options['format']; } /** * Print grid pagination using * block names specified * * @param Array $params * @return string * @access public */ function PrintPages($params) { $prefix_special=$this->getPrefixSpecial(); $object =& $this->Application->recallObject($prefix_special,$this->Prefix.'_List',$params); if ( !($object->OriginalParams == $params) ) { $this->Application->removeObject($prefix_special); $object =& $this->Application->recallObject($prefix_special,$this->Prefix.'_List',$params); } $total = $object->GetTotalPages(); $o = ''; // what are these 2 lines for? $this->Application->SetVar($prefix_special.'_event',''); $this->Application->SetVar($prefix_special.'_id',''); $current_page = $this->Application->RecallVar($prefix_special.'_Page'); $block_params = $this->prepareTagParams($params); $split = ( isset($params['split'])?$params['split']:10 ); $split_start = $current_page - ceil($split/2); if ($split_start < 1){ $split_start = 1; } $split_end = $split_start + $split-1; if ($split_end > $total) { $split_end = $total; $split_start = max($split_end - $split + 1, 1); } if ($current_page > 1){ $prev_block_params=array(); if ($total > $split){ $prev_block_params['page']=max($current_page-$split, 1); $prev_block_params['name'] = getArrayValue($params, 'prev_page_split_block'); if ($prev_block_params['name']){ $o .= $this->Application->ParseBlock($prev_block_params, 1); } } $prev_block_params['name']="page"; $prev_block_params['page']=$current_page-1; $prev_block_params['name'] = getArrayValue($params, 'prev_page_block'); if ($prev_block_params['name']){ $o .= $this->Application->ParseBlock($prev_block_params, 1); } } for ($i = $split_start; $i<=$split_end; $i++) { //$this->Application->SetVar($prefix_special.'_Page',$i); $block = $params[ (($i==$current_page)?'active':'inactive').'_block' ]; $block_params['name']=$block; $block_params['page']=$i; $o .= $this->Application->ParseBlock($block_params, 1); } if ($current_page < $total){ $next_block_params=array(); $next_block_params['page']=$current_page+1; $next_block_params['name'] = getArrayValue($params, 'next_page_block'); if ($next_block_params['name']){ $o .= $this->Application->ParseBlock($next_block_params, 1); } if ($total > $split){ $next_block_params['page']=min($current_page+$split, $total); $next_block_params['name'] = getArrayValue($params, 'next_page_split_block'); if ($next_block_params['name']){ $o .= $this->Application->ParseBlock($next_block_params, 1); } } } return $o; } /** * Returns input field name to * be placed on form (for correct * event processing) * * @param Array $params * @return string * @access public */ function InputName($params) { $prefix_special=$this->getPrefixSpecial(); $item = $this->Application->recallObject($prefix_special); if ( $formatter = getArrayValue($item->Fields, $params['field'], 'formatter') ) { if ( $formatter == 'kMultiLanguage' ) { $formatter =& $this->Application->recallObject($formatter); $params['field'] = $formatter->LangFieldName($params['field']); } } if ( $idfield = getArrayValue($params, 'IdField') ) { $id = $item->GetDBField($idfield); } else { $id = $item->GetID(); } return $prefix_special.'['.$id.']['.$params['field'].']'; } /** * Returns index where 1st changable sorting field begins * * @return int * @access private */ function getUserSortIndex() { $list_sortings = $this->Application->getUnitOption($this->Prefix, 'ListSortings'); $sorting_prefix = getArrayValue($list_sortings, $this->Special) ? $this->Special : ''; $user_sorting_start = 0; if ( $forced_sorting = getArrayValue($list_sortings, $sorting_prefix, 'ForcedSorting') ) { $user_sorting_start = count($forced_sorting); } return $user_sorting_start; } /** * Returns order direction for given field * * * * @param Array $params * @return string * @access public */ function Order($params) { $field = $params['field']; $user_sorting_start = $this->getUserSortIndex(); $object =& $this->Application->recallObject( $this->getPrefixSpecial() ); if ($object->GetOrderField($user_sorting_start) == $field) { return $object->GetOrderDirection($user_sorting_start); } elseif($object->GetOrderField($user_sorting_start+1) == $field) { return '2_'.$object->GetOrderDirection($user_sorting_start+1); } else { return 'no'; } } /** * Get's information of sorting field at "pos" position, * like sorting field name (type="field") or sorting direction (type="direction") * * @param Array $params * @return mixed */ function OrderInfo($params) { $user_sorting_start = $this->getUserSortIndex() + --$params['pos']; $object =& $this->Application->recallObject( $this->getPrefixSpecial() ); if($params['type'] == 'field') return $object->GetOrderField($user_sorting_start); if($params['type'] == 'direction') return $object->GetOrderDirection($user_sorting_start); } /** * Checks if sorting field/direction matches passed field/direction parameter * * @param Array $params * @return bool */ function IsOrder($params) { $params['type'] = isset($params['field']) ? 'field' : 'direction'; $value = $this->OrderInfo($params); if( isset($params['field']) ) return $params['field'] == $value; if( isset($params['direction']) ) return $params['direction'] == $value; } /** * Returns list perpage * * @param Array $params * @return int */ function PerPage($params) { $object =& $this->Application->recallObject( $this->getPrefixSpecial() ); return $object->PerPage; } /** * Checks if list perpage matches value specified * * @param Array $params * @return bool */ function PerPageEquals($params) { $object =& $this->Application->recallObject( $this->getPrefixSpecial() ); return $object->PerPage == $params['value']; } function SaveEvent($params) { // SaveEvent is set during onbuild, but we may need it before any other tag calls onBuild $prefix_special = $this->getPrefixSpecial(); $item = $this->Application->recallObject($prefix_special); return $this->Application->GetVar($prefix_special.'_SaveEvent'); } function NextId($params) { $prefix_special=$this->getPrefixSpecial(); $ids = explode(',', $this->Application->RecallVar($prefix_special.'_selected_ids')); $item = $this->Application->recallObject($prefix_special); $cur_id = $item->GetId(); $i = array_search($cur_id,$ids); if ($i !== false) { return $i < count($ids)-1 ? $ids[$i+1] : ''; } return ''; } function PrevId($params) { $prefix_special=$this->getPrefixSpecial(); $ids = explode(',', $this->Application->RecallVar($prefix_special.'_selected_ids')); $item = $this->Application->recallObject($prefix_special); $cur_id = $item->GetId(); $i = array_search($cur_id,$ids); if ($i !== false) { return $i > 0 ? $ids[$i-1] : ''; } return ''; } function IsSingle($params) { return ($this->NextId($params) === '' && $this->PrevId($params) === ''); } function IsLast($params) { return ($this->NextId($params) === ''); } function IsFirst($params) { return ($this->PrevId($params) === ''); } /** * Checks if field value is equal to proposed one * * @param Array $params * @return bool */ function FieldEquals($params) { $object =& $this->Application->recallObject($this->getPrefixSpecial(),$this->Prefix, $params); $ret = $object->GetDBField($params['field']) == $params['value']; if( getArrayValue($params,'inverse') ) $ret = !$ret; return $ret; } function ItemIcon($params) { $object =& $this->Application->recallObject($this->getPrefixSpecial(),$this->Prefix, $params); $grids = $this->Application->getUnitOption($this->Prefix,'Grids'); $icons =& $grids[ $params['grid'] ]['Icons']; $key = ''; $status_fields = $this->Application->getUnitOption($this->Prefix,'StatusField'); if(!$status_fields) return $icons['default']; foreach($status_fields as $status_field) { $key .= $object->GetDBField($status_field).'_'; } $key = rtrim($key,'_'); $value = ($key !== false) ? $key : 'default'; return isset($icons[$value]) ? $icons[$value] : $icons['default']; } function SectionTitle($params) { $title_presets = $this->Application->getUnitOption($this->Prefix,'TitlePresets'); $title_info = getArrayValue($title_presets, $params['title_preset'] ); if($title_info === false) return $params['title']; if( getArrayValue($title_presets,'default') ) { // use default labels + custom labels specified in preset used $title_info = array_merge_recursive2($title_presets['default'], $title_info); } $title = $title_info['format']; // 1. get objects in use for title construction $objects = Array(); $object_status = Array(); $status_labels = Array(); $prefixes = getArrayValue($title_info,'prefixes'); if($prefixes) { foreach($prefixes as $prefix_special) { $prefix_data = $this->Application->processPrefix($prefix_special); $prefix_data['prefix_special'] = rtrim($prefix_data['prefix_special'],'.'); $objects[ $prefix_data['prefix_special'] ] =& $this->Application->recallObject($prefix_data['prefix_special'], $prefix_data['prefix'], $params); $object_status[ $prefix_data['prefix_special'] ] = $objects[ $prefix_data['prefix_special'] ]->GetID() ? 'edit' : 'new'; // a. set object's status field (adding item/editing item) for each object in title if( getArrayValue($title_info[ $object_status[ $prefix_data['prefix_special'] ].'_status_labels' ],$prefix_data['prefix_special']) ) { $status_labels[ $prefix_data['prefix_special'] ] = $title_info[ $object_status[ $prefix_data['prefix_special'] ].'_status_labels' ][ $prefix_data['prefix_special'] ]; $title = str_replace('#'.$prefix_data['prefix_special'].'_status#', $status_labels[ $prefix_data['prefix_special'] ], $title); } // b. setting object's titlefield value (in titlebar ONLY) to default in case if object beeing created with no titlefield filled in if( $object_status[ $prefix_data['prefix_special'] ] == 'new' ) { $new_value = $this->getInfo( $objects[ $prefix_data['prefix_special'] ], 'titlefield' ); if(!$new_value && getArrayValue($title_info['new_titlefield'],$prefix_data['prefix_special']) ) $new_value = $this->Application->Phrase($title_info['new_titlefield'][ $prefix_data['prefix_special'] ]); $title = str_replace('#'.$prefix_data['prefix_special'].'_titlefield#', $new_value, $title); } } } // 2. replace phrases if any found in format string $title = $this->Application->ReplaceLanguageTags($title); // 3. find and replace any replacement vars preg_match_all('/#(.*_.*)#/Uis',$title,$rets); if($rets[1]) { $replacement_vars = array_keys( array_flip($rets[1]) ); foreach($replacement_vars as $replacement_var) { $var_info = explode('_',$replacement_var,2); $object =& $objects[ $var_info[0] ]; $new_value = $this->getInfo($object,$var_info[1]); $title = str_replace('#'.$replacement_var.'#', $new_value, $title); } } return $title; } function getInfo(&$object, $info_type) { switch ($info_type) { case 'titlefield': $field = $this->Application->getUnitOption($object->Prefix,'TitleField'); return $field !== false ? $object->GetField($field) : 'TitleField Missing'; break; case 'recordcount': $of_phrase = $this->Application->Phrase('la_of'); return $object->NoFilterCount != $object->RecordsCount ? $object->RecordsCount.' '.$of_phrase.' '.$object->NoFilterCount : $object->RecordsCount; break; default: break; } } /** * Parses block depending on its element type. * For radio and select elements values are taken from 'value_list_field' in key1=value1,key2=value2 * format. key=value can be substituted by SELECT f1 AS OptionName, f2 AS OptionValue... FROM TableName * where prefix is TABLE_PREFIX * * @param Array $params * @return string */ function ConfigFormElement($params) { $object =& $this->Application->recallObject( $this->getPrefixSpecial() ); $field = $params['field']; $helper = $this->Application->recallObject('InpCustomFieldsHelper'); $element_type = $object->GetDBField($params['element_type_field']); if($element_type=='label') $element_type='text'; $params['name']= $params['blocks_prefix'] . $element_type; switch ($element_type){ case 'select': case 'radio': $field_options = $object->GetFieldOptions($field, 'options'); $field_options['options'] = $helper->GetValuesHash( $object->GetDBField($params['value_list_field']) ); $object->SetFieldOptions($field, $field_options); break; case 'textarea': $params['field_params'] = $helper->ParseConfigSQL($object->GetDBField($params['value_list_field'])); break; case 'password': case 'text': case 'checkbox': default: break; } return $this->Application->ParseBlock($params, 1); } /** * Get's requested custom field value * * @param Array $params * @return string * @access public */ function CustomField($params) { $prefix = $this->getPrefixSpecial(); $object =& $this->Application->recallObject( $prefix ); $sql = ' SELECT cv.Value FROM '.TABLE_PREFIX.'CustomField cf LEFT JOIN '.TABLE_PREFIX.'CustomMetaData cv ON cf.CustomFieldId = cv.CustomFieldId WHERE cf.Type = '.$this->Application->getUnitOption($prefix, 'ItemType').' AND cv.ResourceId = '.$object->GetDBField('ResourceId').' AND cf.FieldName = "'.$params['field'].'"'; return $this->Conn->GetOne($sql); } /** * transposes 1-dimensional array elements for vertical alignment according to given columns and per_page parameters * * @param array $arr * @param int $columns * @param int $per_page * @return array */ function LinearToVertical(&$arr, $columns, $per_page){ $rows=$columns; $cols=min(ceil($per_page/$columns), ceil(sizeof($arr)/$columns)); $imatrix=array(); for ($row=0; $row<$rows; $row++) { for ($col=0; $col<$cols; $col++){ $imatrix[$col*$rows+$row]=$arr[$row*$cols+$col]; } } ksort($imatrix); reset($imatrix); return $imatrix; } function SaveWarning($params){ $top_prefix = $this->Application->GetTopmostPrefix($this->Prefix); if ( $this->Application->GetVar($top_prefix.'_mode') == 't' && $this->Application->RecallVar($top_prefix."_modified")=="1"){ return $this->Application->ParseBlock($params); }else{ $this->Application->RemoveVar($top_prefix."_modified"); return ""; } } } ?>