X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=web%2Fcore%2Fmodules%2Fviews%2Fsrc%2FPlugin%2Fviews%2Fdisplay%2FBlock.php;fp=web%2Fcore%2Fmodules%2Fviews%2Fsrc%2FPlugin%2Fviews%2Fdisplay%2FBlock.php;h=5e833d752a5776d7377c6ba7357148ae81397176;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/core/modules/views/src/Plugin/views/display/Block.php b/web/core/modules/views/src/Plugin/views/display/Block.php new file mode 100644 index 000000000..5e833d752 --- /dev/null +++ b/web/core/modules/views/src/Plugin/views/display/Block.php @@ -0,0 +1,369 @@ +entityManager = $entity_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('entity.manager') + ); + } + + /** + * {@inheritdoc} + */ + protected function defineOptions() { + $options = parent::defineOptions(); + + $options['block_description'] = ['default' => '']; + $options['block_category'] = ['default' => $this->t('Lists (Views)')]; + $options['block_hide_empty'] = ['default' => FALSE]; + + $options['allow'] = [ + 'contains' => [ + 'items_per_page' => ['default' => 'items_per_page'], + ], + ]; + + return $options; + } + + /** + * Returns plugin-specific settings for the block. + * + * @param array $settings + * The settings of the block. + * + * @return array + * An array of block-specific settings to override the defaults provided in + * \Drupal\views\Plugin\Block\ViewsBlock::defaultConfiguration(). + * + * @see \Drupal\views\Plugin\Block\ViewsBlock::defaultConfiguration() + */ + public function blockSettings(array $settings) { + $settings['items_per_page'] = 'none'; + return $settings; + } + + /** + * The display block handler returns the structure necessary for a block. + */ + public function execute() { + // Prior to this being called, the $view should already be set to this + // display, and arguments should be set on the view. + $element = $this->view->render(); + if ($this->outputIsEmpty() && $this->getOption('block_hide_empty') && empty($this->view->style_plugin->definition['even empty'])) { + return []; + } + else { + return $element; + } + } + + /** + * Provide the summary for page options in the views UI. + * + * This output is returned as an array. + */ + public function optionsSummary(&$categories, &$options) { + parent::optionsSummary($categories, $options); + + $categories['block'] = [ + 'title' => $this->t('Block settings'), + 'column' => 'second', + 'build' => [ + '#weight' => -10, + ], + ]; + + $block_description = strip_tags($this->getOption('block_description')); + if (empty($block_description)) { + $block_description = $this->t('None'); + } + $block_category = $this->getOption('block_category'); + + $options['block_description'] = [ + 'category' => 'block', + 'title' => $this->t('Block name'), + 'value' => views_ui_truncate($block_description, 24), + ]; + $options['block_category'] = [ + 'category' => 'block', + 'title' => $this->t('Block category'), + 'value' => views_ui_truncate($block_category, 24), + ]; + + $filtered_allow = array_filter($this->getOption('allow')); + + $options['allow'] = [ + 'category' => 'block', + 'title' => $this->t('Allow settings'), + 'value' => empty($filtered_allow) ? $this->t('None') : $this->t('Items per page'), + ]; + + $options['block_hide_empty'] = [ + 'category' => 'other', + 'title' => $this->t('Hide block if the view output is empty'), + 'value' => $this->getOption('block_hide_empty') ? $this->t('Yes') : $this->t('No'), + ]; + } + + /** + * Provide the default form for setting options. + */ + public function buildOptionsForm(&$form, FormStateInterface $form_state) { + parent::buildOptionsForm($form, $form_state); + + switch ($form_state->get('section')) { + case 'block_description': + $form['#title'] .= $this->t('Block admin description'); + $form['block_description'] = [ + '#type' => 'textfield', + '#description' => $this->t('This will appear as the name of this block in administer >> structure >> blocks.'), + '#default_value' => $this->getOption('block_description'), + ]; + break; + case 'block_category': + $form['#title'] .= $this->t('Block category'); + $form['block_category'] = [ + '#type' => 'textfield', + '#autocomplete_route_name' => 'block.category_autocomplete', + '#description' => $this->t('The category this block will appear under on the blocks placement page.', [':href' => \Drupal::url('block.admin_display')]), + '#default_value' => $this->getOption('block_category'), + ]; + break; + case 'block_hide_empty': + $form['#title'] .= $this->t('Block empty settings'); + + $form['block_hide_empty'] = [ + '#title' => $this->t('Hide block if no result/empty text'), + '#type' => 'checkbox', + '#description' => $this->t('Hide the block if there is no result and no empty text and no header/footer which is shown on empty result'), + '#default_value' => $this->getOption('block_hide_empty'), + ]; + break; + case 'exposed_form_options': + $this->view->initHandlers(); + if (!$this->usesExposed() && parent::usesExposed()) { + $form['exposed_form_options']['warning'] = [ + '#weight' => -10, + '#markup' => '
' . $this->t('Exposed filters in block displays require "Use AJAX" to be set to work correctly.') . '
', + ]; + } + break; + case 'allow': + $form['#title'] .= $this->t('Allow settings in the block configuration'); + + $options = [ + 'items_per_page' => $this->t('Items per page'), + ]; + + $allow = array_filter($this->getOption('allow')); + $form['allow'] = [ + '#type' => 'checkboxes', + '#default_value' => $allow, + '#options' => $options, + ]; + break; + } + } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + public function submitOptionsForm(&$form, FormStateInterface $form_state) { + parent::submitOptionsForm($form, $form_state); + $section = $form_state->get('section'); + switch ($section) { + case 'block_description': + case 'block_category': + case 'allow': + case 'block_hide_empty': + $this->setOption($section, $form_state->getValue($section)); + break; + } + } + + /** + * Adds the configuration form elements specific to this views block plugin. + * + * This method allows block instances to override the views items_per_page. + * + * @param \Drupal\views\Plugin\Block\ViewsBlock $block + * The ViewsBlock plugin. + * @param array $form + * The form definition array for the block configuration form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The current state of the form. + * + * @return array + * The renderable form array representing the entire configuration form. + * + * @see \Drupal\views\Plugin\Block\ViewsBlock::blockForm() + */ + public function blockForm(ViewsBlock $block, array &$form, FormStateInterface $form_state) { + $allow_settings = array_filter($this->getOption('allow')); + + $block_configuration = $block->getConfiguration(); + + foreach ($allow_settings as $type => $enabled) { + if (empty($enabled)) { + continue; + } + switch ($type) { + case 'items_per_page': + $form['override']['items_per_page'] = [ + '#type' => 'select', + '#title' => $this->t('Items per block'), + '#options' => [ + 'none' => $this->t('@count (default setting)', ['@count' => $this->getPlugin('pager')->getItemsPerPage()]), + 5 => 5, + 10 => 10, + 20 => 20, + 40 => 40, + ], + '#default_value' => $block_configuration['items_per_page'], + ]; + break; + } + } + + return $form; + } + + /** + * Handles form validation for the views block configuration form. + * + * @param \Drupal\views\Plugin\Block\ViewsBlock $block + * The ViewsBlock plugin. + * @param array $form + * The form definition array for the block configuration form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The current state of the form. + * + * @see \Drupal\views\Plugin\Block\ViewsBlock::blockValidate() + */ + public function blockValidate(ViewsBlock $block, array $form, FormStateInterface $form_state) { + } + + /** + * Handles form submission for the views block configuration form. + * + * @param \Drupal\views\Plugin\Block\ViewsBlock $block + * The ViewsBlock plugin. + * @param array $form + * The form definition array for the full block configuration form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The current state of the form. + * + * @see \Drupal\views\Plugin\Block\ViewsBlock::blockSubmit() + */ + public function blockSubmit(ViewsBlock $block, $form, FormStateInterface $form_state) { + if ($items_per_page = $form_state->getValue(['override', 'items_per_page'])) { + $block->setConfigurationValue('items_per_page', $items_per_page); + } + $form_state->unsetValue(['override', 'items_per_page']); + } + + /** + * Allows to change the display settings right before executing the block. + * + * @param \Drupal\views\Plugin\Block\ViewsBlock $block + * The block plugin for views displays. + */ + public function preBlockBuild(ViewsBlock $block) { + $config = $block->getConfiguration(); + if ($config['items_per_page'] !== 'none') { + $this->view->setItemsPerPage($config['items_per_page']); + } + } + + /** + * Block views use exposed widgets only if AJAX is set. + */ + public function usesExposed() { + if ($this->ajaxEnabled()) { + return parent::usesExposed(); + } + return FALSE; + } + + /** + * {@inheritdoc} + */ + public function remove() { + parent::remove(); + + if ($this->entityManager->hasDefinition('block')) { + $plugin_id = 'views_block:' . $this->view->storage->id() . '-' . $this->display['id']; + foreach ($this->entityManager->getStorage('block')->loadByProperties(['plugin' => $plugin_id]) as $block) { + $block->delete(); + } + } + } + +}