Newer
Older
<?php
/**
* @file
* Contains \Drupal\views\Plugin\Block\ViewsBlockBase.
*/
namespace Drupal\views\Plugin\Block;
use Drupal\Core\Block\BlockBase;
Dries Buytaert
committed
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\views\ViewExecutableFactory;
catch
committed
use Drupal\Core\Entity\EntityStorageInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Session\AccountInterface;
/**
* Base class for Views block plugins.
*/
abstract class ViewsBlockBase extends BlockBase implements ContainerFactoryPluginInterface {
/**
* The View executable object.
*
* @var \Drupal\views\ViewExecutable
*/
protected $view;
/**
* The display ID being used for this View.
*
* @var string
*/
protected $displayID;
/**
* Indicates whether the display was successfully set.
*
* @var bool
*/
protected $displaySet;
/**
Angie Byron
committed
* The current user.
*
* @var \Drupal\Core\Session\AccountInterface
*/
protected $user;
/**
* Constructs a \Drupal\views\Plugin\Block\ViewsBlockBase object.
*
* @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\views\ViewExecutableFactory $executable_factory
* The view executable factory.
catch
committed
* @param \Drupal\Core\Entity\EntityStorageInterface $storage
* The views storage.
Angie Byron
committed
* @param \Drupal\Core\Session\AccountInterface $user
* The current user.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, ViewExecutableFactory $executable_factory, EntityStorageInterface $storage, AccountInterface $user) {
$this->pluginId = $plugin_id;
$delta = $this->getDerivativeId();
list($name, $this->displayID) = explode('-', $delta, 2);
// Load the view.
catch
committed
$view = $storage->load($name);
$this->view = $executable_factory->get($view);
$this->displaySet = $this->view->setDisplay($this->displayID);
Angie Byron
committed
$this->user = $user;
parent::__construct($configuration, $plugin_id, $plugin_definition);
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration, $plugin_id, $plugin_definition,
$container->get('views.executable'),
catch
committed
$container->get('entity.manager')->getStorage('view'),
Angie Byron
committed
$container->get('current_user')
);
}
/**
* {@inheritdoc}
*/
Angie Byron
committed
protected function blockAccess(AccountInterface $account) {
return $this->view->access($this->displayID);
}
Angie Byron
committed
/**
* {@inheritdoc}
*/
public function defaultConfiguration() {
return array('views_label' => '');
Angie Byron
committed
}
/**
* {@inheritdoc}
*/
Dries Buytaert
committed
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form = parent::buildConfigurationForm($form, $form_state);
// Set the default label to '' so the views internal title is used.
$form['label']['#default_value'] = '';
$form['label']['#access'] = FALSE;
Alex Pott
committed
// Unset the machine_name provided by BlockForm.
Angie Byron
committed
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
unset($form['id']['#machine_name']['source']);
// Prevent users from changing the auto-generated block machine_name.
$form['id']['#access'] = FALSE;
$form['#pre_render'][] = '\Drupal\views\Plugin\views\PluginBase::preRenderAddFieldsetMarkup';
// Allow to override the label on the actual page.
$form['views_label_checkbox'] = array(
'#type' => 'checkbox',
'#title' => $this->t('Override title'),
'#default_value' => !empty($this->configuration['views_label']),
);
$form['views_label_fieldset'] = array(
'#type' => 'fieldset',
'#states' => array(
'visible' => array(
array(
':input[name="settings[views_label_checkbox]"]' => array('checked' => TRUE),
),
),
),
);
$form['views_label'] = array(
'#title' => $this->t('Title'),
'#type' => 'textfield',
'#default_value' => $this->configuration['views_label'] ?: $this->view->getTitle(),
'#states' => array(
'visible' => array(
array(
':input[name="settings[views_label_checkbox]"]' => array('checked' => TRUE),
),
),
),
'#fieldset' => 'views_label_fieldset',
);
if ($this->view->storage->access('edit') && \Drupal::moduleHandler()->moduleExists('views_ui')) {
$form['views_label']['#description'] = $this->t('Changing the title here means it cannot be dynamically altered anymore. (Try changing it directly in <a href="@url">@name</a>.)', array('@url' => \Drupal::url('entity.view.edit_display_form', array('view' => $this->view->storage->id(), 'display_id' => $this->displayID)), '@name' => $this->view->storage->label()));
Angie Byron
committed
}
else {
$form['views_label']['#description'] = $this->t('Changing the title here means it cannot be dynamically altered anymore.');
}
return $form;
}
Angie Byron
committed
/**
* {@inheritdoc}
*/
Dries Buytaert
committed
public function blockSubmit($form, FormStateInterface $form_state) {
Alex Pott
committed
if (!$form_state->isValueEmpty('views_label_checkbox')) {
$this->configuration['views_label'] = $form_state->getValue('views_label');
Angie Byron
committed
}
else {
$this->configuration['views_label'] = '';
}
}
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/**
* Converts Views block content to a renderable array with contextual links.
*
* @param string|array $output
* An string|array representing the block. This will be modified to be a
* renderable array, containing the optional '#contextual_links' property (if
* there are any contextual links associated with the block).
* @param string $block_type
* The type of the block. If it's 'block' it's a regular views display,
* but 'exposed_filter' exist as well.
*/
protected function addContextualLinks(&$output, $block_type = 'block') {
// Do not add contextual links to an empty block.
if (!empty($output)) {
// Contextual links only work on blocks whose content is a renderable
// array, so if the block contains a string of already-rendered markup,
// convert it to an array.
if (is_string($output)) {
$output = array('#markup' => $output);
}
// Add the contextual links.
views_add_contextual_links($output, $block_type, $this->view, $this->displayID);
}
}
}