# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: rubentbstk@gmail.com-20090413183731-wx7vvvjti8t95a5f # target_branch: http://bazaar.ubercart.org/drupal6/ubercart # testament_sha1: 3a75456908a44e5356708e88dbfe5ff3cc76c430 # timestamp: 2009-04-13 13:38:06 -0500 # base_revision_id: ryan@ubercart.org-20090412021138-wwgusm90fumx9aud # # Begin patch === modified file 'ca/ca.module' --- ca/ca.module 2009-04-07 18:22:28 +0000 +++ ca/ca.module 2009-04-13 14:26:56 +0000 @@ -156,6 +156,10 @@ * TRUE or FALSE indicating if at least one predicate was evaluated. */ function ca_pull_trigger() { + // Trigger actions can pull other triggers. Lock predicates when they are + // marked for evaluation so they can't be evaluated again. + static $locked; + $args = func_get_args(); $trigger = array_shift($args); @@ -185,11 +189,17 @@ // Loop through the predicates and evaluate them one by one. foreach ($predicates as $pid => $predicate) { - // If all of a predicate's conditions evaluate to TRUE... - if (ca_evaluate_conditions($predicate, $arguments)) { - // Then perform its actions. - ca_perform_actions($predicate, $arguments); + // Prevent the predicate from being evaluated if it already has been with + // the same arguments. + $key = $pid . serialize($arguments); + if (!isset($locked[$key])) { + // If all of a predicate's conditions evaluate to TRUE... + if (ca_evaluate_conditions($predicate, $arguments)) { + // Then perform its actions. + ca_perform_actions($predicate, $arguments); + } } + $locked[$key] = TRUE; } return TRUE; @@ -247,10 +257,6 @@ * An array of predicates. */ function ca_load_trigger_predicates($trigger, $all = FALSE) { - // Trigger actions can pull other triggers. Lock predicates when they are - // marked for evaluation so they can't be evaluated again. - static $locked = array(); - // Load all the module defined predicates. $predicates = module_invoke_all('ca_predicate'); @@ -266,18 +272,8 @@ if (!$all && $value['#status'] <= 0) { unset($predicates[$key]); } - else { - // Prevent predicates from being evaluated more than once in a page load. - if (in_array($key, $locked)) { - unset($predicates[$key]); - } - else { - $locked[$key] = $key; - } - - if (!isset($value['#weight'])) { - $predicates[$key]['#weight'] = 0; - } + elseif (!isset($value['#weight'])) { + $predicates[$key]['#weight'] = 0; } } @@ -288,28 +284,22 @@ // these, we unset the module defined predicate and reconsider adding it in. if (!is_numeric($data['pid'])) { unset($predicates[$data['pid']]); - unset($locked[$data['pid']]); } // Add predicates from the database to our return array if $all == TRUE or // if the predicate is active. if ($all || $data['status'] > 0) { - // Prevent predicates from being evaluated more than once in a page load. - if (!in_array($data['pid'], $locked)) { - $predicate = ca_prepare_db_predicate($data); + $predicate = ca_prepare_db_predicate($data); - // Set the actions' weight if necessary and sort actions by their weight. - for ($i = 0; $i < count($predicate['#actions']); $i++) { - if (!isset($predicate['#actions'][$i]['#weight'])) { - $predicate['#actions'][$i]['#weight'] = 0; - } + // Set the actions' weight if necessary and sort actions by their weight. + for ($i = 0; $i < count($predicate['#actions']); $i++) { + if (!isset($predicate['#actions'][$i]['#weight'])) { + $predicate['#actions'][$i]['#weight'] = 0; } - usort($predicate['#actions'], 'ca_weight_sort'); - - $predicates[$data['pid']] = $predicate; - - $locked[$key] = $data['pid']; } + usort($predicate['#actions'], 'ca_weight_sort'); + + $predicates[$data['pid']] = $predicate; } } === modified file 'payment/uc_payment/uc_payment.admin.inc' --- payment/uc_payment/uc_payment.admin.inc 2009-02-10 21:51:13 +0000 +++ payment/uc_payment/uc_payment.admin.inc 2009-04-13 14:34:21 +0000 @@ -297,10 +297,22 @@ $total = $order->order_total; $payments = uc_payment_load_payments($order->order_id); - $form['order_total'] = array('#value' => uc_currency_format($total)); + $context = array( + 'revision' => 'formatted', + 'location' => 'order-payments-admin', + 'subject' => array( + 'order' => $order, + 'total' => $total, + ), + ); + $form['order_total'] = array('#value' => uc_price($total, $context)); $form['payments'] = tapir_get_table('uc_payments_table'); + $context = array( + + ); if ($payments !== FALSE) { foreach ($payments as $payment) { + $context['subject']['payment'] = $payment; $form['payments'][$payment->receipt_id]['#attributes'] = array('valign' => 'top'); $form['payments'][$payment->receipt_id]['received'] = array( '#value' => format_date($payment->received, 'custom', variable_get('uc_date_format_default', 'm/d/Y') .'H:i:s'), @@ -312,11 +324,13 @@ '#value' => ($payment->method == '') ? t('Unknown') : $payment->method, ); $form['payments'][$payment->receipt_id]['amount'] = array( - '#value' => uc_currency_format($payment->amount), + '#value' => uc_price($payment->amount, $context), ); $total -= $payment->amount; + unset($context['subject']['payment']); + $context['subject']['total'] = $total; $form['payments'][$payment->receipt_id]['balance'] = array( - '#value' => uc_currency_format($total), + '#value' => uc_price($total, $context, array('cache' => FALSE)), ); $form['payments'][$payment->receipt_id]['comment'] = array( '#value' => ($payment->comment == '') ? '-' : filter_xss_admin($payment->comment), @@ -333,7 +347,8 @@ ); } } - $form['balance'] = array('#value' => uc_currency_format($total)); + $context['revision'] = 'formatted'; + $form['balance'] = array('#value' => uc_price($total, $context)); $form['order_id'] = array( '#type' => 'hidden', '#value' => $order->order_id, === modified file 'payment/uc_payment/uc_payment.module' --- payment/uc_payment/uc_payment.module 2008-12-08 17:05:35 +0000 +++ payment/uc_payment/uc_payment.module 2009-04-13 14:34:21 +0000 @@ -326,18 +326,28 @@ .' '; $grand_total = 0; + $context = array( + 'location' => 'checkout-order-total-preview', + ); + foreach ($totals as $line) { if (!empty($line[2])) { + $context['subject'] = array( + 'line_item' => $line, + ); $output .= '' - .''; + .''; if ($line[3]) { $grand_total += round($line[1], 2); } } } + $context['subject'] = array( + 'grand_total' => $grand_total, + ); $output .= '' - .'
'. $line[2] .':'. uc_currency_format($line[1]) .'
'. uc_price($line[1], $context) .'
'. t('Order total:') .''. uc_currency_format($grand_total) + .''. uc_price($grand_total, $context) .'
'; } === modified file 'payment/uc_payment/uc_payment_checkout_pane.inc' --- payment/uc_payment/uc_payment_checkout_pane.inc 2008-11-05 22:41:07 +0000 +++ payment/uc_payment/uc_payment_checkout_pane.inc 2009-04-13 14:34:21 +0000 @@ -100,8 +100,14 @@ } } usort($line_items, 'uc_weight_sort'); + + $context = array( + 'revision' => 'formatted', + 'location' => 'checkout-review-line-item', + ); foreach ($line_items as $line_item) { - $review[] = array('title' => $line_item['title'], 'data' => uc_currency_format($line_item['amount'])); + $context['subject'] = array('line_item' => $line_item); + $review[] = array('title' => $line_item['title'], 'data' => uc_price($line_item['amount'], $context)); } $review_data = _payment_method_data($arg1->payment_method, 'review'); if (empty($review_data)) { === modified file 'payment/uc_payment/uc_payment_order_pane.inc' --- payment/uc_payment/uc_payment_order_pane.inc 2008-11-07 20:19:07 +0000 +++ payment/uc_payment/uc_payment_order_pane.inc 2009-04-13 14:34:21 +0000 @@ -18,7 +18,14 @@ switch ($op) { case 'view': if (variable_get('uc_payment_tracking', TRUE)) { - $output = t('Balance: @balance', array('@balance' => uc_currency_format(uc_payment_balance($arg1)))); + $context = array( + 'revision' => 'formatted', + 'location' => 'payment-balance', + 'subject' => array( + 'order' => $arg1, + ), + ); + $output = t('Balance: @balance', array('@balance' => uc_price(uc_payment_balance($arg1), $context))); $output .= ' ('. l(t('View'), 'admin/store/orders/'. $arg1->order_id .'/payments') .')
'; } $method_name = _payment_method_data($arg1->payment_method, 'review'); === modified file 'shipping/uc_flatrate/uc_flatrate.admin.inc' --- shipping/uc_flatrate/uc_flatrate.admin.inc 2009-02-06 21:02:20 +0000 +++ shipping/uc_flatrate/uc_flatrate.admin.inc 2009-04-13 14:34:57 +0000 @@ -13,16 +13,23 @@ function uc_flatrate_admin_methods() { $output = ''; + $context = array( + 'revision' => 'formatted', + 'location' => 'shipping-flatrate-method-admin', + ); + $rows = array(); $enabled = variable_get('uc_quote_enabled', array()); $weight = variable_get('uc_quote_method_weight', array()); $result = db_query("SELECT mid, title, label, base_rate, product_rate FROM {uc_flatrate_methods}"); while ($method = db_fetch_object($result)) { + $context['subject']['flatrate_method'] = $method; + $row = array(); $row[] = check_plain($method->title); $row[] = check_plain($method->label); - $row[] = uc_currency_format($method->base_rate); - $row[] = uc_currency_format($method->product_rate); + $row[] = uc_price($method->base_rate, $context); + $row[] = uc_price($method->product_rate, $context); $row[] = l(t('edit'), 'admin/store/settings/quotes/methods/flatrate/'. $method->mid); $row[] = l(t('conditions'), CA_UI_PATH .'/uc_flatrate_get_quote_'. $method->mid .'/edit/conditions'); $rows[] = $row; === modified file 'shipping/uc_flatrate/uc_flatrate.module' --- shipping/uc_flatrate/uc_flatrate.module 2009-02-12 15:33:59 +0000 +++ shipping/uc_flatrate/uc_flatrate.module 2009-04-13 14:34:57 +0000 @@ -55,7 +55,12 @@ $enabled = variable_get('uc_quote_enabled', array()); $weight = variable_get('uc_quote_method_weight', array()); $result = db_query("SELECT mid, title, product_rate FROM {uc_flatrate_methods}"); + $context = array( + 'revision' => 'formatted', + 'location' => 'shipping-flatrate-method-node-form', + ); while ($method = db_fetch_object($result)) { + $context['subject']['flatrate_method'] = $method; if (!isset($form['shipping']['flatrate'])) { $form['shipping']['flatrate'] = array( '#type' => 'fieldset', @@ -71,7 +76,7 @@ '#type' => 'textfield', '#title' => $method->title, '#default_value' => $form['#node']->flatrate[$method->mid], - '#description' => t('Default rate: %price', array('%price' => uc_currency_format($method->product_rate))), + '#description' => t('Default rate: %price', array('%price' => uc_price($method->product_rate, $context))), '#size' => 16, '#field_prefix' => $sign_flag ? '' : $currency_sign, '#field_suffix' => $sign_flag ? $currency_sign : '', @@ -201,7 +206,13 @@ function uc_flatrate_quote($products, $details, $method) { $method = explode('_', $method['id']); $mid = $method[1]; + $context = array( + 'revision' => 'formatted', + 'location' => 'shipping-flatrate-method-json', + ); + if ($method = db_fetch_object(db_query("SELECT * FROM {uc_flatrate_methods} WHERE mid = %d", $mid))) { + $context['subject']['flatrate_method'] = $method; // Start at the base rate. $rate = $method->base_rate; @@ -216,7 +227,7 @@ } } - $quotes[] = array('rate' => $rate, 'format' => uc_currency_format($rate), 'option_label' => check_plain($method->label)); + $quotes[] = array('rate' => $rate, 'format' => uc_price($rate, $context), 'option_label' => check_plain($method->label)); } return $quotes; === modified file 'shipping/uc_quote/uc_quote.module' --- shipping/uc_quote/uc_quote.module 2009-03-31 14:14:58 +0000 +++ shipping/uc_quote/uc_quote.module 2009-04-13 14:34:57 +0000 @@ -866,9 +866,14 @@ return TRUE; case 'review': + $context = array( + 'revision' => 'formatted', + 'location' => 'shipping-quote-checkout-pane-review', + ); $result = db_query("SELECT * FROM {uc_order_line_items} WHERE order_id = %d AND type = '%s'", $arg1->order_id, 'shipping'); if ($line_item = db_fetch_object($result)) { - $review[] = array('title' => $line_item->title, 'data' => uc_currency_format($line_item->amount)); + $context['subject']['line_item'] = $line_item; + $review[] = array('title' => $line_item->title, 'data' => uc_price($line_item->amount, $context)); } return $review; } === modified file 'shipping/uc_shipping/uc_shipping.admin.inc' --- shipping/uc_shipping/uc_shipping.admin.inc 2009-04-01 13:40:52 +0000 +++ shipping/uc_shipping/uc_shipping.admin.inc 2009-04-13 14:34:57 +0000 @@ -587,7 +587,12 @@ else { $rows[] = array(t('Services:'), $shipment->accessorials); } - $rows[] = array(t('Cost:'), uc_currency_format($shipment->cost)); + $context = array( + 'revision' => 'formatted', + 'location' => 'shipping-order-view', + 'subject' => array('shipment' => $shipment), + ); + $rows[] = array(t('Cost:'), uc_price($shipment->cost, $context)); $output .= theme('table', array(), $rows, array('style' => 'width:auto')); $output .= ''; foreach ($shipment->packages as $package) { === modified file 'shipping/uc_shipping/uc_shipping.module' --- shipping/uc_shipping/uc_shipping.module 2009-02-04 22:14:23 +0000 +++ shipping/uc_shipping/uc_shipping.module 2009-04-13 14:34:57 +0000 @@ -236,7 +236,12 @@ if ($package->length && $package->width && $package->height) { $rows[] = array(t('Dimensions:'), t('!l x !w x !h', array('!l' => uc_length_format($package->length), '!w' => uc_length_format($package->width), '!h' => uc_length_format($package->height)))); } - $rows[] = array(t('Insured value:'), uc_currency_format($package->value)); + $context = array( + 'revision' => 'formatted', + 'location' => 'shipping-package-view', + 'subject' => array('package' => $package), + ); + $rows[] = array(t('Insured value:'), uc_price($package->value, $context)); if ($package->tracking_number) { $rows[] = array(t('Tracking number:'), check_plain($package->tracking_number)); } === modified file 'shipping/uc_ups/uc_ups.admin.inc' --- shipping/uc_ups/uc_ups.admin.inc 2009-04-04 05:08:59 +0000 +++ shipping/uc_ups/uc_ups.admin.inc 2009-04-13 14:34:57 +0000 @@ -206,7 +206,12 @@ $output .= '
'; $method = uc_ups_shipping_method(); $output .= ''. $method['ups']['quote']['accessorials'][$_SESSION['ups']['service']] .'
'; - $output .= ''. check_plain($_SESSION['ups']['rate']['type']) .': '. uc_currency_format($_SESSION['ups']['rate']['amount']) .' ('. check_plain($_SESSION['ups']['rate']['currency']) .')
'; + $context = array( + 'revision' => 'formatted', + 'location' => 'shipping-ups-confirm', + 'subject' => array('ups_info' => $_SESSION['ups']), + ); + $output .= ''. check_plain($_SESSION['ups']['rate']['type']) .': '. uc_price($_SESSION['ups']['rate']['amount'], $context) .' ('. check_plain($_SESSION['ups']['rate']['currency']) .')
'; $ship_date = $_SESSION['ups']['ship_date']; $output .= 'Ship date: '. format_date(gmmktime(12, 0, 0, $ship_date['month'], $ship_date['day'], $ship_date['year']), 'custom', variable_get('uc_date_format_default', 'm/d/Y')); $exp_delivery = $_SESSION['ups']['expected_delivery']; === modified file 'shipping/uc_ups/uc_ups.module' --- shipping/uc_ups/uc_ups.module 2009-04-04 05:08:59 +0000 +++ shipping/uc_ups/uc_ups.module 2009-04-13 14:34:57 +0000 @@ -834,9 +834,14 @@ } } uasort($quotes, 'uc_quote_price_sort'); + $context = array( + 'revision' => 'formatted', + 'location' => 'shipping-quote', + ); foreach ($quotes as $key => $quote) { if (isset($quote['rate'])) { - $quotes[$key]['format'] = uc_currency_format($quote['rate']); + $context['subject']['quote'] = $quote; + $quotes[$key]['format'] = uc_price($quote['rate'], $context); $quotes[$key]['option_label'] = theme('uc_ups_option_label', $method['ups']['quote']['accessorials'][$key]); } } === modified file 'shipping/uc_usps/uc_usps.module' --- shipping/uc_usps/uc_usps.module 2009-02-12 15:33:59 +0000 +++ shipping/uc_usps/uc_usps.module 2009-04-13 14:34:57 +0000 @@ -399,9 +399,14 @@ unset($services[$service]); } } + $context = array( + 'revision' => 'formatted', + 'location' => 'shipping-usps-quote', + ); foreach ($services as $key => $quote) { if (isset($quote['rate'])) { - $services[$key]['format'] = uc_currency_format($quote['rate']); + $context['subject']['quote'] = $quote; + $services[$key]['format'] = uc_price($quote['rate'], $context); $services[$key]['option_label'] = $quote['label']; } } === modified file 'shipping/uc_weightquote/uc_weightquote.module' --- shipping/uc_weightquote/uc_weightquote.module 2009-02-12 15:33:59 +0000 +++ shipping/uc_weightquote/uc_weightquote.module 2009-04-13 14:34:57 +0000 @@ -182,7 +182,14 @@ $method = uc_weightquote_shipping_method(); - $quotes[] = array('rate' => $rate, 'format' => uc_currency_format($rate), 'option_label' => $method['weightquote']['quote']['accessorials'][0]); + $context = array( + 'revision' => 'formatted', + 'location' => 'shipping-weightquote-quote', + 'subject' => array( + 'method' => $method, + ), + ); + $quotes[] = array('rate' => $rate, 'format' => uc_price($rate, $context), 'option_label' => $method['weightquote']['quote']['accessorials'][0]); return $quotes; } === modified file 'uc_attribute/uc_attribute.module' --- uc_attribute/uc_attribute.module 2009-04-07 18:50:58 +0000 +++ uc_attribute/uc_attribute.module 2009-04-13 14:34:21 +0000 @@ -590,19 +590,35 @@ $form_attributes = array(); + $context = array( + 'revision' => 'formatted', + 'location' => 'product-attribute-form-element', + 'subject' => array(), + ); + // Loop through each product attribute and generate its form element. foreach ($attributes as $attribute) { + $context['subject']['attribute'] = $attribute; // Build the attribute's options array. $options = array(); foreach ($attribute->options as $option) { + $context['subject']['option'] = $option; switch (variable_get('uc_attribute_option_price_format', 'adjustment')) { case 'total': - $display_price = in_array($attribute->aid, $priced_attributes) ? ', '. uc_currency_format(($product->sell_price + $option->price) * $qty) : ''; + $price_info = array( + 'price' => $product->sell_price + $option->price, + 'qty' => $qty, + ); + $display_price = in_array($attribute->aid, $priced_attributes) ? ', '. uc_price($price_info, $context) : ''; if (count($priced_attributes) == 1) { break; } case 'adjustment': - $display_price = ($option->price != 0 ? ', '. ($option->price > 0 ? '+' : '') . uc_currency_format($option->price * $qty) : ''); + $price_info = array( + 'price' => $option->price, + 'qty' => $qty, + ); + $display_price = ($option->price != 0 ? ', '. ($option->price > 0 ? '+' : '') . uc_price($price_info, $context) : ''); break; case 'none': default: === modified file 'uc_cart/uc_cart.module' --- uc_cart/uc_cart.module 2009-04-01 16:39:58 +0000 +++ uc_cart/uc_cart.module 2009-04-13 14:34:21 +0000 @@ -459,7 +459,7 @@ } $item_count += $item->qty; - $total += $item->price * $item->qty; + $total += $display_item['#total']; } } @@ -660,12 +660,16 @@ $output = ''; $row_class = 'odd'; + $context = array( + 'location' => 'cart-block-item', + ); + // Loop through each item. foreach ($items as $item) { // Add the basic row with quantity, title, and price. $output .= '' .'' - .''; + .''; // Add a row of description if necessary. if ($item['desc']) { @@ -700,11 +704,15 @@ * @ingroup themeable */ function theme_uc_cart_block_summary($item_count, $item_text, $total, $summary_links) { + $context = array( + 'revision' => 'formatted', + 'location' => 'cart-block-total', + ); // Build the basic table with the number of items in the cart and total. $output = '
'. $item['qty'] .''. $item['title'] .''. uc_currency_format($item['price']) .'
'. uc_price($item['price'], $context) .'
' .'' .''; + .' '. uc_price($total, $context) .''; // If there are products in the cart... if ($item_count > 0) { @@ -875,8 +883,12 @@ '#value' => '', ); } + + $context = array( + 'location' => 'cart-subtotal', + ); $form['items'][$i]['total'] = array( - '#value' => $display_item['#total'], + '#value' => uc_price($display_item['#total'], $context), '#theme' => 'uc_cart_view_price', ); $i++; @@ -992,7 +1004,7 @@ } function theme_uc_cart_view_price($form) { - return uc_currency_format($form['#value']); + return $form['#value']; } function uc_cart_view_table($table) { @@ -1031,9 +1043,14 @@ $table[$i]['total']['#cell_attributes'] = array('nowrap' => 'nowrap', 'class' => 'price'); $table[$i]['#attributes'] = array('valign' => 'top'); } + + $context = array( + 'revision' => 'formatted', + 'location' => 'cart-table-subtotal', + ); $table[] = array( 'total' => array( - '#value' => ''. t('Subtotal:') .' '. uc_currency_format($subtotal), + '#value' => ''. t('Subtotal:') .' '. uc_price($subtotal, $context), '#cell_attributes' => array( 'colspan' => 'full', 'align' => 'right', === modified file 'uc_cart/uc_cart.pages.inc' --- uc_cart/uc_cart.pages.inc 2009-02-27 16:06:16 +0000 +++ uc_cart/uc_cart.pages.inc 2009-04-13 14:34:21 +0000 @@ -191,9 +191,30 @@ } unset($_SESSION['expanded_panes']); + $context = array( + 'revision' => 'altered', + 'location' => 'cart-checkout-item', + ); + $contents = uc_cart_get_contents(); + foreach ($contents as $key => $item) { + $price_info = array( + 'price' => $item->price, + 'qty' => $item->qty, + ); + $context['subject'] = array( + 'cart_item' => $item, + 'node' => node_load($item->nid), + ); + + // Get the altered price per unit, as ordered products have a locked-in + // price. Price altering rules may change over time, but the amount paid + // by the customer does not after the fact. + $contents[$key]->price = uc_price($price_info, $context) / $item->qty; + } + $form['cart_contents'] = array( '#type' => 'hidden', - '#value' => serialize(uc_cart_get_contents()), + '#value' => serialize($contents), ); $form['cancel'] = array( === modified file 'uc_cart/uc_cart_block.css' --- uc_cart/uc_cart_block.css 2009-04-11 23:47:10 +0000 +++ uc_cart/uc_cart_block.css 2009-04-13 14:34:21 +0000 @@ -115,6 +115,10 @@ font-weight: bold; } +.cart-block-summary-total .uc-price { + display: inline; +} + .cart-block-summary-links { text-align: right; } === modified file 'uc_cart/uc_cart_checkout_pane.inc' --- uc_cart/uc_cart_checkout_pane.inc 2008-12-31 13:50:42 +0000 +++ uc_cart/uc_cart_checkout_pane.inc 2009-04-13 14:34:21 +0000 @@ -27,13 +27,26 @@ case 'review': $items = uc_cart_get_contents(); $output = '
'. $item_text .' '. uc_currency_format($total) .'
'; + $context = array( + 'location' => 'cart-review-item', + 'subject' => array(), + ); foreach ($items as $item) { $desc = check_plain($item->title); foreach (module_implements('cart_item_description') as $module) { $desc .= module_invoke($module, 'cart_item_description', $item); } + + $price_info = array( + 'price' => $item->price, + 'qty' => $item->qty, + ); + $context['subject'] = array( + 'cart_item' => $item, + 'node' => node_load($item->nid), + ); $output .= ''; + .''; } $output .= '
'. $item->qty .'x'. $desc - .''. uc_currency_format($item->price * $item->qty) .'
'. uc_price($price_info, $context) .'
'; $review[] = $output; @@ -557,9 +570,23 @@ array('data' => t('Price'), 'class' => 'price'), ); + $context = array( + 'location' => 'cart-checkout-item', + ); + // Set up table rows. foreach (uc_cart_get_contents() as $item) { - $total = ($item->qty) ? $item->qty * $item->price : $item->price; + $price_info = array( + 'price' => $item->price, + 'qty' => $item->qty, + ); + $context['subject'] = array( + 'cart_item' => $item, + 'node' => node_load($item->nid), + ); + $context['revision'] = 'altered'; + + $total = uc_price($price_info, $context); $subtotal += $total; $description = check_plain($item->title); @@ -567,17 +594,24 @@ $description .= module_invoke($module, 'cart_item_description', $item); } + // Remove node from context to prevent the price from being altered. + unset($context['subject']); + $context['revision'] = 'themed'; $rows[] = array( array('data' => t('@qtyx', array('@qty' => $item->qty)), 'class' => 'qty'), array('data' => $description, 'class' => 'products'), - array('data' => check_plain(uc_currency_format($total)), 'class' => 'price'), + array('data' => uc_price($total, $context), 'class' => 'price'), ); } // Add the subtotal as the final row. if ($show_subtotal) { + $context = array( + 'revision' => 'formatted', + 'location' => 'cart-checkout-subtotal', + ); $rows[] = array( - 'data' => array(array('data' => '' . t('Subtotal:') . ' ' . check_plain(uc_currency_format($subtotal)), 'colspan' => 4, 'class' => 'subtotal')), + 'data' => array(array('data' => '' . t('Subtotal:') . ' ' . uc_price($subtotal, $context), 'colspan' => 4, 'class' => 'subtotal')), 'class' => 'subtotal', ); } === modified file 'uc_order/templates/admin.itpl.php' --- uc_order/templates/admin.itpl.php 2009-01-02 16:03:40 +0000 +++ uc_order/templates/admin.itpl.php 2009-04-13 14:34:21 +0000 @@ -15,8 +15,20 @@


