cforge-2.0.x-dev/modules/cforge_referrer/cforge_referrer.module
modules/cforge_referrer/cforge_referrer.module
<?php
use Drupal\user\Entity\User;
use Drupal\mcapi\Entity\Wallet;
use Drupal\taxonomy\Entity\Term;
use Drupal\Core\Url;
function cforge_referrer_form_cforge_settings_alter(&$form, $form_state) {
$config = \Drupal::config('cforge_referrer.settings');
$form['referral'] = [
'#title' => t('Referral'),
'#description' => t('New users have 1 month to nominate another user for a referral bonus.'),
'#type' => 'details',
'#open' => TRUE,
'fee' => [
'#title' => t('Referral fee'),
'#type' => 'worths_form',
'#default_value' => $config->get('fee'),
'#config' => TRUE,
'#required' => TRUE
],
'src_wallet' => [
'#title' => t('Referral source wallet'),
'#description' => t(
'Wallet from which referral payments are drawn. Ideally this wallet would be held by the account manager. <a href="">Change its ownership</a>.',
),
'#type' => 'wallet_entity_auto',
// Autocomplete field takes the whole entity
'#default_value' => $config->get('src_wallet') ? Wallet::load($config->get('src_wallet')) : NULL,
'#weight' => 3,
'#id' => 'referral-src',
'#attached' => ['library' => ['cforge_referrer/settings_page']],
'#required' => TRUE
],
'category' => [
'#title' => t('Referral category'),
'#description' => t('Category for referral transactions'),
'#type' => 'entity_autocomplete',
'#target_type' => 'taxonomy_term',
'#selection_settings' => ['target_bundles' => ['categories']],
'#default_value' => $config->get('category') ? Term::load($config->get('category')) : NULL,
'#weight' => 4,
'#required' => TRUE
],
'#weight' => 3,
];
$form['#submit'][] = 'cforge_referrer_settings_submit';
}
function cforge_referrer_settings_submit($form, $form_state) {
\Drupal::configFactory()->getEditable('cforge_referrer.settings')
->set('fee', $form_state->getValue('fee'))
->set('src_wallet', $form_state->getValue('src_wallet'))
->set('category', $form_state->getValue('category'))
->save();
}
/**
* Implements hook_ENTITY_TYPE_view_alter().
* Replace the user view with the referrer form
*/
function cforge_referrer_user_view_alter(&$build, $account, $display) {
if ($account->id() == \Drupal::currentUser()->id() and cforge_referrer_needed($account->id())) {
$build = \Drupal::formBuilder()->getForm('\Drupal\cforge_referrer\ChooseReferrer', $account);
// These are expected by the page builder.
$build['#entity_type'] = 'user';
$build['#user'] = $account;
}
}
/**
* Implements hook_user_login().
* Redirect new users to the referral form.
*/
function cforge_referrer_user_login($account) {
if (cforge_referrer_needed($account->id())) {
$elapsed = \Drupal::time()->getRequestTime() - $account->getCreatedTime();
\Drupal::messenger()->addWarning(
t('Did another member ask you join @site? Click <a href=":url">here</a> within @num days so they can get a reward.'),
[
'@site' => \Drupal::config('system.site')->get('name'),
'@num' => 30*24*3600 - $elapsed,
':url' => Url::fromRoute('cforge.choose_referrer', ['user' => $account->id()])
]
);
}
}
/**
* Determine whether a user is allowed to nominate a referrer.
*/
function cforge_referrer_needed($uid) : bool {
$config = \Drupal::config('cforge_referrer.settings');
if (empty($config->get('fee.value'))) {
return FALSE;
}
if (!empty(\Drupal::service('user.data')->get('cforge_referrer', $uid, 'referred_by'))) {
return FALSE;
}
elseif (User::load($uid)->getCreatedTime() > strtotime('-1 month')) {
return FALSE;
}
return TRUE;
}
/**
* Implements hook_user_insert().
* Mark the user as needing to state a referrer.
*/
function cforge_referrer_user_insert($user) {
\Drupal::service('user.data')
->set('cforge_referrer', $user->id(), 'referred_by', 0);
}
/**
* Implements hook_cron().
*/
function cforge_referrer_cron() {
$config = \Drupal::config('cforge_referrer.settings');
if (!$config->get('src_wallet') or !$config->get('category') or !$config->get('fee.value')) {
mail(
\Drupal::config('system.site')->get('mail'),
t(
'@site: Referrer reward module not yet configured.',
['@site' => \Drupal::config('system.site')->get('name')]
),
t(
'Configure the module at @url1 or disable the module at @url2',
[
'@url1' => Url::fromRoute('cforge.settings', [], ['absolute' => TRUE])->toString(),
'@url2' => Url::fromRoute('system.modules_list', [], ['absolute' => TRUE])->toString()
]
)
);
}
}
function cforge_referrer_empty_worth(array $referral_fee) : bool {
foreach ($referral_fee as $worth) {
if ($worth['value']) {
return TRUE;
}
}
return FALSE;
}
