SessionExampleForm.php

Same filename in other branches
  1. 3.x modules/session_example/src/Form/SessionExampleForm.php

Namespace

Drupal\session_example\Form

File

modules/session_example/src/Form/SessionExampleForm.php

View source
<?php

namespace Drupal\session_example\Form;

use Drupal\Core\Cache\CacheTagsInvalidatorInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;

/**
 * Form to allow the user to store information in their session.
 *
 * In this object we'll inject the session service. In the submission form we
 * got the session from a Request object supplied by the routing system. Either
 * of these work, because they're the same object. But we use injection here
 * because the buildForm() method does not have an easy way to derive the
 * Request object or the session.
 *
 * @ingroup session_example
 */
class SessionExampleForm extends FormBase {
    
    /**
     * The session object.
     *
     * We will use this to store information that the user submits, so that it
     * persists across requests.
     *
     * @var \Symfony\Component\HttpFoundation\Session\SessionInterface
     */
    protected $session;
    
    /**
     * The cache tag invalidator service.
     *
     * @var \Drupal\Core\Cache\CacheTagsInvalidatorInterface
     */
    protected $cacheTagInvalidator;
    
    /**
     * Constructs a new SessionExampleForm object.
     *
     * @param \Symfony\Component\HttpFoundation\Session\SessionInterface $session
     *   The session object.
     * @param \Drupal\Core\Cache\CacheTagsInvalidatorInterface $invalidator
     *   The cache tag invalidator service.
     */
    public function __construct(SessionInterface $session, CacheTagsInvalidatorInterface $invalidator) {
        $this->session = $session;
        $this->cacheTagInvalidator = $invalidator;
    }
    
    /**
     * {@inheritdoc}
     */
    public static function create(ContainerInterface $container) {
        return new static($container->get('session'), $container->get('cache_tags.invalidator'));
    }
    
    /**
     * {@inheritdoc}
     */
    public function getFormId() {
        return 'session_example_form';
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildForm(array $form, FormStateInterface $form_state) {
        $form['description'] = [
            '#type' => 'item',
            '#title' => $this->t('Session Data Form'),
            '#markup' => $this->t('In this example form, data that you enter into the form will be saved into your session data, which persists until you log out of Drupal.'),
        ];
        $form['name'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Name'),
            '#placeholder' => $this->t('Your name.'),
            '#default_value' => $this->session
                ->get('session_example.name', ''),
        ];
        $form['email'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Email'),
            '#placeholder' => $this->t('Your email address.'),
            '#default_value' => $this->session
                ->get('session_example.email', ''),
        ];
        $form['quest'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Quest'),
            '#placeholder' => $this->t('What is your quest?'),
            '#default_value' => $this->session
                ->get('session_example.quest', ''),
        ];
        $form['color'] = [
            '#type' => 'select',
            '#title' => $this->t('Favorite Color'),
            '#options' => [
                '' => $this->t('--'),
                'red' => $this->t('Red'),
                'blue' => $this->t('Blue'),
                'yellow' => $this->t('Yellow'),
                'argggh' => $this->t('Argggghhh!!'),
            ],
            '#default_value' => $this->session
                ->get('session_example.color', ''),
            '#description' => $this->t('What is your favorite color?'),
        ];
        $form['save'] = [
            '#type' => 'submit',
            '#value' => $this->t('Save'),
        ];
        $form['reset'] = [
            '#type' => 'submit',
            '#value' => $this->t('Clear Session'),
            '#submit' => [
                '::submitClearSession',
            ],
        ];
        return $form;
    }
    
    /**
     * Store a form value in the session.
     *
     * Form values are always a string. This means an empty string is a valid
     * value for when a user wants to remove a value from the session. We have to
     * handle this special case for the session object.
     *
     * @param string $key
     *   The key.
     * @param string $value
     *   The value.
     */
    protected function setSessionValue($key, $value) {
        if (empty($value)) {
            // If the value is an empty string, remove the key from the session.
            $this->session
                ->remove($key);
        }
        else {
            $this->session
                ->set($key, $value);
        }
    }
    
    /**
     * {@inheritdoc}
     */
    public function submitForm(array &$form, FormStateInterface $form_state) {
        // We get the submitted form information and store it in the session. We use
        // key names which include our module name in order to avoid namespace
        // collision.
        $this->setSessionValue('session_example.name', $form_state->getValue('name'));
        $this->setSessionValue('session_example.email', $form_state->getValue('email'));
        $this->setSessionValue('session_example.quest', $form_state->getValue('quest'));
        $this->setSessionValue('session_example.color', $form_state->getValue('color'));
        // Tell the user what happened here, and that they can look at another page
        // to see the result.
        $this->messenger()
            ->addMessage($this->t('The session has been saved successfully. @link', [
            '@link' => Link::createFromRoute('Check here.', 'session_example.view')->toString(),
        ]));
        // Since we might have changed the session information, we will invalidate
        // the cache tag for this session.
        $this->invalidateCacheTag();
    }
    
    /**
     * Remove all the session information.
     */
    public function submitClearSession(array &$form, FormStateInterface $form_state) {
        $items = [
            'session_example.name',
            'session_example.email',
            'session_example.quest',
            'session_example.color',
        ];
        foreach ($items as $item) {
            $this->session
                ->remove($item);
        }
        $this->messenger()
            ->addMessage($this->t('Session is cleared.'));
        // Since we might have changed the session information, we will invalidate
        // the cache tag for this session.
        $this->invalidateCacheTag();
    }
    
    /**
     * Invalidate the cache tag for this session.
     *
     * The form will use this method to invalidate the cache tag when the user
     * updates their information in the submit handlers.
     */
    protected function invalidateCacheTag() {
        $this->cacheTagInvalidator
            ->invalidateTags([
            'session_example:' . $this->session
                ->getId(),
        ]);
    }

}

Classes

Title Deprecated Summary
SessionExampleForm Form to allow the user to store information in their session.