예제 #1
0
 /**
  *
  */
 public function getDisplayValue($pa_options = null)
 {
     if (caGetOption('returnAsDecimalWithCurrencySpecifier', $pa_options, false)) {
         return $this->ops_currency_specifier . ' ' . $this->opn_value;
     }
     if (Zend_Registry::isRegistered("Zend_Locale")) {
         $o_locale = Zend_Registry::get('Zend_Locale');
     } else {
         $o_locale = new Zend_Locale('en_US');
     }
     $vs_format = Zend_Locale_Data::getContent($o_locale, 'currencynumber');
     // this returns a string like '50,00 ¤' for locale de_DE
     $vs_decimal_with_placeholder = Zend_Locale_Format::toNumber($this->opn_value, array('locale' => $o_locale, 'number_format' => $vs_format, 'precision' => 2));
     // if the currency placeholder is the first character, for instance in en_US locale ($10), insert a space.
     // we do this because we don't print "$10" (which is expected in the Zend locale rules) but "USD 10" ... and that looks nicer with an additional space.
     // we also replace the weird multibyte nonsense Zend uses as placeholder with something more reasonable so that
     // whatever we output here isn't rejected if thrown into parseValue() again
     if (substr($vs_decimal_with_placeholder, 0, 2) == "¤") {
         // '¤' has length 2
         $vs_decimal_with_placeholder = str_replace("¤", '% ', $vs_decimal_with_placeholder);
     } elseif (substr($vs_decimal_with_placeholder, -2) == "¤") {
         // placeholder at the end
         $vs_decimal_with_placeholder = preg_replace("![^\\d\\,\\.]!", "", $vs_decimal_with_placeholder) . " %";
     }
     // insert currency which is not locale-dependent in our case
     $vs_val = str_replace('%', $this->ops_currency_specifier, $vs_decimal_with_placeholder);
     if (($vs_to_currency = caGetOption('displayCurrencyConversion', $pa_options, false)) && $this->ops_currency_specifier != $vs_to_currency) {
         $vs_val .= " (" . _t("~%1", caConvertCurrencyValue($this->ops_currency_specifier . ' ' . $this->opn_value, $vs_to_currency)) . ")";
     }
     return $vs_val;
 }
예제 #2
0
/**
 * 
 */
