class Subscriptions in Message Subscribe 8
An entity subscriptions block.
Plugin annotation
@Block(
id = "message_subscribe_ui_block",
admin_label = @Translation("Manage subscriptions"),
category = @Translation("Subscriptions")
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Component\Plugin\ContextAwarePluginBase implements ContextAwarePluginInterface
- class \Drupal\Core\Plugin\ContextAwarePluginBase implements CacheableDependencyInterface, ContextAwarePluginInterface uses DependencySerializationTrait, StringTranslationTrait, TypedDataTrait
- class \Drupal\Core\Block\BlockBase implements BlockPluginInterface, PluginWithFormsInterface, PreviewFallbackInterface uses BlockPluginTrait, ContextAwarePluginAssignmentTrait
- class \Drupal\message_subscribe_ui\Plugin\Block\Subscriptions implements FormInterface, ContainerFactoryPluginInterface
- class \Drupal\Core\Block\BlockBase implements BlockPluginInterface, PluginWithFormsInterface, PreviewFallbackInterface uses BlockPluginTrait, ContextAwarePluginAssignmentTrait
- class \Drupal\Core\Plugin\ContextAwarePluginBase implements CacheableDependencyInterface, ContextAwarePluginInterface uses DependencySerializationTrait, StringTranslationTrait, TypedDataTrait
- class \Drupal\Component\Plugin\ContextAwarePluginBase implements ContextAwarePluginInterface
Expanded class hierarchy of Subscriptions
2 string references to 'Subscriptions'
- message_subscribe_ui.links.task.yml in message_subscribe_ui/
message_subscribe_ui.links.task.yml - message_subscribe_ui/message_subscribe_ui.links.task.yml
- message_subscribe_ui.routing.yml in message_subscribe_ui/
message_subscribe_ui.routing.yml - message_subscribe_ui/message_subscribe_ui.routing.yml
File
- message_subscribe_ui/
src/ Plugin/ Block/ Subscriptions.php, line 28
Namespace
Drupal\message_subscribe_ui\Plugin\BlockView source
class Subscriptions extends BlockBase implements FormInterface, ContainerFactoryPluginInterface {
/**
* The current user.
*
* @var \Drupal\Core\Session\AccountProxyInterface
*/
protected $currentUser;
/**
* The flag service.
*
* @var \Drupal\flag\FlagServiceInterface
*/
protected $flagService;
/**
* The form builder service.
*
* @var \Drupal\Core\Form\FormBuilderInterface
*/
protected $formBuilder;
/**
* The current route match service.
*
* @var \Drupal\Core\Routing\RouteMatchInterface
*/
protected $routeMatch;
/**
* The subscribers service.
*
* @var \Drupal\message_subscribe\SubscribersInterface
*/
protected $subscribers;
/**
* Constructs the subscriptions block.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\Form\FormBuilderInterface $form_builder
* The form builder service.
* @param \Drupal\message_subscribe\SubscribersInterface $subscribers
* The subscribers service.
* @param \Drupal\Core\Routing\RouteMatchInterface $route_match
* The current route match service.
* @param \Drupal\Core\Session\AccountProxyInterface $current_user
* The current user.
* @param \Drupal\flag\FlagServiceInterface $flag_service
* The flag service.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, FormBuilderInterface $form_builder, SubscribersInterface $subscribers, RouteMatchInterface $route_match, AccountProxyInterface $current_user, FlagServiceInterface $flag_service) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->currentUser = $current_user;
$this->flagService = $flag_service;
$this->formBuilder = $form_builder;
$this->routeMatch = $route_match;
$this->subscribers = $subscribers;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('form_builder'), $container
->get('message_subscribe.subscribers'), $container
->get('current_route_match'), $container
->get('current_user'), $container
->get('flag'));
}
/**
* Helper method to retrieve the current page entity.
*
* @return \Drupal\Core\Entity\EntityInterface|null
* The entity for the current route.
*/
protected function getCurrentEntity() {
// Let's look up in the route object for the name of upcasted values.
foreach ($this->routeMatch
->getParameters() as $parameter) {
if ($parameter instanceof EntityInterface) {
return $parameter;
}
}
}
/**
* {@inheritdoc}
*/
public function build() {
if (!($entity = $this
->getCurrentEntity()) || !$this
->hasSubscribableEntites($entity)) {
// Not on an entity page. Ensure the block is only cached for this route.
return [
'#cache' => [
'contexts' => [
'user',
'url.path',
],
],
];
}
return $this->formBuilder
->getForm($this);
}
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'message_subscribe_ui_block';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$form = [];
// Add the entity being viewed.
$entity = $this
->getCurrentEntity();
$entities = [
$entity,
];
$entities += $entity
->referencedEntities();
$form['description'] = [
'#type' => 'markup',
'#markup' => $this
->t('Manage all <a href=":url">subscriptions</a>.', [
':url' => Url::fromRoute('message_subscribe_ui.tab', [
'user' => \Drupal::currentUser()
->id(),
])
->toString(),
]),
];
$form['subscriptions'] = [
'#type' => 'container',
'#tree' => TRUE,
];
foreach ($entities as $referenced_entity) {
// Verify user can access the referenced entity.
if ($referenced_entity
->access('view')) {
$flags = $this->subscribers
->getFlags($referenced_entity
->getEntityTypeId(), $referenced_entity
->bundle(), $this->currentUser);
if (!empty($flags)) {
/** @var \Drupal\flag\FlagInterface $flag */
// @todo Support multiple subscription flags per-entity if there is
// such a use-case.
$flag = reset($flags);
$form['subscriptions'][$referenced_entity
->getEntityTypeId()][$referenced_entity
->id()] = [
'#type' => 'checkbox',
// @todo Determine how to use the flag label/value.
'#title' => $this
->getLabel($referenced_entity),
'#default_value' => !empty($this->flagService
->getFlagging($flag, $referenced_entity, $this->currentUser)),
'#flags' => $flags,
'#entity' => $referenced_entity,
];
}
}
}
$form['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Save'),
];
return $form;
}
/**
* Get a subscription checkbox label for a given entity.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The referenced entity.
*
* @return \Drupal\Core\StringTranslation\TranslatableMarkup
* The label for the subscription checkbox.
*/
protected function getLabel(EntityInterface $entity) {
$label = $entity instanceof UserInterface ? $entity
->getDisplayName() : $entity
->label();
return $this
->t('Subscribe to @label', [
'@label' => $label,
]);
}
/**
* Determine if this entity has accessible entities to subscribe to.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The entity to check for subscribable entities.
*
* @return bool
* Returns TRUE if there are subscribable entites found.
*/
protected function hasSubscribableEntites(EntityInterface $entity) {
$entities = [
$entity,
];
$entities += $entity
->referencedEntities();
foreach ($entities as $referenced_entity) {
if ($referenced_entity
->access('view')) {
$flags = $this->subscribers
->getFlags($referenced_entity
->getEntityTypeId(), $referenced_entity
->bundle(), $this->currentUser);
if (!empty($flags)) {
return TRUE;
}
}
}
return FALSE;
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
// TODO: Implement validateForm() method.
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
foreach ($form_state
->getValue('subscriptions') as $entity_type => $entities) {
foreach ($entities as $entity_id => $subscribe) {
/** @var \Drupal\flag\FlagInterface[] $flags */
$flags = $form['subscriptions'][$entity_type][$entity_id]['#flags'];
$entity = $form['subscriptions'][$entity_type][$entity_id]['#entity'];
foreach ($flags as $flag) {
try {
if ($subscribe) {
$this->flagService
->flag($flag, $entity, $this->currentUser);
}
else {
$this->flagService
->unflag($flag, $entity, $this->currentUser);
}
} catch (\LogicException $e) {
// User was either already unsubscribed, or subscribed.
}
}
}
}
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
BlockPluginInterface:: |
constant | Indicates the block label (title) should be displayed to end users. | ||
BlockPluginTrait:: |
protected | property | The transliteration service. | |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
protected | function | Returns generic default configuration for block plugins. | |
BlockPluginTrait:: |
protected | function | Indicates whether the block should be shown. | 16 |
BlockPluginTrait:: |
public | function | 16 | |
BlockPluginTrait:: |
public | function | 13 | |
BlockPluginTrait:: |
public | function | 3 | |
BlockPluginTrait:: |
public | function | Creates a generic configuration form for all block types. Individual block plugins can add elements to this form by overriding BlockBase::blockForm(). Most block plugins should not override this method unless they need to alter the generic form elements. | 2 |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | 19 | |
BlockPluginTrait:: |
public | function | 1 | |
BlockPluginTrait:: |
public | function | 1 | |
BlockPluginTrait:: |
public | function | 3 | |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | Sets the transliteration service. | |
BlockPluginTrait:: |
public | function | Most block plugins should not override this method. To add submission handling for a specific block type, override BlockBase::blockSubmit(). | |
BlockPluginTrait:: |
protected | function | Wraps the transliteration service. | |
BlockPluginTrait:: |
public | function | Most block plugins should not override this method. To add validation for a specific block type, override BlockBase::blockValidate(). | 1 |
ContextAwarePluginAssignmentTrait:: |
protected | function | Builds a form element for assigning a context to a given slot. | |
ContextAwarePluginAssignmentTrait:: |
protected | function | Wraps the context handler. | |
ContextAwarePluginBase:: |
protected | property | The data objects representing the context of this plugin. | |
ContextAwarePluginBase:: |
private | property | Data objects representing the contexts passed in the plugin configuration. | |
ContextAwarePluginBase:: |
protected | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
The cache contexts associated with this object. Overrides CacheableDependencyInterface:: |
9 |
ContextAwarePluginBase:: |
public | function |
The maximum age for which this object may be cached. Overrides CacheableDependencyInterface:: |
7 |
ContextAwarePluginBase:: |
public | function |
The cache tags associated with this object. Overrides CacheableDependencyInterface:: |
4 |
ContextAwarePluginBase:: |
public | function |
This code is identical to the Component in order to pick up a different
Context class. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Gets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the value for a defined context. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the values for all defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Set a context on this plugin. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Sets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Sets the value for a defined context. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Validates the set values for the defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function | Implements magic __get() method. | |
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
PluginWithFormsTrait:: |
public | function | ||
PluginWithFormsTrait:: |
public | function | ||
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
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. | |
Subscriptions:: |
protected | property | The current user. | |
Subscriptions:: |
protected | property | The flag service. | |
Subscriptions:: |
protected | property | The form builder service. | |
Subscriptions:: |
protected | property | The current route match service. | |
Subscriptions:: |
protected | property | The subscribers service. | |
Subscriptions:: |
public | function |
Builds and returns the renderable array for this block plugin. Overrides BlockPluginInterface:: |
|
Subscriptions:: |
public | function |
Form constructor. Overrides FormInterface:: |
|
Subscriptions:: |
public static | function |
Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface:: |
|
Subscriptions:: |
protected | function | Helper method to retrieve the current page entity. | |
Subscriptions:: |
public | function |
Returns a unique string identifying the form. Overrides FormInterface:: |
|
Subscriptions:: |
protected | function | Get a subscription checkbox label for a given entity. | |
Subscriptions:: |
protected | function | Determine if this entity has accessible entities to subscribe to. | |
Subscriptions:: |
public | function |
Form submission handler. Overrides FormInterface:: |
|
Subscriptions:: |
public | function |
Form validation handler. Overrides FormInterface:: |
|
Subscriptions:: |
public | function |
Constructs the subscriptions block. Overrides BlockPluginTrait:: |
|
TypedDataTrait:: |
protected | property | The typed data manager used for creating the data types. | |
TypedDataTrait:: |
public | function | Gets the typed data manager. | 2 |
TypedDataTrait:: |
public | function | Sets the typed data manager. | 2 |