Drupal 7 Programmatically Creating a Rule with a Custom Action
Commerce module uses Rules module extensively. Unlike Ubercart where you can just call a hook and receive $account information of the final process once an anonymous user is converted to a Drupal authenticated user, once checkout is complete. With Commerce we have to use Rules to create a custom rule with an action that ultimately executes a callback....Yes, I know....
Here's the example of what we did. Look at the code comments for a better hint of what is going on.
/** * Implements hook_default_rules_configuration(). */ function yourmodule_default_rules_configuration() { $rules = array(); $rule = rules_reaction_rule(); $rule->label = t('After new user is created'); $rule->active = variable_get('mymodule_append_data_to_new_user', TRUE); $rule // We use a system event. ->event('user_insert') // action() is smart enough to know this is a // custom action that we'll define later. ->action('add_data_to_user_object', array( 'type' => 'user', )); // Execute after similar rules. $rule->weight = 10; // The unique machine name of your rule. $rules['yourmodule_append_qbo_customer_id_to_new_user'] = $rule; return $rules; }
/** * Implements hook_rules_action_info(). */ function yourmodule_rules_action_info() { $defaults = array( // Defines parameters that are passed to // your callback. 'parameter' => array( 'account' => array( 'type' => 'user', 'label' => t('User'), // Tells Rules to save any changes made to $account. 'save' => TRUE, ), ), 'group' => t('User'), // Rules built-in access. 'access callback' => 'rules_user_integration_access', ); // The name of our custom action that was defined in // ji_commerce.rules_defaults.inc. $actions['add_data_to_user_object'] = $defaults + array( 'label' => t('Insert a new user'), // Finally, our callback! 'base' => 'yourmodule_action_insert_new_user', ); return $actions; } /** * Callback: We run QBO calls here. Since with Commerce * we can't do it within the hook_commerce_checkout_complete(). */ function yourmodule_action_insert_new_user($account) { // This change will automatically be saved by Rules. $account->data['some_id'] = 100; }
Leave a comment