Page Menu
Home
In-Portal Phabricator
Search
Configure Global Search
Log In
Files
F776157
in-portal
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Thu, Feb 6, 8:13 PM
Size
15 KB
Mime Type
text/x-diff
Expires
Sat, Feb 8, 8:13 PM (22 h, 23 m)
Engine
blob
Format
Raw Data
Handle
558621
Attached To
rINP In-Portal
in-portal
View Options
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
Log In to Comment