skimlinks-8.x-1.x-dev/src/Form/SkimlinksAdminSettingsForm.php
src/Form/SkimlinksAdminSettingsForm.php
<?php namespace Drupal\skimlinks\Form; use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; use Drupal\Core\Link; use Drupal\Component\Render\FormattableMarkup; use GuzzleHttp\Exception\RequestException; /** * Configure Skimlinks settings for this site. */ class SkimlinksAdminSettingsForm extends ConfigFormBase { /** * {@inheritdoc} */ public function getFormId() { return 'skimlinks_admin_settings'; } /** * {@inheritdoc} */ protected function getEditableConfigNames() { return ['skimlinks.settings']; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { $config = $this->config('skimlinks.settings'); $form['account'] = [ '#type' => 'fieldset', '#title' => $this->t('General settings'), '#open' => TRUE, ]; $form['account']['skimlinks_domainid'] = [ '#default_value' => $config->get('domainid'), '#description' => $this->t( 'This ID is unique to each site you affiliate with Skimlinks. Get your Domain ID on the <a href=":hub" target="_blank">Skimlinks Hub</a>. If you don\'t have a Skimlinks account you can apply for one <a href=":apply" target="_blank">here</a>.', [ ':hub' => Url::fromUri('https://hub.skimlinks.com/settings/install')->toString(), ':apply' => Url::fromUri('https://signup.skimlinks.com')->toString(), ] ), '#maxlength' => 20, // '#placeholder' => 'UA-', '#required' => TRUE, '#size' => 15, '#title' => $this->t('Domain ID'), '#type' => 'textfield', '#attributes' => [ 'placeholder' => t('000000X000000'), ], ]; $form['account']['skimlinks_subdomain'] = [ '#title' => t('Custom redirection sub domain'), '#type' => 'textfield', '#default_value' => $config->get('subdomain') ?: 'https://go.redirectingat.com', '#description' => t( 'You may use a custom subdomain to redirect your affiliate links rather than the default go.redirectingat.com. Please include the http:// or https://. Visit the <a href=":advanced" target="_blank">Skimlinks Advanced Settings</a> page for more details.', [ ':advanced' => Url::fromUri('https://hub.skimlinks.com/settings/advanced')->toString(), ] ) ]; $form['skimlinks_environment'] = [ '#type' => 'radios', '#title' => t('Environment'), '#options' => [t('Client side'), t('Server side')], '#description' => t('Client side uses Javascript, server side runs on the server.'), '#default_value' => $config->get('environment') ?: 0, ]; $form['server_side'] = [ '#type' => 'fieldset', '#title' => t('Server side settings'), '#states' => [ 'visible' => [ ':input[name="skimlinks_environment"]' => ['value' => '1'] ] ], ]; $form['server_side']['api'] = [ '#type' => 'fieldset', '#title' => t('API settings'), ]; /** * @todo variables */ $form['server_side']['api']['skimlinks_merchant_api_description'] = [ '#type' => 'markup', '#markup' => '<p>' . t( 'The Skimlinks Merchant API provides information about Merchants participating in the Skimlinks program. The API is available via <code>:api</code>. <a href=":info" target="_blank">More information</a>', [ ':api' => Url::fromUri('https://merchants.skimapis.com/v3/merchants')->toString(), ':info' => Url::fromUri('http://developers.skimlinks.com/merchant.html')->toString(), ] ) . '</p>' ]; $form['server_side']['api']['skimlinks_merchant_api_endpoint'] = [ '#type' => 'textfield', '#title' => t('API Endpoint'), '#description' => t('The API key for the Merchant API.'), '#default_value' => $config->get('merchant_api_endpoint') ?: 'https://merchants.skimapis.com/v3/merchants', ]; $form['server_side']['api']['skimlinks_merchant_api_key'] = [ '#type' => 'textfield', '#title' => t('API Key'), '#description' => t('The API key for the Merchant API.'), '#default_value' => $config->get('merchant_api_key'), ]; $form['server_side']['api']['skimlinks_merchant_api_account_type'] = [ '#type' => 'textfield', '#title' => t('Account type'), '#description' => t('The account type for the Merchant API.'), '#default_value' => $config->get('merchant_api_account_type'), ]; $form['server_side']['api']['skimlinks_merchant_api_account_id'] = [ '#type' => 'textfield', '#title' => t('Account Id'), '#description' => t('The account Id for the Merchant API.'), '#default_value' => $config->get('merchant_api_account_id'), ]; $form['server_side']['skimlinks_api_cron_enabled'] = [ '#type' => 'checkbox', '#title' => t('Enable Cron to update known domains using the Skimlinks Merchant API'), '#description' => t('Tick the box to turn on the cron job.'), '#default_value' => $config->get('api_cron_enabled') ?: 1, ]; $form['server_side']['cron'] = [ '#type' => 'fieldset', '#title' => t('Cron settings'), '#states' => [ 'visible' => [ ':input[name="skimlinks_api_cron_enabled"]' => ['checked' => TRUE] ] ], ]; $form['server_side']['cron']['skimlinks_cron_process_time'] = [ '#type' => 'textfield', '#title' => t('Cron processing time (Seconds)'), '#size' => 4, '#description' => t('The number in seconds to spend when running cron.'), '#default_value' => (int) $config->get('cron_process_time') ?: 60, ]; $form['server_side']['cron']['skimlinks_domains_update_threshold'] = [ '#type' => 'textfield', '#title' => t('Cron update threshold (Minutes)'), '#size' => 4, '#description' => t('Used to control how often you want to update the list of known domains. Default: Every 12 hours.'), '#default_value' => (int) $config->get('domains_update_threshold') ?: 720, ]; $form['server_side']['skimlinks_update_known_domains_on_entity_update'] = [ '#type' => 'checkbox', '#title' => t('Update known domains when content changes'), '#description' => t('Tick the box to update the kwnon domains list when content is saved. The list is automatically populated by the Merchant API.'), '#default_value' => $config->get('update_known_domains_on_entity_update') ?: 1, ]; $form['server_side']['skimlinks_domain_blacklist'] = [ '#type' => 'textarea', '#title' => t('Domain blacklist'), '#description' => t('These domains will not be altered by skimlinks module. Please enter one domain per line. i.e. example.com. You do not need to specify the protocol.'), '#default_value' => implode("\n", skimlinks_domain_blacklist()), ]; $form['server_side']['skimlinks_link_new_window'] = [ '#type' => 'checkbox', '#title' => t('Open links in a new window'), '#description' => t('Tick the box to make the links open on a new window.'), '#default_value' => $config->get('link_new_window') ?: 1, ]; $form['server_side']['skimlinks_link_nofollow'] = [ '#type' => 'checkbox', '#title' => t('Make links nofollow'), '#description' => t('Tick the box to make the links nofollow.'), '#default_value' => $config->get('link_nofollow') ?: 1, ]; return parent::buildForm($form, $form_state); } /** * {@inheritdoc} * @todo Improve domain id validation. * @todo Validation for server-side fields */ public function validateForm(array &$form, FormStateInterface $form_state) { // Trim whitespace $form_state->setValue('skimlinks_domainid', trim($form_state->getValue('skimlinks_domainid'))); $form_state->setValue('skimlinks_subdomain', trim($form_state->getValue('skimlinks_subdomain'))); // Domain ID // Ensure the skimlinks domain ID consists of only numbers and letters if (!preg_match('/^[a-zA-Z0-9]*$/', $form_state->getValue('skimlinks_domainid'))) { $form_state->setErrorByName('skimlinks_domainid', t('A valid Domain ID should have the following format: 000000X000000')); return FALSE; } // Custom redirection sub domain // Check the user has included the URL schema in the subdomain value. $subdomain = $form_state->getValue('skimlinks_subdomain'); preg_match('/^https?:\/\//', $subdomain, $matches); $protocol = !empty($matches) ? $matches[0] : false; if (!$protocol) { $form_state->setErrorByName('skimlinks_subdomain', t('Your custom redirection sub-domain is not a valid URL. Please include the http:// or https://')); } // Validate the provided subdomain by comparing the Skimlinks default // response with the new subdomain response $standard_url = 'https://go.redirectingat.com/check/domain_check.html'; $cnamecheck_url = $subdomain . '/check/domain_check.html'; try { $original = \Drupal::httpClient()->get($standard_url, ['http_errors' => FALSE])->getBody()->__toString(); } catch (RequestException $e) { $form_state->setErrorByName('skimlinks_subdomain', t('We\'re sorry, but we can\'t connect to the Skimlinks server at the moment. Please try again later')); } try { $new = \Drupal::httpClient()->get($cnamecheck_url, ['http_errors' => FALSE])->getBody()->__toString(); } catch (RequestException $e) { $form_state->setErrorByName('skimlinks_subdomain', t('The custom domain does not appear to be a valid URL.')); } if (empty($new) || $original !== $new) { $form_state->setErrorByName('skimlinks_subdomain', t('Your custom redirection sub-domain is not currently pointing at Skimlinks servers.')); } $blacklist = $form_state->getValue('skimlinks_domain_blacklist'); if (!skimlinks_validate_blacklist($blacklist)) { /** * @todo limit variable */ $form_state->setErrorByName('skimlinks_domain_blacklist', t('There is a problem with one of the submitted blacklist domains. Due to certain database limitations, domains must have :limit characters or fewer.', [':limit' => _skimlinks_max_domain_length()])); } } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $config = $this->config('skimlinks.settings'); // Remove all but user input $form_state->cleanValues(); // Retrieve the blacklist for adding to the DB $blacklist = $form_state->getValue('skimlinks_domain_blacklist'); $form_state->unsetValue('skimlinks_domain_blacklist'); skimlinks_create_blacklist($blacklist); // Set config for all others foreach ($form_state->getValues() as $key => $value) { $config_key = preg_replace('/^skimlinks_/', '', $key); $config->set($config_key, $value); } $config->save(); _drupal_flush_css_js(); parent::submitForm($form, $form_state); } }