Hello! I'm trying to write a simple plugin that will populate a custom field (named "license") based on input from another field (e-mail). I've created the field within aMember Admin and created the plugin by duplicating the sample plugin. Here is an example of my function hooked into user updates: PHP: // this function will be called when a member profile is updated. function serialgen_updated($member_id, $oldmember, $newmember) { global $db; $u = $db->get_user($member_id); if (!$u['data']['license']) { $u['data']['license'] = md5($u['email']); } $db->update_user($u['member_id'], $u); } setup_plugin_hook('subscription_updated', 'serialgen_updated'); I have a similar function for new users and DB rebuilds. I unfortunately face two problems with this: 1) Fatal error: Allowed memory size of ### bytes exhausted. (no matter how much i've set for the cap). 2) no matter what I set $u['data']['license'] to it always comes back empty in the administration. Ass soon as i drop the $db->update_user() line the error goes away, but then I'm obviously not returning any updates. I'm open to any and all suggestions. Thanks!
This will not work because your plugin hook will be executed from $db->update_user so there will be endless loop. You should move your code to finish_waiting_payment hook. So it will be executed only after signup.
Alexander, thanks for the quick reply! Changing hooks worked like a charm. I also discovered that i needed to change from $u[data][license] to just $u[license] and that the vars passed through the function at this new hook were $payment_id and $member_id. So below is the working function: PHP: // this function will be called when a member payment has been made. function serialgen_updated($payment_id, $member_id) { global $db; $u = $db->get_user($member_id); if ($u['license'] == '') { $u['license'] = md5($u['email']); } $db->update_user($u['member_id'], $u); } setup_plugin_hook('finish_waiting_payment', 'serialgen_updated'); Now all I need is the proper way to hook this into subscription_rebuild so that I can provide all my users with keys in one swift motion. Below is what I have, which is obviously incorrect. PHP: // Called when database is rebuilt function serialgen_rebuild(&$members) { global $db; foreach( $members as $member ) { $u = $db->get_user($member['member_id']); if ( $u['license'] == '' || !$u['license'] ) { $u['license'] = md5($u['email']); } $db->update_user($u['member_id'], $u); } } setup_plugin_hook('subscription_rebuild', 'serialgen_rebuild'); Any insight would be most appreciated!
I think it's not correct because it doesn't work Could you look it over a bit more closely and help me see if I'm making any rookie mistakes? Or tell me if there is some way I can control the output during a db rebuild and see some vardump's along the way?
I don't see any errors, but remember that code will be executed for active users only. If you want to run it for all users, better to not use rebuild hook and just create standalone script that will update database directly. I regards to output, install firebug into firefox, you will be able to check what is being sent and received by ajax requests. So will be able to place debug info.
Well, I don't know what it is... I temporarily modded /admin/rebuild.php's Rebuild function directly, ran a rebuild, and all my users now have licenses. Maybe it has to do with the data that's coming in via the $members variable? My suspicion is that it's not actually coming through with 'member_id' in the array. Could you confirm? At any rate, I accomplished what I needed and now my plugin only really needs to hook into finish_waiting_payment.
Well you right, I forgot. $members array does not have member_id. It have only login and array of active products.
Unable to generate license key fields for existing users I'm in need of something similar as rzen above. I need to generate license keys for software activation after a user signs up for a paid product. We have successfully added a new license key for each NEW account, but, we have been unable to generate license keys for EXISTING accounts using the subscription_rebuild hook nor have we been able to DELETE license keys using the subscription_deleted hook. Here is our code: PHP: // Generate a unique KEY for each user who has purchased a subscription // Called when database is rebuilt function gpp_member_api_key_rebuild(&$members) { global $db; foreach( $members as $user ) { $u = $db->get_user($user['member_id']); if ( $u[data]['license'] == '' || !$u[data]['license'] ) { $u[data]['license'] = md5($u['email']); } $db->update_user($u['member_id'], $u); } } setup_plugin_hook('subscription_rebuild', 'gpp_member_api_key_rebuild'); // Deletes the unique KEY if a user doesn't have an active subscription function gpp_member_api_key_deleted($payment_id, $member_id) { global $db; $u = $db->get_user($member_id); if ($u[data]['license'] != '') { $u[data]['license'] == ''; } $db->update_user($u['member_id'], $u); } setup_plugin_hook('subscription_deleted', 'gpp_member_api_key_deleted'); I've corresponded with Anton in HelpDesk, but none of his suggestions have worked thus far. This is the very last step we need to complete before we can release our new products. The HelpDesk reference number is: YAR-27155-674 Any idea how we can get this working?
There is no member_id in subscription_rebuild. Here is a script that I made this work. This is generic and applies to all members. It will need to filter particular product like paid members, etc. PHP: function my_member_api_key_rebuild($members){ global $db; foreach ($members as $login => $rec) { $u = $db->users_find_by_string($login,'login',1); $u = $u[0]; if ($u[data]['license'] == '' || !$u[data]['license']) { $u[data]['license'] = md5($u['email']); } $db->update_user($u['member_id'], $u); } } setup_plugin_hook('subscription_rebuild', 'my_member_api_key_rebuild'); Hope this helps all who are looking for a solution. The aMember Pro documentation really poor as it doesn't give examples on how to use the hooks.
and heres the subscription_deleted code PHP: function my_member_api_key_deleted($member_id,$product_id,$member) { global $db; $member['data']['license'] = ''; $db->update_user($member['member_id'], $member); }setup_plugin_hook('subscription_deleted', 'my_member_api_key_deleted'); Again, this is generic.. will need to check conditions such as kind of products..