Drupal 7 开发内部培训资料, 分头诗人

Drupal Commerce - 自定义Add to cart(加入购物车)连接

猪跑啦独家原创专稿,欢迎您转载本文,转载请注明来源。

Drupal Commerce 确实挺强大的,但很多人却不明白为什么产品产品显示要分开,这个已经是另外一个话题了,我只能说“分离确实是有它意义的,即使这样做确实会造成一点混乱

增加一个自定义的链接“加入购物车

在最近项目中,我需要一个简单的方法来吧产品添加到购物车,而不依赖drupal commerce默认的“Add to cart”按钮,这个有很多种方法实现,但最好的方法是创建一个菜单的钩子(hook_menu),然后call 一个回调函数,通过回调函数将商品加入购物车中。

这个过程很简单——我们使用hook_menu() 创建一个路径,这个路径会call 一个函数,然后用这个函数完成 “加入购物车”的功能

<?php
/**
* Implements hook_menu().
*/
function MYMODULE_menu() {
  $items['product/add/%/%'] = array (
    'page callback' => 'MYMODULE_product_add',
    'page arguments' => array(2,3),
    'access arguments' => array('access content'), 
    'type' => MENU_CALLBACK,
  );  
  return $items;
}  
?>

钩子添加一个路径和两个通配符(%,以参数方式让回调函数读取),第一个参数是product id,第二个参数是数量(quantity),举例:“mysite.com/product/add/5555/2”将会把id为5555的产品添加到购物车,并且数量为2个,当访问者访问此路径,系统将会把这两个参数存入MYMODULE_product_add() 函数,所以我们还得添加函数:

<?php
/**
* Custom function to add product(s) to a cart by product id
*/
function MYMODULE_product_add($pid,$quantity=1) {
    if ($product = commerce_product_load($pid) ) {
        global $user;
        $uid = $user->uid;
        $line_item = commerce_product_line_item_new($product, $quantity);
        $line_item->field_ticket_type['und'][]['value'] = 0;
        $line_item = commerce_cart_product_add($uid, $line_item, FALSE);
        drupal_goto('checkout');
    }    
}
?>

我们可以测试下,当访问上面地址后,是否能真的加产品进去购物车,如无意外是可以的。否则,肯定是哪里做错了。

更进一步的加强

怎么样,上一步是不是很简单?现在我们可以添加链接到其他页面了,想加在哪都行,只要加这个链接,产品都会自动增加到购物车,你甚至可以在站外使用此链接。所以,你可以直接链接一个产品或服务,然后直接去结账,或者是发送一个链接给客户,让客户轻松完成付款的过程。

当然,你也可以创建你的独立表单,用来控制传达的参数值,举例:

<?php
/**
* Custom function to add product(s) to a cart by product id, submitted by a form and looking for an affiliate cookie
*/
function MYMODULE_product_form_add($pid,$quantity=1) {
       $other = $_POST["other_info"];
       $affiliate = $_COOKIE['mysite_affiliate_id'];
    if ($product = commerce_product_load($pid) ) {
        global $user;
        $uid = $user->uid;
        
        $line_item = commerce_product_line_item_new($product, $quantity);
        $line_item->field_ticket_type['und'][]['value'] = 0;
        $line_item->field_other['und'][]['value'] = $other;
        $line_item->field_affiliate['und'][]['uid'] = $affiliate;
        $line_item = commerce_cart_product_add($uid, $line_item, FALSE);
        
        drupal_goto('checkout');
    }    
}
?>

更多的资料,可以查看 API 信息:commerce_product_line_item_new , commerce_cart_product_add,同时,我也上传了一个简单的例子,仅供测试,所以慎用。

模块应用例子下载