/** * @covers ::build */ public function testBuild() { $regions = array(); $block = $this->prophesize(BlockPluginInterface::class); $block->access(Argument::type(AccountInterface::class))->willReturn(TRUE); $block->getConfiguration()->willReturn([]); $block->getPluginId()->willReturn('foo'); $block->getBaseId()->willReturn('foo'); $block->getDerivativeId()->willReturn('foo'); $block->build()->willReturn(['#markup' => 'Foo!']); $regions['content']['foo'] = $block->reveal(); $block = $this->prophesize(BlockPluginInterface::class); $block->access(Argument::type(AccountInterface::class))->willReturn(TRUE); $block->getConfiguration()->willReturn([]); $block->getPluginId()->willReturn('bar'); $block->getBaseId()->willReturn('bar'); $block->getDerivativeId()->willReturn('bar'); $block->build()->willReturn(['#markup' => 'Bar...']); $regions['sidebar']['bar'] = $block->reveal(); $block = $this->prophesize(BlockPluginInterface::class); $block->access(Argument::type(AccountInterface::class))->willReturn(FALSE); $regions['sidebar']['baz'] = $block->reveal(); $regions['footer'] = array(); $build = $this->builder->build($regions, array()); // Ensure that regions get the proper prefix and suffix. $this->assertEquals('<div class="block-region-content">', $build['content']['#prefix']); $this->assertEquals('</div>', $build['content']['#suffix']); // Ensure that blocks which allowed access showed up... $this->assertEquals('Foo!', $build['content']['foo']['content']['#markup']); $this->assertEquals('Bar...', $build['sidebar']['bar']['content']['#markup']); // ...and that blocks which disallowed access did not. $this->assertArrayNotHasKey('baz', $build['sidebar']); // Ensure that empty regions don't show up in $build. $this->assertArrayNotHasKey('footer', $build); }
/** * {@inheritdoc} */ public function build(PanelsDisplayVariant $panels_display) { // Check to see if the current user has permissions to use the IPE. $has_permission = $this->account->hasPermission('access panels in-place editing'); // Attach the Panels In-place editor library based on permissions. if ($has_permission) { // This flag tracks whether or not there are unsaved changes. $unsaved = FALSE; // If a temporary configuration for this variant exists, use it. $temp_store_key = $panels_display->id(); if ($variant_config = $this->tempStore->get($temp_store_key)) { unset($variant_config['id']); $panels_display->setConfiguration($variant_config); // Indicate that the user is viewing un-saved changes. $unsaved = TRUE; } $build = parent::build($panels_display); $regions = $panels_display->getRegionAssignments(); $layout = $panels_display->getLayout(); foreach ($regions as $region => $blocks) { // Wrap each region with a unique class and data attribute. $region_name = Html::getClass("block-region-{$region}"); $build[$region]['#prefix'] = '<div class="' . $region_name . '" data-region-name="' . $region . '">'; $build[$region]['#suffix'] = '</div>'; if ($blocks) { foreach ($blocks as $block_id => $block) { $build[$region][$block_id]['#attributes']['data-block-id'] = $block_id; } } } // Attach the required settings and IPE. $build['#attached']['library'][] = 'panels_ipe/panels_ipe'; $build['#attached']['drupalSettings']['panels_ipe'] = $this->getDrupalSettings($regions, $layout, $panels_display, $unsaved); // Add our custom elements to the build. $build['#prefix'] = '<div id="panels-ipe-content">'; $build['#suffix'] = '</div><div id="panels-ipe-tray"></div>'; } else { $build = parent::build($panels_display); } return $build; }
/** * {@inheritdoc} */ public function build(array $regions, array $contexts, LayoutInterface $layout = NULL) { // Load our PageVariant. /** @var \Drupal\page_manager\PageVariantInterface $page_variant */ $page_variant = \Drupal::request()->attributes->get('page_manager_page_variant'); // Check to see if the current user has permissions to use the IPE. $has_permission = $this->account->hasPermission('access panels in-place editing'); // Attach the Panels In-place editor library based on permissions. if ($page_variant && $has_permission) { // This flag tracks whether or not there are unsaved changes. $unsaved = FALSE; // If a temporary configuration for this variant exists, use it. $temp_store_key = 'variant.' . $page_variant->id(); if ($variant_config = $this->tempStore->get($temp_store_key)) { // Reload the PageVariant. This is required to set variant plugin // configuration correctly. $page_variant = PageVariant::load($page_variant->id()); /** @var \Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant $variant_plugin */ $variant_plugin = $page_variant->getVariantPlugin(); $variant_plugin->setConfiguration($variant_config); // Override our initial values with what's in TempStore. $layout = $variant_plugin->getLayout(); $regions = $variant_plugin->getRegionAssignments(); // Indicate that the user is viewing un-saved changes. $unsaved = TRUE; } $build = parent::build($regions, $contexts, $layout); foreach ($regions as $region => $blocks) { // Wrap each region with a unique class and data attribute. $region_name = Html::getClass("block-region-{$region}"); $build[$region]['#prefix'] = '<div class="' . $region_name . '" data-region-name="' . $region . '">'; $build[$region]['#suffix'] = '</div>'; if ($blocks) { foreach ($blocks as $block_id => $block) { $build[$region][$block_id]['#attributes']['data-block-id'] = $block_id; } } } // Attach the required settings and IPE. $build['#attached']['library'][] = 'panels_ipe/panels_ipe'; $build['#attached']['drupalSettings']['panels_ipe'] = $this->getDrupalSettings($regions, $layout, $page_variant); // Add our custom elements to the build. $build['#prefix'] = '<div id="panels-ipe-content">'; // Indicate if the current user is viewing temp store. $tray_classes = $unsaved ? 'unsaved' : ''; $build['#suffix'] = '</div><div id="panels-ipe-tray" class="' . $tray_classes . '"></div>'; } else { $build = parent::build($regions, $contexts, $layout); } return $build; }