View source
<?php
namespace Drupal\views_extras\Plugin\views\argument_default;
use Drupal\Core\Cache\CacheableDependencyInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\Utility\Token;
use Drupal\views\Plugin\views\argument_default\ArgumentDefaultPluginBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
class Session extends ArgumentDefaultPluginBase implements CacheableDependencyInterface {
protected $current_user;
protected $moduleHandler;
protected $token;
public function __construct(array $configuration, $plugin_id, $plugin_definition, AccountProxyInterface $current_user, ModuleHandlerInterface $moduleHandler, Token $token) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->current_user = $current_user;
$this->moduleHandler = $moduleHandler;
$this->token = $token;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('current_user'), $container
->get('module_handler'), $container
->get('token'));
}
protected function defineOptions() {
$options = parent::defineOptions();
$options['session_key'] = array(
'default' => '',
);
$options['fallback_value'] = array(
'default' => FALSE,
);
$options['cache_time'] = array(
'default' => -1,
);
return $options;
}
public function buildOptionsForm(&$form, FormStateInterface $form_state) {
parent::buildOptionsForm($form, $form_state);
$form['session_key'] = array(
'#type' => 'textfield',
'#title' => $this
->t('Session variable key'),
'#default_value' => $this->options['session_key'],
'#description' => $this
->t('Keys of SESSION variable seperated by ::, e.g. for $_SESSION["key1"]["key2"], the key would be "key1::key2".'),
);
$form['fallback_value'] = array(
'#type' => 'textfield',
'#title' => $this
->t('If session variable is not set, what should be the fallback value.'),
'#default_value' => $this->options['fallback_value'],
'#description' => $this
->t('You may use user tokens.'),
);
if ($this->moduleHandler
->moduleExists("token")) {
$form['token_help'] = array(
'#type' => 'markup',
'#token_types' => array(
'user',
),
'#theme' => 'token_tree_link',
);
}
$form['cache_time'] = array(
'#type' => 'number',
'#title' => $this
->t('Cache Maximum Age.'),
'#default_value' => $this->options['cache_time'],
'#description' => $this
->t('If session variable changes in between session set it to 0.'),
);
}
public function getArgument() {
if (!empty($key = $this->options['session_key'])) {
$keys = explode('::', $key);
if ($value = $this
->findArrayValue($_SESSION, $keys)) {
return $value;
}
}
if (!empty($value = $this->options['fallback_value'])) {
return $this->token
->replace($value, [
'user' => $this->current_user,
]);
}
return $value;
}
public function getCacheMaxAge() {
return (int) $this->options['cache_time'];
}
public function getCacheContexts() {
return [
'session',
];
}
protected function findArrayValue(array $array, array $keys) {
if (array_key_exists($keys[0], $array)) {
if (is_array($array[$keys[0]])) {
$next_key = array_shift($keys);
if (!empty($keys)) {
return $this
->findArrayValue($array[$next_key], $keys);
}
}
else {
return $array[$keys[0]];
}
}
return FALSE;
}
}