function caProcessBottomLineTemplate($po_request, $pa_placement, $pr_res, $pa_options = null)
{
    global $g_ui_units_pref, $g_ui_locale;
    if (!isset($pa_placement['settings']['bottom_line']) || !$pa_placement['settings']['bottom_line']) {
        return null;
    }
    if (!$pr_res) {
        return null;
    }
    $vs_template = $pa_placement['settings']['bottom_line'];
    $vs_bundle_name = $pa_placement['bundle_name'];
    $pn_page_start = caGetOption('pageStart', $pa_options, 0);
    $pn_page_end = caGetOption('pageEnd', $pa_options, $pr_res->numHits());
    if (($vn_current_index = $pr_res->currentIndex()) < 0) {
        $vn_current_index = 0;
    }
    $pr_res->seek(0);
    $o_dm = Datamodel::load();
    $va_tmp = explode(".", $vs_bundle_name);
    if (!($t_instance = $o_dm->getInstanceByTableName($va_tmp[0], true))) {
        return null;
    }
    if (!method_exists($t_instance, "_getElementDatatype") || is_null($vn_datatype = $t_instance->_getElementDatatype($va_tmp[1]))) {
        return null;
    }
    if (!($vs_user_currency = $po_request->user ? $po_request->user->getPreference('currency') : 'USD')) {
        $vs_user_currency = 'USD';
    }
    // Parse out tags and optional sub-elements from template
    //		we have to pull each sub-element separately
    //
    //		Ex. 	^SUM:valuation = sum of "valuation" sub-element
    //				^SUM = sum of primary value in non-container element
    if (!preg_match("!(\\^[A-Z]+[\\:]{0,1}[A-Za-z0-9\\_\\-]*)!", $vs_template, $va_tags)) {
        return $vs_template;
    }
    $va_tags_to_process = array();
    $va_subelements_to_process = array();
    if ($vn_datatype == 0) {
        // container
        foreach ($va_tags as $vs_raw_tag) {
            $va_tmp = explode(":", $vs_raw_tag);
            $vs_tag = $va_tmp[0];
            if (sizeof($va_tmp) == 2) {
                $vs_subelement = $va_tmp[1];
            } else {
                continue;
            }
            $va_tags_to_process[$vs_raw_tag] = true;
            $va_subelements_to_process["{$vs_bundle_name}.{$vs_subelement}"] = $t_instance->_getElementDatatype($vs_subelement);
        }
    } else {
        $va_tmp = explode(".", $vs_bundle_name);
        if (sizeof($va_tmp) == 2) {
            $vs_bundle_name .= "." . array_pop($va_tmp);
        }
        $va_subelements_to_process = array($vs_bundle_name => $vn_datatype);
    }
    $vn_c = 0;
    $vn_page_len = 0;
    $vb_has_timecode = false;
    $vn_min = $vn_max = null;
    $vn_page_min = $vn_page_max = null;
    $va_tag_values = array();
    while ($pr_res->nextHit()) {
        foreach ($va_subelements_to_process as $vs_subelement => $vn_subelement_datatype) {
            if (!is_array($va_tag_values[$vs_subelement])) {
                $va_tag_values[$vs_subelement]['SUM'] = 0;
                $va_tag_values[$vs_subelement]['PAGESUM'] = 0;
                $va_tag_values[$vs_subelement]['MIN'] = null;
                $va_tag_values[$vs_subelement]['PAGEMIN'] = null;
                $va_tag_values[$vs_subelement]['MAX'] = null;
                $va_tag_values[$vs_subelement]['PAGEMAX'] = null;
                $va_tag_values[$vs_subelement]['AVG'] = 0;
                $va_tag_values[$vs_subelement]['PAGEAVG'] = 0;
            }
            switch ($vn_subelement_datatype) {
                case 2:
                    // date range
                    $vs_value = $pr_res->get($vs_subelement);
                    break;
                case 6:
                    // currency
                    $va_values = $pr_res->get($vs_subelement, array('returnAsDecimalWithCurrencySpecifier' => true, 'returnAsArray' => true));
                    if (is_array($va_values)) {
                        foreach ($va_values as $vs_value) {
                            $vn_value = (double) caConvertCurrencyValue($vs_value, $vs_user_currency, array('numericValue' => true));
                            $va_tag_values[$vs_subelement]['SUM'] += $vn_value;
                            if (is_null($va_tag_values[$vs_subelement]['MIN']) || $vn_value < $va_tag_values[$vs_subelement]['MIN']) {
                                $va_tag_values[$vs_subelement]['MIN'] = $vn_value;
                            }
                            if (is_null($va_tag_values[$vs_subelement]['MAX']) || $vn_value > $va_tag_values[$vs_subelement]['MAX']) {
                                $va_tag_values[$vs_subelement]['MAX'] = $vn_value;
                            }
                            if ($vn_c >= $pn_page_start && $vn_c <= $pn_page_end) {
                                $va_tag_values[$vs_subelement]['PAGESUM'] += $vn_value;
                                if (is_null($va_tag_values[$vs_subelement]['PAGEMIN']) || $vn_value < $va_tag_values[$vs_subelement]['PAGEMIN']) {
                                    $va_tag_values[$vs_subelement]['PAGEMIN'] = $vn_value;
                                }
                                if (is_null($va_tag_values[$vs_subelement]['PAGEMAX']) || $vn_value > $va_tag_values[$vs_subelement]['PAGEMAX']) {
                                    $va_tag_values[$vs_subelement]['PAGEMAX'] = $vn_value;
                                }
                                $vn_page_len++;
                            }
                        }
                    }
                    break;
                case 8:
                    // length
                // length
                case 9:
                    // weight
                    $va_values = $pr_res->get($vs_subelement, array('returnAsDecimalMetric' => true, 'returnAsArray' => true));
                    if (is_array($va_values)) {
                        foreach ($va_values as $vs_value) {
                            $vn_value = (double) $vs_value;
                            $va_tag_values[$vs_subelement]['SUM'] += $vn_value;
                            if (is_null($va_tag_values[$vs_subelement]['MIN']) || $vn_value < $va_tag_values[$vs_subelement]['MIN']) {
                                $va_tag_values[$vs_subelement]['MIN'] = $vn_value;
                            }
                            if (is_null($va_tag_values[$vs_subelement]['MAX']) || $vn_value > $va_tag_values[$vs_subelement]['MAX']) {
                                $va_tag_values[$vs_subelement]['MAX'] = $vn_value;
                            }
                            if ($vn_c >= $pn_page_start && $vn_c <= $pn_page_end) {
                                $va_tag_values[$vs_subelement]['PAGESUM'] += $vn_value;
                                if (is_null($va_tag_values[$vs_subelement]['PAGEMIN']) || $vn_value < $va_tag_values[$vs_subelement]['PAGEMIN']) {
                                    $va_tag_values[$vs_subelement]['PAGEMIN'] = $vn_value;
                                }
                                if (is_null($va_tag_values[$vs_subelement]['PAGEMAX']) || $vn_value > $va_tag_values[$vs_subelement]['PAGEMAX']) {
                                    $va_tag_values[$vs_subelement]['PAGEMAX'] = $vn_value;
                                }
                                $vn_page_len++;
                            }
                        }
                    }
                    break;
                case 10:
                    // timecode
                    $va_values = $pr_res->get($vs_subelement, array('returnAsDecimal' => true, 'returnAsArray' => true));
                    if (is_array($va_values)) {
                        foreach ($va_values as $vn_value) {
                            $va_tag_values[$vs_subelement]['SUM'] += $vn_value;
                            if (is_null($vn_min) || $vn_value < $vn_min) {
                                $vn_min = $vn_value;
                            }
                            if (is_null($vn_max) || $vn_value > $vn_max) {
                                $vn_max = $vn_value;
                            }
                            if ($vn_c >= $pn_page_start && $vn_c <= $pn_page_end) {
                                $va_tag_values[$vs_subelement]['PAGESUM'] += $vn_value;
                                if (is_null($vn_page_min) || $vn_value < $vn_page_min) {
                                    $vn_page_min = $vn_value;
                                }
                                if (is_null($vn_page_max) || $vn_value > $vn_page_max) {
                                    $vn_page_max = $vn_value;
                                }
                                $vn_page_len++;
                            }
                        }
                    }
                    $vb_has_timecode = true;
                    break;
                case 11:
                    // integer
                // integer
                case 12:
                    // numeric (decimal)
                // numeric (decimal)
                default:
                    $va_values = $pr_res->get($vs_subelement, array('returnAsArray' => true));
                    if (is_array($va_values)) {
                        foreach ($va_values as $vs_value) {
                            $vn_value = (double) $vs_value;
                            $va_tag_values[$vs_subelement]['SUM'] += $vn_value;
                            if (is_null($vn_min) || $vn_value < $vn_min) {
                                $vn_min = $vn_value;
                            }
                            if (is_null($vn_max) || $vn_value > $vn_max) {
                                $vn_max = $vn_value;
                            }
                            if ($vn_c >= $pn_page_start && $vn_c <= $pn_page_end) {
                                $va_tag_values[$vs_subelement]['PAGESUM'] += $vn_value;
                                if (is_null($vn_page_min) || $vn_value < $vn_page_min) {
                                    $vn_page_min = $vn_value;
                                }
                                if (is_null($vn_page_max) || $vn_value > $vn_page_max) {
                                    $vn_page_max = $vn_value;
                                }
                                $vn_page_len++;
                            }
                        }
                    }
                    break;
                default:
                    break 2;
            }
        }
        $vn_c++;
    }
    if ($vb_has_timecode) {
        $o_tcp = new TimecodeParser();
        $o_config = Configuration::load();
        if (!($vs_timecode_format = $o_config->get('timecode_output_format'))) {
            $vs_timecode_format = 'HOURS_MINUTES_SECONDS';
        }
    }
    // Post processing
    foreach ($va_subelements_to_process as $vs_subelement => $vn_subelement_datatype) {
        switch ($vn_subelement_datatype) {
            case 6:
                // currency
                $va_tag_values[$vs_subelement]['PAGEAVG'] = $vn_page_len > 0 ? sprintf("%1.2f", $va_tag_values[$vs_subelement]['PAGESUM'] / $vn_page_len) : 0;
                $va_tag_values[$vs_subelement]['AVG'] = $vn_c > 0 ? sprintf("%1.2f", $va_tag_values[$vs_subelement]['SUM'] / $vn_c) : "0.00";
                foreach ($va_tag_values[$vs_subelement] as $vs_tag => $vn_val) {
                    $va_tag_values[$vs_subelement][$vs_tag] = "{$vs_user_currency} " . $va_tag_values[$vs_subelement][$vs_tag];
                }
                break;
            case 8:
                // length
                $va_tag_values[$vs_subelement]['PAGEAVG'] = $vn_page_len > 0 ? sprintf("%1.2f", $va_tag_values[$vs_subelement]['PAGESUM'] / $vn_page_len) : 0;
                $va_tag_values[$vs_subelement]['AVG'] = $vn_c > 0 ? sprintf("%1.2f", $va_tag_values[$vs_subelement]['SUM'] / $vn_c) : "0.00";
                foreach ($va_tag_values[$vs_subelement] as $vs_tag => $vn_val) {
                    $vo_measurement = new Zend_Measure_Length((double) $vn_val, 'METER', $g_ui_locale);
                    $va_tag_values[$vs_subelement][$vs_tag] = $vo_measurement->convertTo($g_ui_units_pref == 'metric' ? Zend_Measure_Length::METER : Zend_Measure_Length::FEET, 4);
                }
                break;
            case 9:
                // weight
                $va_tag_values[$vs_subelement]['PAGEAVG'] = $vn_page_len > 0 ? sprintf("%1.2f", $va_tag_values[$vs_subelement]['PAGESUM'] / $vn_page_len) : 0;
                $va_tag_values[$vs_subelement]['AVG'] = $vn_c > 0 ? sprintf("%1.2f", $va_tag_values[$vs_subelement]['SUM'] / $vn_c) : "0.00";
                foreach ($va_tag_values[$vs_subelement] as $vs_tag => $vn_val) {
                    $vo_measurement = new Zend_Measure_Length((double) $vn_val, 'KILOGRAM', $g_ui_locale);
                    $va_tag_values[$vs_subelement][$vs_tag] = $vo_measurement->convertTo($g_ui_units_pref == 'metric' ? Zend_Measure_Weight::KILOGRAM : Zend_Measure_Weight::POUND, 4);
                }
                break;
            case 10:
                // timecode
                $va_tag_values[$vs_subelement]['PAGEAVG'] = $vn_page_len > 0 ? sprintf("%1.2f", $va_tag_values[$vs_subelement]['PAGESUM'] / $vn_page_len) : 0;
                $va_tag_values[$vs_subelement]['AVG'] = $vn_c > 0 ? sprintf("%1.2f", $va_tag_values[$vs_subelement]['SUM'] / $vn_c) : 0;
                foreach ($va_tag_values[$vs_subelement] as $vs_tag => $vn_val) {
                    if (!$vb_has_timecode) {
                        $va_tag_values[$vs_subelement][$vs_tag] = '';
                        continue;
                    }
                    $o_tcp->setParsedValueInSeconds($vn_val);
                    $va_tag_values[$vs_subelement][$vs_tag] = $o_tcp->getText($vs_timecode_format);
                }
                break;
            case 11:
                // integer
                foreach ($va_tag_values[$vs_subelement] as $vs_tag => $vn_val) {
                    $va_tag_values[$vs_subelement][$vs_tag] = (int) $va_tag_values[$vs_subelement][$vs_tag];
                }
                break;
            case 12:
                // numeric (decimal)
                foreach ($va_tag_values[$vs_subelement] as $vs_tag => $vn_val) {
                    $va_tag_values[$vs_subelement][$vs_tag] = (double) $va_tag_values[$vs_subelement][$vs_tag];
                }
                break;
        }
    }
    // Restore current position of search result
    $pr_res->seek($vn_current_index);
    foreach ($va_tag_values as $vs_subelement => $va_tag_data) {
        foreach ($va_tag_data as $vs_tag => $vs_tag_value) {
            if ($vs_subelement == $vs_bundle_name) {
                $vs_template = str_replace("^{$vs_tag}", $vs_tag_value, $vs_template);
            } else {
                $va_tmp = explode(".", $vs_subelement);
                $vs_template = str_replace("^{$vs_tag}:" . array_pop($va_tmp), $vs_tag_value, $vs_template);
            }
        }
    }
    return $vs_template;
}
예제 #3
0
 /**
  *
  */
 public function getDisplayValue($pa_options = null)
 {
     if (caGetOption('returnAsDecimalWithCurrencySpecifier', $pa_options, false)) {
         return $this->ops_currency_specifier . ' ' . $this->opn_value;
     }
     if (Zend_Registry::isRegistered("Zend_Locale")) {
         $o_locale = Zend_Registry::get('Zend_Locale');
     } else {
         $o_locale = new Zend_Locale('en_US');
     }
     $vs_format = Zend_Locale_Data::getContent($o_locale, 'currencynumber');
     // this returns a string like '50,00 ¤' for locale de_DE
     $vs_decimal_with_placeholder = Zend_Locale_Format::toNumber($this->opn_value, array('locale' => $locale, 'number_format' => $vs_format, 'precision' => 2));
     // if the currency placeholder is the first character, for instance in en_US locale ($10), insert a space.
     // this has to be done because we don't print "$10" (which is expected in the locale rules) but "USD 10" ... and that looks nicer with an additional space.
     if (substr($vs_decimal_with_placeholder, 0, 2) == '¤') {
         // for whatever reason '¤' has length 2
         $vs_decimal_with_placeholder = str_replace('¤', '¤ ', $vs_decimal_with_placeholder);
     }
     // insert currency which is not locale-dependent in our case
     $vs_val = str_replace('¤', $this->ops_currency_specifier, $vs_decimal_with_placeholder);
     if (($vs_to_currency = caGetOption('displayCurrencyConversion', $pa_options, false)) && $this->ops_currency_specifier != $vs_to_currency) {
         $vs_val .= " (" . _t("~%1", caConvertCurrencyValue($this->ops_currency_specifier . ' ' . $this->opn_value, $vs_to_currency)) . ")";
     }
     return $vs_val;
 }