View source
<?php
namespace Drupal\content_browser\Plugin\Block;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\SubformStateInterface;
use Drupal\node\Entity\Node;
class ContentEmbedBlock extends BlockBase {
const RECURSIVE_RENDER_LIMIT = 2;
protected static $recursiveRenderDepth = [];
public function defaultConfiguration() {
return [
'view_mode' => '',
'nids' => [],
'uuids' => [],
];
}
public function blockForm($form, FormStateInterface $form_state) {
if ($form_state instanceof SubformStateInterface) {
$form_state = $form_state
->getCompleteFormState();
}
$entities = $form_state
->getValue([
'settings',
'selection',
'nids',
'entities',
], []);
$nids = [];
foreach ($entities as $entity) {
$nids[] = $entity
->id();
}
if (empty($nids)) {
$nids = $this
->getDefaultNids();
}
$form['selection'] = $this
->browserForm($nids);
$entity_display_repository = \Drupal::service('entity_display.repository');
$view_mode_options = $entity_display_repository
->getViewModeOptions('node');
$form['view_mode'] = [
'#type' => 'select',
'#options' => $view_mode_options,
'#title' => t('View mode'),
'#default_value' => $this->configuration['view_mode'],
];
return $form;
}
public function browserForm(array $nids) {
$selection = [
'#type' => 'container',
'#attributes' => [
'id' => 'content-embed-block-browser',
],
];
$selection['nids'] = [
'#type' => 'entity_browser',
'#entity_browser' => 'browse_content',
'#entity_browser_validators' => [
'entity_type' => [
'type' => 'node',
],
],
'#process' => [
[
'\\Drupal\\entity_browser\\Element\\EntityBrowserElement',
'processEntityBrowser',
],
[
get_called_class(),
'processEntityBrowser',
],
],
];
$order_class = 'content-embed-block-delta-order';
$selection['table'] = [
'#type' => 'table',
'#header' => [
t('Title'),
t('Type'),
t('Order', [], [
'context' => 'Sort order',
]),
],
'#empty' => t('No content yet'),
'#tabledrag' => [
[
'action' => 'order',
'relationship' => 'sibling',
'group' => $order_class,
],
],
];
$delta = 0;
$bundle_info = \Drupal::service('entity_type.bundle.info')
->getBundleInfo('node');
foreach ($nids as $nid) {
$node = Node::load($nid);
$selection['table'][$nid] = [
'#attributes' => [
'class' => [
'draggable',
],
'data-entity-id' => $node
->getEntityTypeId() . ':' . $nid,
],
'title' => [
'#markup' => $node
->label(),
],
'type' => [
'#markup' => $bundle_info[$node
->bundle()]['label'],
],
'_weight' => [
'#type' => 'weight',
'#title' => t('Weight for row @number', [
'@number' => $delta + 1,
]),
'#title_display' => 'invisible',
'#delta' => count($nids),
'#default_value' => $delta,
'#attributes' => [
'class' => [
$order_class,
],
],
],
];
$delta++;
}
return $selection;
}
public static function updateCallback(array &$form, FormStateInterface $form_state) {
$trigger = $form_state
->getTriggeringElement();
$parents = array_slice($trigger['#array_parents'], 0, -2);
$selection = NestedArray::getValue($form, $parents);
return $selection;
}
public static function processEntityBrowser(&$element, FormStateInterface $form_state, &$complete_form) {
$element['entity_ids']['#ajax'] = [
'callback' => [
get_called_class(),
'updateCallback',
],
'wrapper' => 'content-embed-block-browser',
'event' => 'entity_browser_value_updated',
];
return $element;
}
public function blockSubmit($form, FormStateInterface $form_state) {
$this->configuration['nids'] = [];
$this->configuration['uuids'] = [];
foreach ($form_state
->getValue([
'selection',
'table',
], []) as $nid => $settings) {
$this->configuration['nids'][] = $nid;
}
$this->configuration['view_mode'] = $form_state
->getValue('view_mode');
}
public function build() {
$build = [];
$view_builder = \Drupal::entityTypeManager()
->getViewBuilder('node');
foreach ($this
->getDefaultNids() as $nid) {
$node = Node::load($nid);
if ($node && $node
->access('view')) {
if (isset(static::$recursiveRenderDepth[$nid])) {
static::$recursiveRenderDepth[$nid]++;
}
else {
static::$recursiveRenderDepth[$nid] = 1;
}
if (static::$recursiveRenderDepth[$nid] > static::RECURSIVE_RENDER_LIMIT) {
return $build;
}
$build[] = $view_builder
->view($node, $this->configuration['view_mode']);
}
}
return $build;
}
protected function getDefaultNids() {
if (!empty($this->configuration['uuids'])) {
$nids = \Drupal::entityQuery('node')
->condition('uuid', $this->configuration['uuids'], 'IN')
->execute();
}
else {
$nids = [];
}
$nids += $this->configuration['nids'];
return $nids;
}
}