【问题标题】:How to assign role with PHP in Drupal?如何在 Drupal 中使用 PHP 分配角色?
【发布时间】:2011-04-01 19:07:04
【问题描述】:

我需要为通过 PHP 购买金额等于或大于 100 欧元的会员分配一种“高级状态”。

条件操作已设置(用户 = 匿名/经过身份验证且总金额 = 等于/大于 100 且用户 =!高级)但我缺少 PHP 部分来实际说“然后授予他高级会员资格”。

我怎样才能做到这一点?

编辑:下面的代码正确吗?

if ($account) {
  $uid = $account->uid;
  $role_name = 'authenticated user';
  $rid = db_result(db_query("SELECT rid FROM {role} WHERE name = '%s'", $role_name));
  db_query("INSERT INTO {users_roles} (uid, rid) VALUES(%d, %d)", $uid, $rid);
  watchdog('user', 'uc ca added role to Ubercart created user');
}

【问题讨论】:

    标签: php drupal content-management-system e-commerce ubercart


    【解决方案1】:

    您可以使用user_load()user_save() 做到这一点:

    $uid = 1; // UID of user to add role to
    $role_name = 'test role'; // Name of role to add
    
    // Get RID of role
    $rid = db_result(db_query("SELECT r.rid FROM {role} r WHERE r.name = '%s'", $role_name));
    
    // Load user object
    $account = user_load(array('uid' => 1));
    
    // Save the user object with the new roles.
    if ($account !== FALSE && !isset($account->roles[$rid])) {
      $roles = $account->roles + array($rid => $role_name);
      user_save($account, array('roles' => $roles));
    }
    

    如果您想为多个用户批量执行此操作,请使用 user_multiple_role_edit()

    $uids = array(1, 2, 3, 4); // UIDs of users to add role to
    $role_name = 'test role'; // Name of role to add
    
    // Get RID of role
    $rid = db_result(db_query("SELECT r.rid FROM {role} r WHERE r.name = '%s'", $role_name));
    
    // Add the role to UIDs
    user_multiple_role_edit($uids, 'add_role', $rid);
    

    编辑

    如果您想为当前用户执行此操作(就像您在评论中提到的检查的一部分),您可以这样做:

    // Check for value over 100.00
    if ($total_value > 100) {
      global $user; // Retrieve user object for currently logged in user.
    
      $role_name = 'test role'; // Name of role to add
    
      // Get RID of role
      $rid = db_result(db_query("SELECT r.rid FROM {role} r WHERE r.name = '%s'", $role_name));
    
      // Save the user object with the new role.
      if (!isset($user->roles[$rid])) {
        $roles = $user->roles + array($rid => $role_name);
        user_save($user, array('roles' => $roles));
      }
    }
    // Other code here.
    

    【讨论】:

    • 我希望在总购买量等于/大于 100 欧元的情况下更改角色,但是,如果我理解您的代码,那是一个静态解决方案(我必须每次都使用它手动更改角色)。
    • 不,只需将此代码放在您要检查总购买量的任何地方。 (即if ($purchase > 100) { // insert code above here },另见编辑)这是永久性的:用户将始终拥有此角色,除非您稍后将其撤消。另一种解决方案是临时的,不会在页面之间持续。
    • 他们使用的缩写有点不幸,我花了一段时间才弄清楚你的评论 Get RID of role 并不意味着删除角色:)
    【解决方案2】:

    尽管我会更新 Drupal 7 的 sn-p。否则它可以正常工作:)

    $rid = db_query("SELECT r.rid FROM {role} r WHERE r.name = :rname", 
                    array(':rname' => $role_name))->fetchField();
    

    【讨论】:

      【解决方案3】:

      我宁愿使用user_role_load_by_name函数。

      【讨论】:

        【解决方案4】:

        drupal 7:

             global $user; // Retrieve user object for currently logged in user.
        
          $role_name = 'test role'; // Name of role to add
        
          // Get RID of role
          $rid = db_query("SELECT r.rid FROM {role} r WHERE r.name = :rname", array(':rname' => $role_name))->fetchField();
        
          // Save the user object with the new role.
          if (!isset($user->roles[$rid])) {
            $roles = $user->roles + array($rid => $role_name);
            user_save($user, array('roles' => $roles));
          }
        

        感谢 rix。

        【讨论】:

          猜你喜欢
          • 2012-06-29
          • 1970-01-01
          • 2014-04-07
          • 2013-09-11
          • 2014-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-14
          相关资源
          最近更新 更多