contest-8.x-1.0-alpha2/contest.module
contest.module
<?php /** * @file * The contest's module file. */ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Url; use Drupal\contest\ContestCache; use Drupal\contest\ContestHelper; use Drupal\contest\ContestStorage; use Drupal\contest\ContestUser; /** * Implements hook_cache_flush(). */ function contest_cache_flush() { ContestCache::flushCache(); return []; } /** * Implements hook_form_FORM_ID_alter(). */ function contest_form_contest_form_alter(&$form, FormStateInterface $form_state, $form_id) { $end = !empty($form['end']['widget'][0]['value']['#default_value']) ? $form['end']['widget'][0]['value']['#default_value'] : REQUEST_TIME; $start = !empty($form['start']['widget'][0]['value']['#default_value']) ? $form['start']['widget'][0]['value']['#default_value'] : REQUEST_TIME; $usr = new ContestUser(1); // A link to the list page. $form['list'] = [ '#type' => 'markup', '#markup' => t('<a href="@url">Contest List »</a>', ['@url' => \Drupal::url('contest.contest_list')]), '#weight' => -1000, ]; // Start date. $form['start_tmp'] = [ '#title' => t('Start'), '#description' => t('Format: YYYY-MM-DD'), '#type' => 'date', '#default_value' => date('Y-m-d', $start), '#date_format' => 'Y-m-d', '#date_increment' => ContestStorage::DAY, '#date_label_position' => 'invisible', '#date_timezone' => date('T'), '#date_year_range' => '-1:+3', '#required' => TRUE, '#weight' => $form['start']['#weight'], ]; // End date. $form['end_tmp'] = [ '#title' => t('End'), '#description' => t('Format: YYYY-MM-DD'), '#type' => 'date', '#default_value' => date('Y-m-d', $end), '#date_format' => 'Y-m-d', '#date_increment' => ContestStorage::DAY, '#date_label_position' => 'invisible', '#date_timezone' => date('T'), '#date_year_range' => '-1:+3', '#required' => TRUE, '#weight' => $form['end']['#weight'], ]; // Set a default sponsor ID. if (empty($form['sponsor_uid']['widget'][0]['target_id']['#default_value']->uid->value)) { $form['sponsor_uid']['widget'][0]['target_id']['#default_value'] = $usr->getAccount(); } // Turn off some elements. $form['start']['widget'][0]['value']['#access'] = FALSE; $form['end']['widget'][0]['value']['#access'] = FALSE; $form['publish_winners']['widget'] = [ '#type' => 'hidden', '#value' => (isset($form['publish_winners']['#default_value']) && $form['publish_winners']['#default_value'] == 1) ? 1 : 0, ]; } /** * Implements hook_form_FORM_ID_alter(). */ function contest_form_user_form_alter(&$form, FormStateInterface $form_state, $form_id) { $birthdate = !empty($form['field_contest_birthdate']['widget'][0]['value']['#default_value']) ? $form['field_contest_birthdate']['widget'][0]['value']['#default_value'] : REQUEST_TIME; $states = ContestHelper::getStates(\Drupal::config('system.date')->get('country.default')); // Birthdate. if (!empty($form['field_contest_birthdate'])) { array_unshift($form['#validate'], 'contest_user_form_validate'); $form['birthdate'] = [ '#title' => $form['field_contest_birthdate']['widget'][0]['value']['#title'], '#description' => t('Format: YYYY-MM-DD'), '#type' => 'date', '#default_value' => date('Y-m-d', $birthdate), '#date_format' => 'Y-m-d', '#date_increment' => ContestStorage::DAY, '#date_label_position' => 'invisible', '#date_timezone' => date('T'), '#date_year_range' => '-99:+0', '#required' => FALSE, '#weight' => $form['field_contest_birthdate']['#weight'], ]; $form['field_contest_birthdate']['widget'][0]['value']['#access'] = FALSE; } // Change the state text field to a select if we have the states to fill it. if (!empty($states) && !empty($form['field_contest_state'])) { $form['field_contest_state']['widget'][0]['value'] = [ '#type' => 'select', '#title' => $form['field_contest_state']['widget'][0]['value']['#title'], '#options' => array_merge(['' => '-- Select --'], $states), '#default_value' => !empty($form['field_contest_state']['widget'][0]['value']['#default_value']) ? $form['field_contest_state']['widget'][0]['value']['#default_value'] : '', '#required' => FALSE, '#weight' => $form['field_contest_state']['widget'][0]['value']['#weight'], ]; } } /** * Implements hook_help(). */ function contest_help($route_name, RouteMatchInterface $route_match) { switch ($route_name) { case 'help.page.contest': $html = '<h3>' . t('About') . '</h3>'; $html .= '<p>' . t('The contest module allows your site to host random games of chance, “Sweepstakes”. Where users can enter to win prizes via a random drawing.') . '</p>'; $html .= '<p>' . t('Anonymous users can fill-in their personal information and a user will be created for them.') . '</p>'; $html .= '<p>' . t('Logged in users with complete profiles can just click the “Enter Contest” button.') . '</p>'; $html .= '<p>' . t("Winners can be selected via a contest's admin page or the entries exported and printed for a public drawing.") . '</p>'; $html .= '<p>' . t('The same export can be provided to sponsors or affiliates for marketing purposes.') . '</p>'; return $html; } return ''; } /** * Implements hook_page_attachments(). */ function contest_page_attachments(array &$page) { $page['#attached']['library'][] = 'contest/drupal.contest-links'; } /** * Implements hook_theme(). */ function contest_theme() { $themes = [ 'contest_admin' => [ 'template' => 'contest-admin', 'variables' => [ 'contest' => NULL, ], ], 'contest_results' => [ 'template' => 'contest-results', 'variables' => [ 'results' => NULL, ], ], 'contest_tnc' => [ 'template' => 'contest-tnc', 'variables' => [ 'data' => NULL, ], ], ]; return $themes; } /** * Implements hook_uri(). */ function contest_uri($contest) { return ['path' => 'contest/' . $contest->id()]; } /** * Custom validation function for the user form. */ function contest_user_form_validate($form, $form_state) { $form_state->setValue('field_contest_birthdate', [['value' => strtotime($form_state->getValue('birthdate'))]]); } /** * Preprocessor for the contest admin page. */ function template_preprocess_contest_admin(&$vars, $theme) { $vars['contest'] = ContestHelper::getContestData(\Drupal::request()->get('contest')->id()); } /** * Preprocessor for the contest view page. */ function template_preprocess_contest_results(&$vars, $theme) { foreach (ContestHelper::getWinners(\Drupal::request()->get('contest')->id()) as $place => $uid) { $usr = new ContestUser($uid); $vars['results'][$place] = [ 'uid' => $usr->uid, 'full_name' => $usr->fullName, 'place' => $place, 'city' => $usr->city, 'state' => $usr->state, 'mail' => $usr->mail, ]; } }