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

Drupal Commerce - 通过Rule控制续费到期用户。

Drupal Commerce 可以很方便的设置订阅性质的付费网站,可以通过Commerce subscription products 模块,在用户的数据里面增加一个过期日期,而Commerce subscription products只是增加了过期日期,却没发现有判断是否角色已经到期,所以要判断用户是否到期了,我们得自己写一些代码跟配置来实现,首先我们会想到的是两种方法,

  1. 一种是通过cron 去每日定期访问某页,然后循环读取每个用户的过期日期,如果现在的日期过期日期大的话,删除用户(或者是去掉此用户某个角色如角色Premium User);
  2. 第二种方法是通过在用户登录时候,做一个判断,是否现在的日期过期日期大,如果是的话去掉此用户某个角色如角色Premium User

此文是基于第二种方法的,因为第二种方法相对比较简单,那么该怎么做呢,我们的用rules模块做辅助,

首先我们通过hook_rules_condition_info() 这个hook 去增加一个能用于rules里面的条件

/**
 * Implementation of hook_rules_condition_info().
 */
function thinkinpremium_rules_condition_info() {
  return array(
    'thinkinpremium_condition_sp_validity' => array(
      'label' => t('Subscription validity'),
      'base' => 'thinkinpremium_condition_sp_validity',
    ),
  );
}

然后再写一个与它对应的函数,此函数是在数据库中读取当前用户的过期日期,并且与当前日期做比较,如果当前日期大于过期日期,返回true,否则返回false:

Drupal Commerce - 通过写代码方式为价钱格式化。

Drupal Commerce 是一个很强大的模块,我们可以通过自定义模块列出产品,价格的表是在field_data_commerce_price 里面,但里面存储的数据却是没格式化的,如一个产品A,在添加时候,是240元 人民币,我们通过写code:

Drupal Commerce - 改变货币的显示方式。

当我们用Drupal Commerce做商城的时候,在中国应该选人民币作为当前币种,虽然commerce 提供了人民币选择,但默认的显示方式是在价钱后面加CNY,如: 720.00 CNY

这样的价格不太符合中国的显示方式,我们更希望是能显示成: ¥720.00

Drupal Commerce提供了两个hook ,可以用来改变币种的显示方式,分别是:hook_commerce_currency_info(),还有hook_commerce_currency_info_alter()

这里以人民币作为例子说明两个hook 的用法,

hook_commerce_currency_info()

/**
 * Implements hook_commerce_currency_info()
 */
function MYMODULE_commerce_currency_info() {
return array(
    'CNY' => array(
      'code' => 'CNY', //币种code
      'numeric_code' => '156', //币种numeric_code
      'symbol' => '¥', //币种符号
      'name' => t('Chinese Yuan Renminbi'), 
      'symbol_placement' => 'before', //币种符号放在前面
      'code_placement' => 'hidden', //隐藏币种code
      'minor_unit' => t('Fe'), 
      'major_unit' => t('Yuan Renminbi'), 
    ),
  );
}

 

hook_commerce_currency_info_alter()

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() 函数,所以我们还得添加函数:

把drupal7 的密码加密方式分离出来。

<?php

define('DRUPAL_MIN_HASH_COUNT', 7);
define('DRUPAL_MAX_HASH_COUNT', 30);
define('DRUPAL_HASH_LENGTH', 55);

$p=younger;
$c=3;
$e=user_hash_password($p,$c);
$salt=_password_generate_salt($c);

echo "$p";echo '</br>';
echo "$e";echo '</br>';
echo "$salt";




function user_hash_password($password, $count_log2 = 0) {
  if (empty($count_log2)) {
    // Use the standard iteration count.
    $count_log2 = variable_get('password_count_log2', DRUPAL_HASH_COUNT);
  }
  return _password_crypt('sha512', $password, _password_generate_salt($count_log2));
}



