Page Menu
Home
In-Portal Phabricator
Search
Configure Global Search
Log In
Files
F1108891
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
Mon, Aug 25, 7:16 AM
Size
13 KB
Mime Type
text/x-diff
Expires
Wed, Aug 27, 7:16 AM (7 h, 19 m)
Engine
blob
Format
Raw Data
Handle
715801
Attached To
rINP In-Portal
in-portal
View Options
Index: branches/RC/core/units/general/brackets.php
===================================================================
--- branches/RC/core/units/general/brackets.php (revision 10730)
+++ branches/RC/core/units/general/brackets.php (revision 10731)
@@ -1,349 +1,458 @@
<?php
class kBracketsHelper extends kHelper {
-
+
/**
* Field name holding minimal amount
*
* @var string
*/
var $min_field = '';
-
+
/**
* Field name holding maximal amount
*
* @var string
*/
- var $max_field = '';
+ var $max_field = '';
/**
* Default values to be set to automtically created price brackets
*
* @var Array
*/
var $default_values = Array();
-
+
var $defaultStartValue = 1;
-
+
+ /**
+ * Decimal separator
+ *
+ * @var string
+ */
+ var $_decimalSeparator = '';
+
+ /**
+ * Thousands separator
+ *
+ * @var string
+ */
+ var $_thousandsSeparator = '';
+
+ /**
+ * Current language
+ *
+ * @var LanguagesItem
+ */
+ var $_language = null;
+
+ function kBracketsHelper()
+ {
+ parent::kHelper();
+
+ $this->_language =& $this->Application->recallObject('lang.current');
+ /* @var $lang kDBItem */
+
+ $this->_decimalSeparator = $this->_language->GetDBField('DecimalPoint');
+ $this->_thousandsSeparator = $this->_language->GetDBField('ThousandSep');
+ }
+
function InitHelper($min_field, $max_field, $default_values, $default_start_value = null)
{
$this->min_field = $min_field;
$this->max_field = $max_field;
$this->default_values = $default_values;
- if(isset($default_start_value))
- {
+
+ if (isset($default_start_value)) {
$this->defaultStartValue = $default_start_value;
}
}
-
-
+
+ /**
+ * Converts number to operatable form
+ *
+ * @param string $value
+ * @return float
+ */
+ function _parseNumber($value)
+ {
+ $value = str_replace($this->_thousandsSeparator, '', $value);
+ $value = str_replace($this->_decimalSeparator, '.', $value);
+
+ return $value;
+ }
+
+ /**
+ * Returns brackets from form with all numbers parsed
+ *
+ * @param kEvent $event
+ * @return Array
+ */
+ function getBrackets(&$event)
+ {
+ $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
+
+ return $this->parseBrackets($items_info);
+ }
+
+ function parseBrackets($brackets)
+ {
+ if (!$brackets) {
+ return $brackets;
+ }
+
+ foreach ($brackets as $id => $field_values) {
+ if (strlen($brackets[$id]['Start'])) {
+ $brackets[$id]['Start'] = (float)$this->_parseNumber($brackets[$id]['Start']);
+ }
+
+ if (strlen($brackets[$id]['End'])) {
+ $brackets[$id]['End'] = (float)$this->_parseNumber($brackets[$id]['End']);
+ }
+ }
+
+ return $brackets;
+ }
+
+ /**
+ * Formats given brackets and sets them back to request
+ *
+ * @param kEvent $event
+ * @param Array $brackets
+ */
+ function setBrackets(&$event, $brackets)
+ {
+ $brackets = $this->formatBrackets($brackets);
+
+ $this->Application->SetVar($event->getPrefixSpecial(true), $brackets);
+ }
+
+ function formatBrackets($brackets)
+ {
+ if (!$brackets) {
+ return $brackets;
+ }
+
+ foreach ($brackets as $id => $field_values) {
+ if (strlen($brackets[$id]['Start'])) {
+ $brackets[$id]['Start'] = $this->_language->formatNumber($brackets[$id]['Start']);
+ }
+
+ if (strlen($brackets[$id]['End'])) {
+ $brackets[$id]['End'] = $this->_language->formatNumber($brackets[$id]['End']);
+ }
+ }
+
+ return $brackets;
+ }
+
/**
* Adds 5 more empty brackets to brackets
*
* @param kEvent $event
*/
function OnMoreBrackets(&$event)
{
- $field_values = $this->Application->GetVar( $event->getPrefixSpecial(true) );
-
+ $field_values = $this->getBrackets($event);
+
$object =& $event->getObject();
foreach($field_values as $id => $record)
{
if($record[$this->max_field] == '∞') $field_values[$id][$this->max_field] = -1;
}
$new_id = (int)$this->Conn->GetOne('SELECT MIN('.$object->IDField.') FROM '.$object->TableName);
if($new_id > 0) $new_id = 0;
do
{
$new_id--;
}while( $this->arraySearch($field_values, $object->IDField, $new_id) );
$last_max_qty = $this->Conn->GetOne('SELECT MAX('.$this->max_field.') FROM '.$object->TableName);
$min_qty = $this->Conn->GetOne('SELECT MIN('.$this->max_field.') FROM '.$object->TableName);
if($min_qty == -1) $last_max_qty = -1;
if(!$last_max_qty) $last_max_qty = $this->defaultStartValue;
for($i = $new_id; $i > $new_id - 5; $i--)
{
$field_values[$i][$object->IDField] = $i;
$field_values[$i][$this->min_field] = ($i == $new_id-4 && $last_max_qty != -1) ? $last_max_qty : '';
$field_values[$i][$this->max_field] = ($i == $new_id-4 && $last_max_qty != -1) ? -1 : '';
$field_values[$i] = array_merge_recursive2($field_values[$i], $this->default_values);
}
$event->CallSubEvent('OnPreSaveBrackets');
- $this->Application->SetVar($event->getPrefixSpecial(true), $field_values);
+ $this->setBrackets($event, $field_values);
}
-
+
/**
* Adds infinity bracket
*
* @param kEvent $event
*/
function OnInfinity(&$event)
{
$object =& $event->getObject();
$infinite_exists = $this->Conn->GetOne('SELECT COUNT(*) FROM '.$object->TableName.' WHERE '.$this->max_field.' = -1');
- $field_values = $this->Application->GetVar( $event->getPrefixSpecial(true) );
- /*if(is_array($field_values))
+ $field_values = $this->getBrackets($event);
+ /*if(is_array($field_values))
{
foreach($field_values as $values)
{
$infinite_exists = $infinite_exists || ($values[$this->max_field] == -1);
}
}*/
-
- if($infinite_exists == 0)
- {
+
+ if ($infinite_exists == 0) {
reset($field_values);
$last_bracket = end($field_values);
$new_id = (int)$this->Conn->GetOne('SELECT MIN('.$object->IDField.') FROM '.$object->TableName);
$brackets_exist = (int)$this->Conn->GetOne('SELECT COUNT(*) FROM '.$object->TableName);
if($new_id > 0) $new_id = 0;
do
{
$new_id--;
}while( $this->arraySearch($field_values, $object->IDField, $new_id) );
$infinite_bracket[$object->IDField] = $new_id;
$infinite_bracket[$this->min_field] = ($brackets_exist > 0) ? $last_bracket[$this->max_field] : $this->defaultStartValue;
$infinite_bracket[$this->max_field] = '-1';
$infinite_bracket = array_merge_recursive2($infinite_bracket, $this->default_values);
-
+
$field_values[$new_id] = $infinite_bracket;
reset($field_values);
-
- $this->Application->SetVar($event->getPrefixSpecial(true), $field_values);
+
+ $this->setBrackets($event, $field_values);
}
}
-
+
/**
* Saves brackets to database
*
* @param kEvent $event
*/
function OnPreSaveBrackets(&$event)
{
- $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true));
- if($items_info)
- {
+ $items_info = $this->getBrackets($event);
+ if ($items_info) {
$object =& $event->getObject();
$linked_info = $object->getLinkedInfo();
$stored_ids = $this->Conn->GetCol('SELECT '.$object->IDField.' FROM '.$object->TableName.' WHERE '.$linked_info['ForeignKey'].' = '.$linked_info['ParentId']);
-
+
uasort($items_info, Array(&$this, 'compareBrackets') );
- foreach ($items_info as $item_id => $values)
- {
+ foreach ($items_info as $item_id => $values) {
if (in_array($item_id, $stored_ids)) { //if it's already exist
$object->SetDefaultValues();
$object->Load($item_id);
$object->SetFieldsFromHash($values);
if (!$object->Validate()) {
unset($stored_ids[array_search($item_id, $stored_ids)]);
$event->redirect = false;
continue;
}
if( $object->Update($item_id) )
{
$event->status = erSUCCESS;
}
else
{
$event->status = erFAIL;
$event->redirect = false;
break;
}
unset( $stored_ids[ array_search($item_id, $stored_ids) ] );
}
else {
$object->SetDefaultValues();
$object->SetFieldsFromHash($values);
$object->SetDBField($linked_info['ForeignKey'], $linked_info['ParentId']);
if( $object->Create() )
{
$object->setTempID();
$event->status = erSUCCESS;
}
}
}
// delete
foreach ($stored_ids as $stored_id)
{
$this->Conn->Query('DELETE FROM '.$object->TableName.' WHERE '.$object->IDField.' = '.$stored_id);
}
}
}
-
+
function arrangeBrackets(&$event)
{
$object =& $event->getObject();
-
- $temp = $this->Application->GetVar( $event->getPrefixSpecial(true) );
-
+
+ $temp = $this->getBrackets($event);
+
foreach($temp as $id => $record)
{
if( $record[$this->max_field] == '∞' )
{
$temp[$id][$this->max_field] = -1;
}
}
-
+
$temp_orig = $temp;
reset($temp);
if( is_array($temp) )
{
// array to store max values (2nd column)
$end_values = Array();
// get minimal value of Min
$first_elem = current($temp);
$start = $first_elem[$this->min_field];
- if(!$start) $start = $this->defaultStartValue;
-
+ if (!strlen($start)) {
+ $start = $this->defaultStartValue;
+ }
+
foreach($temp as $id => $record)
{
if(
// MAX is less than start
($record[$this->max_field] <= $start && $record[$this->max_field] != -1) ||
// Max is empty
- !$record[$this->max_field] ||
+ !strlen($record[$this->max_field]) ||
// Max already defined in $end_values
(array_search($record[$this->max_field], $end_values) !== false)
) { // then delete from brackets list
unset($temp[$id]);
}
else { // this is when ok - add to end_values list
$end_values[] = $record[$this->max_field];
}
}
// sort brackets by 2nd column (Max values)
uasort($temp, Array(&$this, 'compareBrackets') );
reset($temp);
$first_item = each($temp);
$first_item_key = $first_item['key'];
$linked_info = $object->getLinkedInfo();
$sql = 'SELECT %s FROM %s WHERE %s = %s';
$ids = $this->Conn->GetCol( sprintf($sql, $object->IDField, $object->TableName, $linked_info['ForeignKey'], $linked_info['ParentId']) );
if( is_array($ids) )
{
usort($ids, Array(&$this, 'sortBracketIDs') );
}
-
- $min_id = min( min($ids) - 1, -1 );
+
+// $min_id = min( min($ids) - 1, -1 );
foreach($temp as $key => $record)
{
$temp[$key][$this->min_field] = $start;
$start = $temp[$key][$this->max_field];
}
}
-
- $this->Application->SetVar($event->getPrefixSpecial(true), $temp);
+
+ $this->setBrackets($event, $temp);
+
return $temp;
}
-
+
function compareBrackets($bracket1, $bracket2) // ap_bracket_comp
{
$bracket1_min = $bracket1[$this->min_field];
$bracket1_max = $bracket1[$this->max_field];
-
+
$bracket2_min = $bracket2[$this->min_field];
$bracket2_max = $bracket2[$this->max_field];
-
+
// limits
if( ($bracket1_min != '') && ($bracket1_max == '') && ($bracket2_min != '') && ($bracket2_max != '') ) return 1;
if( ($bracket1_min != '') && ($bracket1_max == '') && ($bracket2_min == '') && ($bracket2_max == '') ) return -1;
if( ($bracket1_max == '') && ($bracket2_max != '') ) return 1;
if( ($bracket1_max != '') && ($bracket2_max == '') ) return -1;
if( ( ($bracket1_max > $bracket2_max) && ($bracket2_max != -1) ) || ( ($bracket1_max == -1) && ($bracket2_max != -1) ) )
{
return 1;
}
elseif( ($bracket1_max < $bracket2_max) || ( ($bracket2_max == -1) && ($bracket1_max != -1) ) )
{
return -1;
}
else
{
return 0;
}
}
-
+
function sortBracketIDs($first_id, $second_id) // pr_bracket_id_sort
{
$first_abs = abs($first_id);
$second_abs = abs($second_id);
-
+
$first_sign = ($first_id == 0) ? 0 : $first_id / $first_abs;
$second_sign = ($second_id == 0) ? 0 : $second_id / $second_abs;
-
+
if($first_sign != $second_sign)
{
if($first_id > $second_id)
{
$bigger =& $first_abs;
$smaller =& $second_abs;
}
else
{
$bigger =& $second_abs;
$smaller =& $first_abs;
}
$smaller = $bigger + $smaller;
}
return ($first_abs > $second_abs) ? 1 : ($first_abs < $second_abs ? -1 : 0);
}
-
+
/**
* Searches through submitted grid data to find record with specific value in specific field
*
* @param Array $records // grid data from REQUEST
* @param string $field
* @param string $value
* @return bool
*/
function arraySearch($records, $field, $value) // check_array
{
foreach ($records as $record)
{
if ($record[$field] == $value)
{
return true;
}
}
return false;
}
-
+
/**
* Replate infinity mark with -1 before saving to db
*
* @param kEvent $event
*/
function replaceInfinity(&$event)
{
$object =& $event->getObject();
if($object->GetDBField($this->max_field) == '∞') $object->SetDBField($this->max_field, -1);
}
-
+
}
?>
\ No newline at end of file
Property changes on: branches/RC/core/units/general/brackets.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.4
\ No newline at end of property
+1.4.26.1
\ No newline at end of property
Event Timeline
Log In to Comment