ParagraphsPreviewController.php in Paragraphs Previewer 8
File
src/Controller/ParagraphsPreviewController.php
View source
<?php
namespace Drupal\paragraphs_previewer\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Drupal\Core\Form\FormState;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\paragraphs\Entity\Paragraph;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\ContentEntityBase;
class ParagraphsPreviewController extends ControllerBase {
public function onForm($form_build_id, $element_parents) {
if (empty($form_build_id) || empty($element_parents)) {
throw new AccessDeniedHttpException();
}
$output_render = [];
$element_parents_array = is_array($element_parents) ? $element_parents : explode(':', $element_parents);
if (!empty($element_parents_array) && count($element_parents_array) >= 2) {
$form_state = new FormState();
$form = \Drupal::formBuilder()
->getCache($form_build_id, $form_state);
if ($form && ($form_entity = $form_state
->getFormObject()
->getEntity())) {
$field_parents = $element_parents_array;
$field_delta = array_pop($field_parents);
$field_name = array_pop($field_parents);
$widget_state = WidgetBase::getWidgetState($field_parents, $field_name, $form_state);
if (!empty($widget_state['paragraphs'][$field_delta]['entity'])) {
$paragraph = $widget_state['paragraphs'][$field_delta]['entity'];
$parent_entity = $this
->findParentEntity($paragraph, $field_parents, $form_state, $form_entity);
if ($parent_entity) {
$field_render = $this
->paragraphsPreviewRenderParentField($paragraph, $field_name, $parent_entity);
if ($field_render) {
$output_render['preview'] = $field_render;
}
}
}
}
}
if (empty($output_render)) {
$output_render['empty'] = [
'#markup' => $this
->t('No preview available.'),
];
}
$output_render['#attached']['library'][] = 'paragraphs_previewer/preview-page';
return $output_render;
}
public function findParentEntity(Paragraph $paragraph, array $field_parents, FormStateInterface $form_state, EntityInterface $form_entity = NULL) {
if (in_array('subform', $field_parents, TRUE)) {
foreach (array_reverse($field_parents, TRUE) as $i => $element_key) {
if ($element_key === 'subform') {
$parent_field_parents = array_slice($field_parents, 0, $i);
if ($parent_field_parents) {
$parent_field_delta = array_pop($parent_field_parents);
$parent_field_name = array_pop($parent_field_parents);
$widget_state = WidgetBase::getWidgetState($parent_field_parents, $parent_field_name, $form_state);
if (!empty($widget_state['paragraphs'][$parent_field_delta]['entity'])) {
return $widget_state['paragraphs'][$parent_field_delta]['entity'];
}
}
break;
}
}
}
return $form_entity;
}
public function paragraphsPreviewRenderParentField(Paragraph $paragraph, $parent_field_name, ContentEntityBase $parent_entity = NULL) {
if (!isset($parent_entity)) {
$parent_entity = $paragraph
->getParentEntity();
}
if ($parent_entity && $parent_entity instanceof ContentEntityBase) {
$parent_class = get_class($parent_entity);
$parent_entity_type = $parent_entity
->getEntityTypeId();
if ($parent_entity
->hasField($parent_field_name)) {
$parent_view_mode = \Drupal::config('paragraphs_previewer.settings')
->get('previewer_view_mode');
$parent_view_mode = $parent_view_mode ? $parent_view_mode : 'full';
$paragraph_clone = $paragraph
->createDuplicate();
$parent_clone = clone $parent_entity;
$parent_field_item_value = [
'entity' => $paragraph_clone,
];
$parent_clone->{$parent_field_name}
->setValue([
$parent_field_item_value,
]);
$elements = $parent_clone->{$parent_field_name}
->view($parent_view_mode);
$output = isset($elements[0]) ? $elements[0] : [];
if (isset($elements['#access'])) {
$output['#access'] = $elements['#access'];
}
return $output;
}
}
}
}