function _password_crypt($algo, $password, $setting) {
  // The first 12 characters of an existing hash are its setting string.
  $setting = substr($setting, 0, 12);

  if ($setting[0] != '$' || $setting[2] != '$') {
    return FALSE;
  }
  $count_log2 = _password_get_count_log2($setting);
  // Hashes may be imported from elsewhere, so we allow != DRUPAL_HASH_COUNT
  if ($count_log2 < DRUPAL_MIN_HASH_COUNT || $count_log2 > DRUPAL_MAX_HASH_COUNT) {
    return FALSE;
  }
  $salt = substr($setting, 4, 8);
  // Hashes must have an 8 character salt.
  if (strlen($salt) != 8) {

Drupal Commerce - 限制 cart 中只允许有最新的一个产品。

有时候,我们需要限制会员只允许购物车中有一个产品,例如一些包年付费的网站,假使有包年套餐跟半年套餐,正常情况下,如果会员把 包年套餐 添加购物车,又再把 半年套餐 添加到购物车,会造成购物车既有包年套餐,又有半年套餐,而通常只是希望会员只能选择其中一种。所以这种情况,就得限制 cart 中只允许有一个产品。怎么做呢?

  1. 打开Admin > Configuration > Workflow > Rules
  2. 点击Add New Rule,输入rule的名称
  3. 选择事件Before adding a product to the cart
  4. Actions下方,点击 Add Action
  5. 找到Commerce Cart, 选择 Remove all products from an order
  6. 保存Rule
     

也可以直接导入:

{ "rules_before_adding_a_product_to_the_cart" : {
    "LABEL" : "before adding a product to the cart",
    "PLUGIN" : "reaction rule",
    "REQUIRES" : [ "commerce_cart" ],
    "ON" : [ "commerce_cart_product_prepare" ],
    "DO" : [
      { "commerce_cart_empty" : { "commerce_order" : [ "commerce_order" ] } }
    ]
  }
}

 

Drupal Commerce - 限制 cart 里面的每个产品数量。

有些时候,我们不希望会员在同一个产品上面购买多次,举例:QQ秀的衣服,通常只会买一套,而不会同一套衣服重复买两次,那么如何限制呢?

  1. 打开Admin > Configuration > Workflow > Rules
  2. 点击Add New Rule,输入rule的名称
  3. 选择事件Before saving a commerce order
  4. Actions下方,点击 Add loop,增加一个循环
  5. Data selector 选择commerce-order:commerce-line-items,保存
  6. Actions下方,点击 Add Action
  7. 找到Data, 选择 Set a data value,在Data selector 选择quantity,点击continue
  8. value 输入 1
  9. 保存Rule

也可以直接导入 数据:

Drupal Commerce - 点击 add to cart 直接跳去check out 页。

有些情况下,我们希望能简化drupal commerce的收款流程,如 加入购物车 改为 马上付款,然后点击按钮后,直接跳去check out页,我们可以通过Rules 实现此功能

  1. 打开Admin > Configuration > Workflow > Rules
  2. 点击Add New Rule,输入rule的名称
  3. 选择事件After adding a product to the cart
  4. Actions下方,点击 Add Action
  5. 找到System, 选择 Page Redirect
  6. 输入想跳转的页面,因为drupal commerce cart 的地址是 http://yoursite/cart,所以这里输入 cart
  7. 保存Rule
  8. 最后,我们还得把 Add to cart 改为 Buy Now,我们可以通过hook_form_alter 实现。
/**
* Implements hook_form_alter
*
*/

function YOURMODULE_form_alter(&$form, $form_state, $form_id) {
  
if ($form_id == 'commerce_cart_add_to_cart_form_1') {
$form['submit']['#attributes']['title'] = $form['submit']['#attributes']['value'] = t('Buy Now');
  }
}

drupal 新用户注册 要邮箱验证后才能激活账户同时让游客自己设置密码

今天解决的一个小问题,来分享一下,发现网上还没有相关的教程。

 

需要用到的  两个小模块。1.User registration password     2.LoginToboggan   

安装好后在后台设置一下。admin/config/people/accounts    这里设置成Require a verification e-mail, but let users set their password directly on the registration form.    

admin/config/system/logintoboggan    里设置  勾上 Set password。

最重要的一步,写一个rules

{ "rules_blockuser" : {
    "LABEL" : "blockuser",
    "PLUGIN" : "reaction rule",
    "REQUIRES" : [ "rules" ],
    "ON" : [ "user_insert" ],
    "DO" : [ { "user_block" : { "account" : [ "account" ] } } ]
  }
}

大家复制我的rule规则,导入就可以啦。

希望对大家有用。

www.drupalla.com

Drupal全球培训日——中国站报名啦!

Drupal培训日(Drupal Training Day)是由Drupal官方发起的一个全球性的培训活动,目的是向所有对Drupal感兴趣的人介绍Drupal。


今年中国地区独家活动举办者落户到戴文。我们将跟全球Drupaler共同在12月14日这一天全天展开免费Drupal培训。

也许你还没开始使用Drupal、只是在各大CMS(内容管理系统)之间进行评估,也许你刚刚开始考虑使用Drupal—— 不用犹豫,此次Drupal Day向诸位开放!

我们希望经过这一天,能够给您一些指引,即使您对PHP/HTML/CSS/JS很陌生,也能够通过此次倾听对未来职业(Drupal开发者、设计师、前端工程师、软件工程师、网站架构师、市场推广者等)的选择比以往更清晰。
 

培训经历


这并不是戴文第一次为Drupal爱好者提供培训。Drupal培训一直以来都是我们的服务项目之一。每一次服务于客户,在网站完成/稳定后、最终发布前,我们都会为客户进行培训。培训对象拥有不同的技能和工作背景、来自不同岗位,有网站编辑、市场专员和拥有设计师和前端开发者和IT部门。

我们还为已经使用Drupal系统的公司提供单独的Drupal培训。我们曾为一位已经使用Drupal搭建网站的客户向其IT部门提供Drupal培训。
 

培训课程内容

此课程由戴文提供,并经Drupal Association审核通过。

  • 简介及综览
  • 核心模块及第三方模块介绍
  • 操作指导
  • 多语言指导
  • 基本模块安装
  • 空间及文件结构
  • Drupal hooks基本模块API
  • 编程准则
  • 社区的力量

 

培训时间/地点/公交


- 12月14日上午10点到下午5点。
- 上海市闸北区中山北路900号加禾商务中心2号楼311室。戴文信息科技(上海)有限公司。
- 地铁1号线(富锦路方向)中山北路站1号口出,西行470米即到加禾商务中心。
  公交可选:47, 69, 129, 252,309,706,829,849,869。
 

报名

离12月14日培训日还有三天,即刻报名吧!

页面

订阅 RSS - 博客