hook_line_item

函数hook_line_item()位于uc_order.module模块中:

<?php
  hook_line_item()
?>

 

描述:

hook_line_item是用来定义行项的,附带在订单的下面。一个行项可以表示收费、费用,以及订单的总计。默认的行项包括了小计和总计行项,税收行项,以及运送行项。还有一个更以本的行项,网店管理员可以使用它来向手工创建的订单添加额外的费用和折扣。模块开发者,可以使用这个钩子为他们的网店定义新的行项。常见的例子,就是优惠券,网店允许自己的客户使用优惠券,这个时候就可以把优惠券实现为一个行项。

一旦在hook_line_item中定义了一个行项,Übercart就会与它进行交互,包括多种不同的方式。最主要的一种方式是,你为这个行项声明一个回调函数。函数的结构如下所示:

<?php
function callback_name($op, $arg1) {
  switch ($op) {
    case '...':  // Actual case values described in table below.
      break;
  }
}
?>

 

当调用这个函数时,$op的值用来声明Übercart期望接受的返回信息的类型。下面列出了目前的所有情况:

$op

使用/返回 值

load

当行项被加载时,没有存储在数据库中的项将通过这个函数来加载进来。$arg1是订单对象。期望的返回值,是一个关联数组,包含了以下键:

类型

id

string

当显示时,用于标识行项的ID

title

string

显示在订单上的行项的标题。使用t()。

amount

float

显示在订单上的行项的值。

例如:

<?php
  case 'load':
    $lines[] = array(
      'id' => 'subtotal',
      'title' => t('Subtotal'),
      'amount' => uc_order_get_total($arg1, TRUE),
    );
    return $lines;
?>

display

对于那些设为仅仅用来显示的行项,当显示订单时,使用这个$op就可以调用它们的回调函数。$arg1是订单对象。期望的返回值,和前面的load的完全一样。

cart-preview

在客户结算期间,支付窗格将会显示一个预览页面,里面包含了行项和订单。对于页面的初始化加载,每一个行项都回通过这个$op来调用它们的回调函数。通过使用drupal_add_js()来调用下面描述的Javascript函数set_line_item(key, title, value, weight),从而设置行项的默认值。$arg1是一个用于该行项的产品对象的数组,当然,这些产品对象当前出于购物车中。注意:这个不是必须的。这个仅用于默认的显示。结算页面的其它窗格,可以通过在它们自己的Javascript文件中使用set_line_item()来向这个列表中动态的添加项目。这个函数的参数如下所示:

参数

类型

key

string

所显示的行项的唯一内部ID

title

string

行项的标题。你可以使用t()来建立这个值,当你的窗格加载时,使用drupal_add_js()可以把它作为一个全局变量添加到页面中。

value

float

行项的值。(用来显示和计算总计)

weight

int

行项的显示顺序。

例如:

<?php
  case 'cart-preview':
    $subtotal = 0;
    foreach ($arg1 as $item) {
      $total = ($item->qty) ? $item->qty * $item->price : $item->price;
      $subtotal += $total;
    }
    drupal_add_js("\$(document).ready( function() { set_line_item('subtotal', '". t('Subtotal') ."', ". $subtotal .", -10); } );", 'inline');
    break;
?>

返回值:

你的钩子应该返回一个关联数组的数组,就像前面的例子一样。数组中的每一项,都代表着一个单独的行项,它将使用下面的键:

类型

id

string

行项的内部ID

title

string

在各种界面显示给用户的行项的标题。使用t().

callback

string

行项的回调函数的名称,可用于不同操作。

weight

int

行项在列表中的顺序;重量越小,越靠前。

stored

bool

行项是否保存在数据库中。可通过订单编辑页面修改的行项,都是TRUE。

add_list

bool

行项是否包含在订单编辑页面的“添加一个行项”的下拉选择框中。

calculated

bool

行项的值,是否应该包含在订单总计中。(例如:对于运费行项,返回TRUE,而对于小计行项,则返回FALSE,因为产品价格已经包含进了总额中)

display_only

bool

如果这个行项仅仅用来显示信息,而在其它地方不进行计算的话,返回TRUE,否则返回FALSE。(例如:总计行项仅仅用来在行项列表的底部显示订单的总计,此时就返回TRUE)。

 

例如:

<?php
function uc_order_line_item() {
  $items[] = array(
    'id' => 'generic',
    'title' => t('Empty Line'),
    'weight' => 2,
    'default' => FALSE,
    'stored' => TRUE,
    'add_list' => TRUE,
    'calculated' => TRUE,
    'callback' => 'uc_line_item_generic',
  );

  return $items;
}
?>





注意,行项是定义在一个数组中的,这个和Drupal的hook_menu中的菜单项非常类似

 相关链接: Think in Drupal

论坛: