Page MenuHomeIn-Portal Phabricator

in-portal
No OneTemporary

File Metadata

Created
Thu, Feb 6, 8:13 PM

in-portal

Index: branches/5.0.x/core/kernel/utility/formatters/multilang_formatter.php
===================================================================
--- branches/5.0.x/core/kernel/utility/formatters/multilang_formatter.php (revision 13289)
+++ branches/5.0.x/core/kernel/utility/formatters/multilang_formatter.php (revision 13290)
@@ -1,184 +1,187 @@
<?php
/**
* @version $Id$
* @package In-Portal
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
class kMultiLanguage extends kFormatter
{
/**
* Returns ML field equivalent to field name specifed
*
* @param string $field_name
* @param bool $from_primary use primary/current language for name custruction
* @return string
*/
function LangFieldName($field_name, $from_primary = false)
{
if (preg_match('/^l[0-9]+_/', $field_name)) return $field_name;
$lang = $from_primary ? $this->Application->GetDefaultLanguageId() : $this->Application->GetVar('m_lang');
if (!$lang || ($lang == 'default')) {
$lang = $this->Application->GetDefaultLanguageId();
}
return 'l'.$lang.'_'.$field_name;
}
function PrepareOptions($field_name, &$field_options, &$object)
{
if (getArrayValue($object->Fields, $field_name, 'master_field')) return;
$lang_field_name = $this->LangFieldName($field_name);
//substitude title field
$title_field = $this->Application->getUnitOption($object->Prefix, 'TitleField');
if ($title_field == $field_name) {
$this->Application->setUnitOption($object->Prefix, 'TitleField', $lang_field_name);
}
//substitude fields
$fields = $this->Application->getUnitOption($object->Prefix, 'Fields');
if ( isset($fields[$field_name]) ) {
$fields[$lang_field_name] = $fields[$field_name];
$fields[$lang_field_name]['master_field'] = $field_name;
$fields[$lang_field_name]['error_field'] = $field_name;
$object->Fields[$lang_field_name] = $fields[$lang_field_name];
$fields[$field_name]['required'] = false;
$object->Fields[$field_name]['required'] = false;
$object->VirtualFields[$field_name] = $object->Fields[$field_name];
}
$this->Application->setUnitOption($object->Prefix, 'Fields', $fields);
//substitude virtual fields
$virtual_fields = $this->Application->getUnitOption($object->Prefix, 'VirtualFields');
if ( isset($virtual_fields[$field_name]) ) {
$virtual_fields[$lang_field_name] = $virtual_fields[$field_name];
$virtual_fields[$lang_field_name]['master_field'] = $field_name;
$object->VirtualFields[$lang_field_name] = $virtual_fields[$lang_field_name];
$virtual_fields[$field_name]['required'] = false;
$object->VirtualFields[$field_name]['required'] = false;
}
$this->Application->setUnitOption($object->Prefix, 'VirtualFields', $virtual_fields);
//substitude grid fields
$grids = $this->Application->getUnitOption($object->Prefix, 'Grids', Array());
foreach ($grids as $name => $grid) {
if ( getArrayValue($grid, 'Fields', $field_name) ) {
+ // used by column picker to track column position
+ $grids[$name]['Fields'][$field_name]['formatter_renamed'] = true;
+
if (!array_key_exists('format', $grids[$name]['Fields'][$field_name])) {
// prevent displaying value from primary language
// instead of missing value in current language
$grids[$name]['Fields'][$field_name]['format'] = 'no_default';
}
array_rename_key($grids[$name]['Fields'], $field_name, $lang_field_name);
}
// update sort fields - used for sorting and filtering in SQLs
foreach ($grid['Fields'] as $grid_fld_name => $fld_options) {
if (isset($fld_options['sort_field']) && $fld_options['sort_field'] == $field_name) {
$grids[$name]['Fields'][$grid_fld_name]['sort_field'] = $lang_field_name;
}
}
}
$this->Application->setUnitOption($object->Prefix, 'Grids', $grids);
//substitude default sortings
$sortings = $this->Application->getUnitOption($object->Prefix, 'ListSortings', Array());
foreach ($sortings as $special => $the_sortings) {
if (isset($the_sortings['ForcedSorting'])) {
array_rename_key($sortings[$special]['ForcedSorting'], $field_name, $lang_field_name);
}
if (isset($the_sortings['Sorting'])) {
array_rename_key($sortings[$special]['Sorting'], $field_name, $lang_field_name);
}
}
$this->Application->setUnitOption($object->Prefix, 'ListSortings', $sortings);
//TODO: substitude possible language-fields sortings after changing language
}
/*function UpdateSubFields($field, $value, &$options, &$object)
{
}
*/
/**
* Checks, that field value on primary language is set
*
* @param string $field
* @param mixed $value
* @param Array $options
* @param kDBItem $object
*/
function UpdateMasterFields($field, $value, &$options, &$object)
{
$master_field = array_key_exists('master_field', $options) ? $options['master_field'] : false;
if (!$master_field) {
return ;
}
// moved here from Parse, because at Parse time not all of the fields may be set - this is extremly actual, when working with PopulateMlFields mode
$lang = $this->Application->GetVar('m_lang');
$def_lang = $this->Application->GetDefaultLanguageId();
if (!$this->Application->GetVar('allow_translation') && ($lang != $def_lang) && getArrayValue($options, 'required')) {
$def_lang_field = 'l' . $def_lang . '_' . $master_field;
if ( !$object->ValidateRequired($def_lang_field, $options) ) {
$object->SetError($master_field, 'primary_lang_required');
if (array_key_exists($def_lang_field, $object->Fields)) {
$object->SetError($def_lang_field, 'primary_lang_required');
}
}
}
}
function Format($value, $field_name, &$object, $format=null)
{
$master_field = isset($object->Fields[$field_name]['master_field']) ? $object->Fields[$field_name]['master_field'] : false;
if (!$master_field) { // if THIS field is master it does NOT have reference to it's master_field
$lang = $this->Application->GetVar('m_lang');
$value = $object->GetDBField('l'.$lang.'_'.$field_name); //getting value of current language
$master_field = $field_name; // THIS is master_field
}
$options = $object->GetFieldOptions($field_name);
$format = isset($format) ? $format : ( isset($options['format']) ? $options['format'] : null);
// use strpos, becase 2 comma-separated formats could be specified
if ($value == '' && strpos($format, 'no_default') === false) { // try to get default language value
$def_lang_value = $object->GetDBField('l'.$this->Application->GetDefaultLanguageId().'_'.$master_field);
if ($def_lang_value == '') {
return NULL;
}
return $this->_replaceFCKLinks($def_lang_value, $options, $format); //return value from default language
}
return $this->_replaceFCKLinks($value, $options, $format);
}
/**
* Performs required field check on primary language
*
* @param mixed $value
* @param string $field_name
* @param kDBItem $object
* @return string
*/
function Parse($value, $field_name, &$object)
{
if ($value == '') return NULL;
return $value;
}
}
\ No newline at end of file
Index: branches/5.0.x/core/units/helpers/col_picker_helper.php
===================================================================
--- branches/5.0.x/core/units/helpers/col_picker_helper.php (revision 13289)
+++ branches/5.0.x/core/units/helpers/col_picker_helper.php (revision 13290)
@@ -1,242 +1,274 @@
<?php
/**
* @version $Id$
* @package In-Portal
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class kColumnPickerHelper extends kHelper {
var $PickerData;
var $GridName;
var $UseFreezer;
+ /**
+ * Columns renamed by formatter in last used grid
+ *
+ * @var Array
+ */
+ var $formatterRenamed = Array ();
+
function Init($prefix,$special,$event_params=null)
{
parent::Init($prefix, $special, $event_params);
$this->UseFreezer = $this->Application->ConfigValue('UseColumnFreezer');
}
function LoadColumns($prefix)
{
$val = $this->Application->RecallPersistentVar($this->_getVarName($prefix, 'get'), 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)
{
+ // remove language prefix from field, because formatter renamed column
+ if (in_array($a, $this->formatterRenamed)) {
+ $a = preg_replace('/^l[\d]+_/', '', $a);
+ }
+
+ if (in_array($b, $this->formatterRenamed)) {
+ $b = preg_replace('/^l[\d]+_/', '', $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;
+ return 0;
+ }
+
+ return ($a_index < $b_index) ? -1 : 1;
}
function RebuildColumns($prefix, $current=null)
{
// get default columns from unit config
$cols = $this->GetColumns($prefix);
if (is_array($current)) {
// 1. prepare visible columns
// keep user column order (common columns between user and default grid)
$common = array_intersect($current['order'], $cols['order']);
// get new columns (found in default grid, but not found in user's grid)
$added = array_diff($cols['order'], $current['order']);
if (in_array('__FREEZER__', $added)) {
// in case if freezer was added, then make it first column
array_unshift($common, '__FREEZER__');
unset($added[array_search('__FREEZER__', $added)]);
}
$cols['order'] = array_merge($common, $added);
// 2. prepare hidden columns
if ($added) {
$hidden_added = array_intersect($added, $cols['hidden_fields']);
$cols['hidden_fields'] = array_intersect($current['order'], $current['hidden_fields']);
// when some of new columns are hidden, then keep them hidden
foreach ($hidden_added as $position => $field) {
$cols['hidden_fields'][$position] = $field;
}
}
else {
$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)
{
$this->Application->StorePersistentVar($this->_getVarName($prefix, 'set'), serialize($cols));
}
/**
* Gets variable name in persistent session to store column positions in
*
* @param string $prefix
* @param string $mode
* @return string
*/
function _getVarName($prefix, $mode = 'get')
{
$view_name = $this->Application->RecallVar($prefix . '_current_view');
$ret = $prefix . '[' . $this->GridName . ']columns_.' . $view_name;
if ($mode == 'get') {
if ($this->Application->RecallPersistentVar($ret) === false) {
$ret = $prefix . '_columns_.' . $view_name;
}
}
return $ret;
}
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) {
+ if (array_key_exists('formatter_renamed', $options) && $options['formatter_renamed']) {
+ // remove language prefix from field, because formatter renamed column
+ $this->formatterRenamed[] = $name;
+ $name = preg_replace('/^l[\d]+_/', '', $name);
+ }
+
$fields[$counter] = $name;
$titles[$name] = $options['title'];
$widths[$name] = array_key_exists('width', $options) ? $options['width'] : 100; // only once per grid !
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) {
+ if (array_key_exists('formatter_renamed', $options) && $options['formatter_renamed']) {
+ // remove language prefix from field, because formatter renamed column
+ $name_renamed = preg_replace('/^l[\d]+_/', '', $name);
+ }
+ else {
+ $name_renamed = $name;
+ }
+
+ if (array_search($name_renamed, $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;
}
}
\ No newline at end of file

Event Timeline