class ConfirmationController in Simplenews 3.x
Same name and namespace in other branches
- 8.2 src/Controller/ConfirmationController.php \Drupal\simplenews\Controller\ConfirmationController
- 8 src/Controller/ConfirmationController.php \Drupal\simplenews\Controller\ConfirmationController
Returns responses for confirmation and subscriber routes.
Hierarchy
- class \Drupal\Core\Controller\ControllerBase implements ContainerInjectionInterface uses LoggerChannelTrait, MessengerTrait, RedirectDestinationTrait, StringTranslationTrait
- class \Drupal\simplenews\Controller\ConfirmationController
Expanded class hierarchy of ConfirmationController
File
- src/
Controller/ ConfirmationController.php, line 14
Namespace
Drupal\simplenews\ControllerView source
class ConfirmationController extends ControllerBase {
/**
* Menu callback: confirm a combined confirmation request.
*
* This function is called by clicking the confirm link in the confirmation
* email. It handles both subscription addition and subscription removal.
*
* @param int $snid
* The subscriber id.
* @param int $timestamp
* The timestamp of the request.
* @param bool $hash
* The confirmation hash.
* @param bool $immediate
* Perform the action immediately if TRUE.
*
* @see simplenews_confirm_add_form()
* @see simplenews_confirm_removal_form()
*/
public function confirmCombined($snid, $timestamp, $hash, $immediate = FALSE) {
$config = \Drupal::config('simplenews.settings');
// Prevent search engines from indexing this page.
$html_head = [
[
'#tag' => 'meta',
'#attributes' => [
'name' => 'robots',
'content' => 'noindex',
],
],
'simplenews-noindex',
];
$subscriber = Subscriber::load($snid);
// Redirect and display message if no changes are available.
if ($subscriber && !$subscriber
->getChanges()) {
$this
->messenger()
->addMessage($this
->t('All changes to your subscriptions where already applied. No changes made.'));
return $this
->redirect('<front>');
}
if ($subscriber && $hash == simplenews_generate_hash($subscriber
->getMail(), 'combined' . serialize($subscriber
->getChanges()), $timestamp)) {
// If the hash is valid but timestamp is too old, display form to request
// a new hash.
if ($timestamp < REQUEST_TIME - $config
->get('hash_expiration')) {
$context = [
'simplenews_subscriber' => $subscriber,
];
$build = \Drupal::formBuilder()
->getForm('\\Drupal\\simplenews\\Form\\RequestHashForm', 'subscribe_combined', $context);
$build['#attached']['html_head'][] = $html_head;
return $build;
}
// When not called with immediate parameter the user will be directed to
// the (un)subscribe confirmation page.
if (!$immediate) {
$build = \Drupal::formBuilder()
->getForm('\\Drupal\\simplenews\\Form\\ConfirmMultiForm', $subscriber);
$build['#attached']['html_head'][] = $html_head;
return $build;
}
else {
/** @var \Drupal\simplenews\Subscription\SubscriptionManagerInterface $subscription_manager */
$subscription_manager = \Drupal::service('simplenews.subscription_manager');
// Redirect and display message if no changes are available.
foreach ($subscriber
->getChanges() as $newsletter_id => $action) {
if ($action == 'subscribe') {
$subscription_manager
->subscribe($subscriber
->getMail(), $newsletter_id, FALSE, 'website');
}
elseif ($action == 'unsubscribe') {
$subscription_manager
->unsubscribe($subscriber
->getMail(), $newsletter_id, FALSE, 'website');
}
}
// Clear changes.
$subscriber
->setChanges([]);
$subscriber
->save();
$this
->messenger()
->addMessage($this
->t('Subscription changes confirmed for %user.', [
'%user' => $subscriber
->getMail(),
]));
return $this
->redirect('<front>');
}
}
throw new NotFoundHttpException();
}
/**
* Menu callback: confirm the user's (un)subscription request.
*
* This function is called by clicking the confirm link in the confirmation
* email or the unsubscribe link in the footer of the newsletter. It handles
* both subscription addition and subscription removal.
*
* Calling URLs are:
* newsletter/confirm/add
* newsletter/confirm/add/$HASH
* newsletter/confirm/remove
* newsletter/confirm/remove/$HASH
*
* @see simplenews_confirm_add_form()
* @see simplenews_confirm_removal_form()
*/
/**
* Menu callback: confirm the user's (un)subscription request.
*
* This function is called by clicking the confirm link in the confirmation
* email or the unsubscribe link in the footer of the newsletter. It handles
* both subscription addition and subscription removal.
*
* @param string $action
* Either add or remove.
* @param int $snid
* The subscriber id.
* @param int $newsletter_id
* The newsletter id.
* @param int $timestamp
* The timestamp of the request.
* @param string $hash
* The confirmation hash.
* @param bool $immediate
* Perform the action immediately if TRUE.
*
* @see simplenews_confirm_add_form()
* @see simplenews_confirm_removal_form()
*/
public function confirmSubscription($action, $snid, $newsletter_id, $timestamp, $hash, $immediate = FALSE) {
$config = \Drupal::config('simplenews.settings');
// Prevent search engines from indexing this page.
$html_head = [
[
'#tag' => 'meta',
'#attributes' => [
'name' => 'robots',
'content' => 'noindex',
],
],
'simplenews-noindex',
];
$subscriber = Subscriber::load($snid);
if ($subscriber && $hash == simplenews_generate_hash($subscriber
->getMail(), $action, $timestamp)) {
$newsletter = Newsletter::load($newsletter_id);
// If the hash is valid but timestamp is too old, display form to request
// a new hash.
if ($timestamp < REQUEST_TIME - $config
->get('hash_expiration')) {
$context = [
'simplenews_subscriber' => $subscriber,
'newsletter' => $newsletter,
];
$key = $action == 'add' ? 'subscribe_combined' : 'validate';
$build = \Drupal::formBuilder()
->getForm('\\Drupal\\simplenews\\Form\\RequestHashForm', $key, $context);
$build['#attached']['html_head'][] = $html_head;
return $build;
}
// When called with additional arguments the user will be directed to the
// (un)subscribe confirmation page. The additional arguments will be
// passed on to the confirmation page.
if (!$immediate) {
if ($action == 'remove') {
$build = \Drupal::formBuilder()
->getForm('\\Drupal\\simplenews\\Form\\ConfirmRemovalForm', $subscriber
->getMail(), $newsletter);
$build['#attached']['html_head'][] = $html_head;
return $build;
}
elseif ($action == 'add') {
$build = \Drupal::formBuilder()
->getForm('\\Drupal\\simplenews\\Form\\ConfirmAddForm', $subscriber
->getMail(), $newsletter);
$build['#attached']['html_head'][] = $html_head;
return $build;
}
}
else {
/** @var \Drupal\simplenews\Subscription\SubscriptionManagerInterface $subscription_manager */
$subscription_manager = \Drupal::service('simplenews.subscription_manager');
if ($action == 'remove') {
$subscription_manager
->unsubscribe($subscriber
->getMail(), $newsletter_id, FALSE, 'website');
if ($path = $config
->get('subscription.confirm_unsubscribe_page')) {
return $this
->redirect(Url::fromUri("internal:{$path}")
->getRouteName());
}
$this
->messenger()
->addMessage($this
->t('%user was unsubscribed from the %newsletter mailing list.', [
'%user' => $subscriber
->getMail(),
'%newsletter' => $newsletter->name,
]));
return $this
->redirect('<front>');
}
elseif ($action == 'add') {
$subscription_manager
->subscribe($subscriber
->getMail(), $newsletter_id, FALSE, 'website');
if ($path = $config
->get('subscription.confirm_subscribe_page')) {
return $this
->redirect(Url::fromUri("internal:{$path}")
->getRouteName());
}
$this
->messenger()
->addMessage($this
->t('%user was added to the %newsletter mailing list.', [
'%user' => $subscriber
->getMail(),
'%newsletter' => $newsletter->name,
]));
return $this
->redirect('<front>');
}
}
}
throw new NotFoundHttpException();
}
/**
* Redirects subscribers to the appropriate page.
*
* Redirect to the 'Newsletters' tab for authenticated users or the 'Access
* your subscriptions' page otherwise.
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse
* Returns a redirect to the correct page.
*/
public function subscriptionsPage() {
$user = $this
->currentUser();
if ($user
->isAuthenticated()) {
return $this
->redirect('simplenews.newsletter_subscriptions_user', [
'user' => $user
->id(),
]);
}
return $this
->redirect('simplenews.newsletter_validate');
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
ConfirmationController:: |
public | function | Menu callback: confirm a combined confirmation request. | |
ConfirmationController:: |
public | function | Menu callback: confirm the user's (un)subscription request. | |
ConfirmationController:: |
public | function | Redirects subscribers to the appropriate page. | |
ControllerBase:: |
protected | property | The configuration factory. | |
ControllerBase:: |
protected | property | The current user service. | 1 |
ControllerBase:: |
protected | property | The entity form builder. | |
ControllerBase:: |
protected | property | The entity type manager. | |
ControllerBase:: |
protected | property | The form builder. | 2 |
ControllerBase:: |
protected | property | The key-value storage. | 1 |
ControllerBase:: |
protected | property | The language manager. | 1 |
ControllerBase:: |
protected | property | The module handler. | 2 |
ControllerBase:: |
protected | property | The state service. | |
ControllerBase:: |
protected | function | Returns the requested cache bin. | |
ControllerBase:: |
protected | function | Retrieves a configuration object. | |
ControllerBase:: |
private | function | Returns the service container. | |
ControllerBase:: |
public static | function |
Instantiates a new instance of this class. Overrides ContainerInjectionInterface:: |
46 |
ControllerBase:: |
protected | function | Returns the current user. | 1 |
ControllerBase:: |
protected | function | Retrieves the entity form builder. | |
ControllerBase:: |
protected | function | Retrieves the entity type manager. | |
ControllerBase:: |
protected | function | Returns the form builder service. | 2 |
ControllerBase:: |
protected | function | Returns a key/value storage collection. | 1 |
ControllerBase:: |
protected | function | Returns the language manager service. | 1 |
ControllerBase:: |
protected | function | Returns the module handler. | 2 |
ControllerBase:: |
protected | function | Returns a redirect response object for the specified route. | |
ControllerBase:: |
protected | function | Returns the state storage service. | |
LoggerChannelTrait:: |
protected | property | The logger channel factory service. | |
LoggerChannelTrait:: |
protected | function | Gets the logger for a specific channel. | |
LoggerChannelTrait:: |
public | function | Injects the logger channel factory. | |
MessengerTrait:: |
protected | property | The messenger. | 27 |
MessengerTrait:: |
public | function | Gets the messenger. | 27 |
MessengerTrait:: |
public | function | Sets the messenger. | |
RedirectDestinationTrait:: |
protected | property | The redirect destination service. | 1 |
RedirectDestinationTrait:: |
protected | function | Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url. | |
RedirectDestinationTrait:: |
protected | function | Returns the redirect destination service. | |
RedirectDestinationTrait:: |
public | function | Sets the redirect destination service. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 4 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. |