UseFreezer = $this->Application->ConfigValue('UseColumnFreezer'); } function LoadColumns($prefix) { $view_name = $this->Application->RecallVar($prefix.'_current_view'); $val = $this->Application->RecallPersistentVar($prefix.'_columns_.'.$view_name, ALLOW_DEFAULT_SETTINGS); if (!$val) { $cols = $this->RebuildColumns($prefix); } else { $cols = unserialize($val); $current_cols = $this->GetColumns($prefix); if ($cols === false || $cols['crc'] != $current_cols['crc']) { $cols = $this->RebuildColumns($prefix, $cols); } } return $cols; } function PreparePicker($prefix, $grid_name) { $this->SetGridName($grid_name); $this->PickerData = $this->LoadColumns($prefix); } function ApplyPicker($prefix, &$fields, $grid_name) { $this->PreparePicker($prefix, $grid_name); uksort($fields, array($this, 'CmpElems')); $this->RemoveHiddenColumns($fields); } function SetGridName($grid_name) { $this->GridName = $grid_name; } function CmpElems($a, $b) { $a_index = array_search($a, $this->PickerData['order']); $b_index = array_search($b, $this->PickerData['order']); if ($a_index == $b_index) { return 0; } return ($a_index < $b_index) ? -1 : 1; } function RebuildColumns($prefix, $current=null) { $cols = $this->GetColumns($prefix); if (is_array($current)) { //get common fields both in db and xml $common = array_intersect($current['order'], $cols['order']); //get added columns - present in xml, but not in db $added = array_diff($cols['order'], $current['order']); if (in_array('__FREEZER__', $added)) { array_unshift($common, '__FREEZER__'); unset($added[array_search('__FREEZER__', $added)]); } $cols['order'] = array_merge($common, $added); $cols['hidden_fields'] = array_intersect($current['order'], $current['hidden_fields']); foreach($common as $col) { $cols['widths'][$col] = isset($current['widths'][$col]) ? $current['widths'][$col] : 100; } $this->SetCRC($cols); } $this->StoreCols($prefix, $cols); return $cols; } function StoreCols($prefix, $cols) { $view_name = $this->Application->RecallVar($prefix.'_current_view'); $this->Application->StorePersistentVar($prefix.'_columns_.'.$view_name, serialize($cols)); } function GetColumns($prefix) { $splited = $this->Application->processPrefix($prefix); $grids = $this->Application->getUnitOption($splited['prefix'], 'Grids'); $conf_fields = $this->UseFreezer ? array_merge_recursive( array('__FREEZER__' => array('title' => '__FREEZER__')), $grids[$this->GridName]['Fields'] ) : $grids[$this->GridName]['Fields']; // $conf_fields = $grids[$this->GridName]['Fields']; // we NEED to recall dummy here to apply fields changes imposed by formatters, // such as replacing multilingual field titles etc. $dummy =& $this->Application->recallObject($prefix, null, array('skip_autoload'=>1)); $counter = 0; $hidden = array(); $fields = array(); $titles = array(); $widths = array(); foreach ($conf_fields as $name => $options) { $fields[$counter] = $name; $titles[$name] = $options['title']; $widths[$name] = 100; if (isset($options['hidden']) && $options['hidden']) { $hidden[$counter] = $name; } $counter++; } $sorted_fields = $fields; sort($sorted_fields); $cols = array( 'order' => $fields, 'titles' => $titles, 'hidden_fields' => $hidden, 'widths' => $widths, ); $this->SetCRC($cols); return $cols; } function SetCRC(&$cols) { $sorted_fields = $cols['order']; $sorted_titles = $cols['titles']; asort($sorted_fields); asort($sorted_titles); $cols['crc'] = crc32(implode(',', $sorted_fields).implode(',', $sorted_titles)); } function RemoveHiddenColumns(&$fields) { $to_remove = array(); foreach ($fields as $name => $options) { if (array_search($name, $this->PickerData['hidden_fields']) !== false) { $to_remove[] = $name; } } foreach ($to_remove as $name) { unset($fields[$name]); } } function SaveColumns($prefix, $picked, $hidden) { $order = $picked ? explode('|', $picked) : array(); $hidden = $hidden ? explode('|', $hidden) : array(); $order = array_merge($order, $hidden); $cols = $this->LoadColumns($prefix); $cols['order'] = $order; $cols['hidden_fields'] = $hidden; $this->SetCRC($cols); $this->StoreCols($prefix, $cols); } function SaveWidths($prefix, $widths) { if (!is_array($widths)) $widths = explode(':', $widths); array_shift($widths); // removing first col (checkbox col) width $i = 0; foreach ($this->PickerData['order'] as $ord => $field) { if ($field == '__FREEZER__') continue; $this->PickerData['widths'][$field] = $widths[$i++]; } $this->StoreCols($prefix, $this->PickerData); } function GetWidth($field) { return isset($this->PickerData['widths'][$field]) ? $this->PickerData['widths'][$field] : false; } }