- -- qty; ?> x title .' - '. uc_currency_format($product->price * $product->qty); ?>
+ 'order-invoice-admin', +); +foreach ($products as $product) { + $price_info = array( + 'price' => $product->price, + 'qty' => $product->qty, + ); + $context['subject'] = array( + 'order_product' => $product, + ); +?> +- qty; ?> x title .' - '. uc_price($price_info, $context); ?>
  model; ?>
data['attributes']) && count($product->data['attributes']) > 0) {?> data['attributes'] as $key => $value) { === modified file 'uc_order/templates/customer.itpl.php' --- uc_order/templates/customer.itpl.php 2009-04-04 00:03:04 +0000 +++ uc_order/templates/customer.itpl.php 2009-04-13 14:34:21 +0000 @@ -154,7 +154,14 @@ - 'order-invoice-line-item', + 'subject' => array( + 'order' => $order, + ), + ); + foreach ($line_items as $item) { if ($item['line_item_id'] == 'subtotal' || $item['line_item_id'] == 'total') { continue; }?> @@ -164,7 +171,10 @@ : - + @@ -191,13 +201,25 @@ products)) { - foreach ($order->products as $product) { ?> + $context = array( + 'location' => 'order-invoice-product', + 'subject' => array( + 'order' => $order, + ), + ); + foreach ($order->products as $product) { + $price_info = array( + 'price' => $product->price, + 'qty' => $product->qty, + ); + $context['subject']['order_product'] = $product; + ?>
qty; ?> x - title .' - '. uc_currency_format($product->price * $product->qty); ?> + title .' - '. uc_price($price_info, $context, array(), 'formatted'); ?> qty > 1) { echo t('(!price each)', array('!price' => uc_currency_format($product->price))); } ?> === modified file 'uc_order/uc_order.admin.inc' --- uc_order/uc_order.admin.inc 2009-04-01 17:14:08 +0000 +++ uc_order/uc_order.admin.inc 2009-04-13 14:34:21 +0000 @@ -451,6 +451,13 @@ $address = 'billing'; } + $context = array( + 'location' => 'orders-admin', + 'subject' => array( + 'field' => 'order_total', + ), + ); + $result = pager_query($sql, variable_get('uc_order_number_displayed', 30), 0, NULL, $args); while ($order = db_fetch_object($result)) { if ($address == 'shipping') { @@ -470,12 +477,14 @@ $order_name = t('User: !name', array('!name' => $account)); } } + + $context['subject']['order'] = $order; $rows[] = array( 'data' => array( array('data' => uc_order_actions($order, TRUE), 'nowrap' => 'nowrap'), array('data' => $order->order_id), array('data' => check_plain($order_name), 'nowrap' => 'nowrap'), - array('data' => uc_currency_format($order->order_total, TRUE), 'align' => 'right', 'nowrap' => 'true'), + array('data' => uc_price($order->order_total, $context), 'align' => 'right', 'nowrap' => 'true'), array('data' => format_date($order->created, 'custom', variable_get('uc_date_format_default', 'm/d/Y')), 'align' => 'center'), array('data' => $order->title), ), === modified file 'uc_order/uc_order.ca.inc' --- uc_order/uc_order.ca.inc 2009-04-06 16:37:54 +0000 +++ uc_order/uc_order.ca.inc 2009-04-13 14:34:21 +0000 @@ -728,13 +728,13 @@ // Check an user name function uc_order_condition_user_name($order, $settings) { - if ($account = uc_order_user_load($order)) { - return $account->name == $settings['name']; - } - else { + if (empty($order->uid)) { // Anonymous users have no names. return empty($settings['name']); } + else { + return uc_order_user_load($order)->name == $settings['name']; + } } function uc_order_condition_user_name_form($form_state, $settings = array()) { === modified file 'uc_order/uc_order.line_item.inc' --- uc_order/uc_order.line_item.inc 2009-02-27 15:32:25 +0000 +++ uc_order/uc_order.line_item.inc 2009-04-13 14:34:21 +0000 @@ -24,9 +24,21 @@ ); return $lines; case 'cart-preview': + $context = array( + 'revision' => 'altered', + 'location' => 'cart-preview-subtotal-item', + ); $subtotal = 0; foreach ($arg1 as $item) { - $total = ($item->qty) ? $item->qty * $item->price : $item->price; + $price_info = array( + 'price' => $item->price, + 'qty' => ($item->qty) ? $item->qty : 1, + ); + $context['subject'] = array( + 'cart_item' => $item, + 'node' => node_load($item->nid), + ); + $total = uc_price($price_info, $context); $subtotal += $total; } if (module_exists('uc_payment') && variable_get('uc_pane_payment_enabled', TRUE)) { === modified file 'uc_order/uc_order.module' --- uc_order/uc_order.module 2009-04-06 18:31:41 +0000 +++ uc_order/uc_order.module 2009-04-13 14:34:21 +0000 @@ -369,7 +369,15 @@ if (is_array($order->line_items)) { foreach ($order->line_items as $key => $value) { if ($value['type'] == 'subtotal') { - $subtotal = uc_currency_format($order->line_items[$key]['amount']); + $context = array( + 'revision' => 'formatted', + 'location' => 'order-subtotal-token', + 'subject' => array( + 'order' => $order, + 'line_item' => $order->line_items[$key], + ), + ); + $subtotal = uc_price($order->line_items[$key]['amount'], $context); } if ($value['type'] == 'shipping' && is_null($ship_method)) { $ship_method = $value['title']; @@ -377,7 +385,15 @@ } } $values['order-subtotal'] = $subtotal; - $values['order-total'] = uc_currency_format($order->order_total); + $context = array( + 'revision' => 'formatted', + 'location' => 'order-total-token', + 'subject' => array( + 'order' => $order, + 'field' => 'order_total', + ), + ); + $values['order-total'] = uc_price($order->order_total, $context); $values['order-email'] = check_plain($order->primary_email); $values['order-shipping-address'] = uc_order_address($order, 'delivery'); $values['order-shipping-phone'] = check_plain($order->delivery_phone); === modified file 'uc_order/uc_order.order_pane.inc' --- uc_order/uc_order.order_pane.inc 2009-02-05 22:19:50 +0000 +++ uc_order/uc_order.order_pane.inc 2009-04-13 14:34:21 +0000 @@ -331,11 +331,18 @@ } usort($line_items, 'uc_weight_sort'); + $context = array( + 'location' => 'order-line-items', + 'subject' => array( + 'order' => $arg1, + ), + ); $output = ''; foreach ($line_items as $item) { + $context['subject']['line_item'] = $item; $output .= '' .''; + . uc_price($item['amount'], $context) .''; } $output .= '
'. check_plain($item['title']) .':' - . uc_currency_format($item['amount']) .'
'; return $output; @@ -394,6 +401,13 @@ '#collapsed' => FALSE, '#tree' => TRUE, ); + + $context = array( + 'location' => 'order-edit-line-items', + 'subject' => array( + 'order' => $arg1, + ), + ); foreach ($line_items as $item) { $form['line_items'][$item['line_item_id']]['li_id'] = array( '#type' => 'hidden', @@ -425,11 +439,12 @@ ); } else { + $context['subject']['line_item'] = $item; $form['line_items'][$item['line_item_id']]['title'] = array( '#value' => check_plain($item['title']), ); $form['line_items'][$item['line_item_id']]['amount'] = array( - '#value' => uc_currency_format($item['amount']), + '#value' => uc_price($item['amount'], $context), ); } } @@ -659,13 +674,13 @@ if (!is_null($form_state['values']['admin_comment']) && strlen(trim($form_state['values']['admin_comment'])) > 0) { uc_order_comment_save($form_state['values']['order_id'], $user->uid, $form_state['values']['admin_comment']); } - + // Let conditional actions send email if requested. if ($form_state['values']['notify']) { $order = uc_order_load($form_state['values']['order_id']); ca_pull_trigger('uc_order_status_email_update', $order); } - + drupal_set_message(t('Order updated.')); } @@ -724,6 +739,10 @@ 'weight' => 5, ); + $context = array( + 'location' => 'order-view-products', + ); + if (is_array($products)) { foreach ($products as $product) { $data = array(); @@ -745,18 +764,27 @@ '#value' => check_plain($product->model), '#cell_attributes' => array('align' => 'center', 'nowrap' => 'nowrap'), ); + + $context['subject'] = array( + 'order_product' => $product, + ); if (user_access('administer products')) { $data['cost'] = array( - '#value' => uc_currency_format($product->cost), + '#value' => uc_price($product->cost, $context), '#cell_attributes' => array('align' => 'right', 'nowrap' => 'nowrap'), ); } + + $price_info = array( + 'price' => $product->price, + 'qty' => $product->qty, + ); $data['price'] = array( - '#value' => uc_currency_format($product->price), + '#value' => uc_price($product->price, $context), '#cell_attributes' => array('align' => 'right', 'nowrap' => 'nowrap'), ); $data['total'] = array( - '#value' => uc_currency_format($product->qty * $product->price), + '#value' => uc_price($price_info, $context), '#cell_attributes' => array('align' => 'right', 'nowrap' => 'nowrap'), ); $data['#attributes'] = array('valign' => 'top'); @@ -825,6 +853,10 @@ 'weight' => 5, ); + $context = array( + 'location' => 'order-customer-products', + ); + if (is_array($products)) { foreach ($products as $product) { $data = array(); @@ -846,18 +878,27 @@ '#value' => check_plain($product->model), '#cell_attributes' => array('align' => 'center', 'nowrap' => 'nowrap'), ); + + $context['subject'] = array( + 'order_product' => $product, + ); if (user_access('administer products')) { $data['cost'] = array( - '#value' => uc_currency_format($product->cost), + '#value' => uc_price($product->cost, $context), '#cell_attributes' => array('align' => 'right', 'nowrap' => 'nowrap'), ); } + + $price_info = array( + 'price' => $product->price, + 'qty' => $product->qty, + ); $data['price'] = array( - '#value' => uc_currency_format($product->price), + '#value' => uc_price($product->price, $context), '#cell_attributes' => array('align' => 'right', 'nowrap' => 'nowrap'), ); $data['total'] = array( - '#value' => uc_currency_format($product->qty * $product->price), + '#value' => uc_price($price_info, $context), '#cell_attributes' => array('align' => 'right', 'nowrap' => 'nowrap'), ); $data['#attributes'] = array('valign' => 'top'); === modified file 'uc_product/uc_product.css' --- uc_product/uc_product.css 2009-01-07 15:08:16 +0000 +++ uc_product/uc_product.css 2009-04-13 14:34:21 +0000 @@ -9,6 +9,17 @@ margin-left: 4px; } +.uc-price-display { + float: right; + clear: right; + width: 100px; + text-align: center; + font-size: 1.3em; + font-weight: bold; + padding-bottom: 4px; + padding-left: 4px; +} + .display-price { float: right; clear: right; === modified file 'uc_product/uc_product.module' --- uc_product/uc_product.module 2009-04-11 23:08:02 +0000 +++ uc_product/uc_product.module 2009-04-13 14:34:21 +0000 @@ -695,27 +695,47 @@ 'add_to_cart' => 10, )); + $context = array( + 'location' => 'product-view', + 'class' => array( + 'product', + ), + 'subject' => array( + 'node' => $node, + ), + ); + if (module_exists('imagecache') && ($field = variable_get('uc_image_'. $node->type, '')) && isset($node->$field) && file_exists($node->{$field}[0]['filepath'])) { $node->content['image'] = array('#value' => theme('uc_product_image', $node->$field, $teaser, $page), '#access' => $enabled['image'], '#weight' => $weight['image'], ); } - $node->content['display_price'] = array('#value' => theme('uc_product_price', $node->sell_price, 'display-price', TRUE), + + $context['class'][1] = 'display'; + $context['subject']['field'] = 'sell_price'; + $node->content['display_price'] = array('#value' => uc_price($node->sell_price, $context), '#access' => $enabled['display_price'], '#weight' => $weight['display_price'], ); + if (!$teaser) { $node->content['model'] = array('#value' => theme('uc_product_model', $node->model, $teaser, $page), '#access' => $enabled['model'], '#weight' => $weight['model'], ); $node->content['body']['#weight'] = 1; - $node->content['list_price'] = array('#value' => theme('uc_product_price', $node->list_price, 'list-price'), + + $context['class'][1] = 'list'; + $context['subject']['field'] = 'list_price'; + $node->content['list_price'] = array('#value' => uc_price($node->list_price, $context), '#access' => $enabled['list_price'], '#weight' => $weight['list_price'], ); - $node->content['cost'] = array('#value' => theme('uc_product_price', $node->cost, 'cost'), + + $context['class'][1] = 'cost'; + $context['subject']['field'] = 'cost'; + $node->content['cost'] = array('#value' => uc_price($node->cost, $context), '#access' => $enabled['cost'] && user_access('administer products'), '#weight' => $weight['cost'], ); @@ -724,7 +744,9 @@ $node->content['#attributes'] = array('style' => 'display: inline'); } - $node->content['sell_price'] = array('#value' => theme('uc_product_price', $node->sell_price, 'sell-price', $teaser), + $context['class'][1] = 'sell'; + $context['subject']['field'] = 'sell_price'; + $node->content['sell_price'] = array('#value' => uc_price($node->sell_price, $context, array('label' => !$teaser)), '#access' => $enabled['sell_price'], '#weight' => $weight['sell_price'], ); @@ -1076,7 +1098,21 @@ $element['title'] = array( '#value' => node_access('view', $node) ? l($item->title, 'node/'. $node->nid) : check_plain($item->title), ); - $element['#total'] = $item->price * $item->qty; + + $context = array( + 'revision' => 'altered', + 'location' => 'cart-item', + 'subject' => array( + 'cart_item' => $item, + 'node' => $node, + ), + ); + $price_info = array( + 'price' => $item->price, + 'qty' => $item->qty, + ); + + $element['#total'] = uc_price($price_info, $context); $element['data'] = array('#type' => 'hidden', '#value' => serialize($item->data)); $element['qty'] = array( '#type' => 'textfield', @@ -1199,6 +1235,9 @@ '#rows' => array(), ); + $context = array( + 'location' => 'product-tapir-table', + ); foreach ($args as $nid) { $data = array(); $node = node_load($nid); @@ -1217,11 +1256,16 @@ '#value' => l($node->title, 'node/'. $node->nid), '#cell_attributes' => array('width' => '100%'), ); + + $context['subject'] = array('node' => $node); if ($enabled['list_price']) { - $data['list_price'] = array('#value' => uc_currency_format($node->list_price), '#cell_attriubtes' => array('nowrap' => 'nowrap')); + $context['subject']['field'] = 'list_price'; + $data['list_price'] = array('#value' => uc_price($node->list_price, $context), '#cell_attriubtes' => array('nowrap' => 'nowrap')); } if ($enabled['sell_price']) { - $data['price'] = array('#value' => theme('uc_product_price', $node->sell_price, 'sell-price', TRUE), '#cell_attriubtes' => array('nowrap' => 'nowrap')); + $context['subject']['field'] = 'sell_price'; + $context['class'] = array('sell-price'); + $data['price'] = array('#value' => uc_price($node->sell_price, $context, array('label' => FALSE)), '#cell_attriubtes' => array('nowrap' => 'nowrap')); } if (module_exists('uc_cart') && arg(0) != 'admin' && $enabled['add_to_cart']) { === modified file 'uc_store/includes/uc_price.inc' --- uc_store/includes/uc_price.inc 2009-04-12 02:11:38 +0000 +++ uc_store/includes/uc_price.inc 2009-04-13 18:37:31 +0000 @@ -1,7 +1,8 @@ The original price, + * - 'altered' => Price after passing through the alterer(s), + * - 'formatted' => Price after passing through the formatter, + * - 'themed' => Price after passing through the theme layer. + * * @param $options * An associative array containing options that will be passed through to - * any alteration/formatting/theming functions implemented. - * @param $revision - * A string describing the 'revision' of the price to return. Currently - * accepted values are: - * - 'original' => 'The original price', - * - 'altered' => 'Price after passing through the alterer(s)', - * - 'formatted' => 'Price after passing through the formatter', - * - 'themed' => 'Price after passing through the theme layer'. (default) - * - * This function handles price alteration, formatting, theming, and caching. + * any alteration/formatting/theming functions implemented. A list of accepted + * options follows. + * + * 'cache': + * Default: TRUE + * If set FALSE, this price won't be cached. + * + * 'sign': + * Default: variable_get('uc_currency_sign', '$') + * The sign to use when formatting this price. + * + * 'sign_after': + * Default: variable_get('uc_sign_after_amount', FALSE) + * If set to TRUE, the sign will come after the price. + * + * 'prec': + * Default: variable_get('uc_currency_prec', 2) + * Precision to round the price to. + * + * 'dec': + * Default: variable_get('uc_currency_dec', '.') + * Decimal separator. + * + * 'thou': + * Default: variable_get('uc_currency_thou', ',') + * Thousand separator. + * + * 'label': + * Default: TRUE + * If set to TRUE, the * */ -function uc_price($price_info, $context, $options = array(), $revision = NULL) { +function uc_price($price_info, $context, $options = array()) { global $user; $values = array(); @@ -40,13 +70,17 @@ ); } - // Initialize the options array. + // Initialize the options and context. $options += array( 'cache' => variable_get('uc_price_caching', TRUE), ); + $context += array( + 'revision' => 'themed' + ); + // Clamp to allowed revisions. - switch ($revision) { + switch ($context['revision']) { case 'original': case 'altered': case 'formatted': @@ -54,7 +88,7 @@ break; default: - $revision = 'themed'; + $context['revision'] = 'themed'; } // Get all the active handlers. @@ -114,7 +148,7 @@ } // Return the requested revision. - return $values[$revision]; + return $values[$context['revision']]; } /** === modified file 'uc_store/uc_store.css' --- uc_store/uc_store.css 2009-02-19 15:55:26 +0000 +++ uc_store/uc_store.css 2009-04-13 14:32:10 +0000 @@ -1,5 +1,9 @@ /* $Id$ */ +.uc-price { + white-space: nowrap; +} + .uc-store-admin-table { margin: 1em auto; border: 1px dashed #bbb; === modified file 'uc_store/uc_store.module' --- uc_store/uc_store.module 2009-04-12 02:11:38 +0000 +++ uc_store/uc_store.module 2009-04-13 14:32:10 +0000 @@ -568,7 +568,7 @@ } $context['class'][] = 'uc-price'; // Class the element. - $output = '
'; + $output = ''; // Prefix(es). if ($options['label'] && isset($options['prefixes'])) { $output .= implode('', $options['prefixes']); @@ -579,7 +579,7 @@ if ($options['label'] && isset($options['suffixes'])) { $output .= implode('', $options['suffixes']); } - $output .= '
'; + $output .= ''; return $output; } # Begin bundle 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 0uHvNovH0APaM3ld/8XckU4UJAne12PA