diff --git a/config/schema/entity_print.schema.yml b/config/schema/entity_print.schema.yml index 2340dec..93ae6f5 100644 --- a/config/schema/entity_print.schema.yml +++ b/config/schema/entity_print.schema.yml @@ -113,11 +113,27 @@ entity_print_print_engine.tcpdfv1: # Add schema for our extra field settings. core.entity_view_display.*.*.*.third_party.entity_print: - type: sequence + type: mapping label: 'Schema for Entity Print third party settings' - sequence: - type: string - label: 'Entity print settings for each export type' + mapping: + links: + type: sequence + sequence: + type: entity_print.link.[%key] + enabled: + type: boolean + label: 'Entity print enabled' + +entity_print.link:*: + type: mapping + label: 'Schema for Entity Print third party settings for a single link' + mapping: + label: + type: string + label: 'Label for an entity print link' + view_mode: + type: string + label: 'View mode for an entity print link' action.configuration.entity_print_download_action: type: action_configuration_default diff --git a/entity_print.module b/entity_print.module index 39c2b42..1b6c867 100644 --- a/entity_print.module +++ b/entity_print.module @@ -74,16 +74,20 @@ function entity_print_entity_view_alter(array &$build, EntityInterface $entity, $access_manager = \Drupal::accessManager(); foreach ($export_types as $export_type => $definition) { $key = 'entity_print_view_' . $export_type; + $default_settings = entity_print_default_link_settings($definition['label']); + $export_type_settings = $display->getThirdPartySetting('entity_print', 'links:' . $export_type, $default_settings); + if ($component = $display->getComponent($key)) { $route_params = [ 'entity_type' => $entity->getEntityTypeId(), 'entity_id' => $entity->id(), 'export_type' => trim($export_type, '_engine'), + 'view_mode' => $export_type_settings['view_mode'] ]; $build[$key] = [ '#type' => 'print_link', - '#title' => $display->getThirdPartySetting('entity_print', $export_type . '_label', t('View @label', ['@label' => $definition['label']])), + '#title' => $export_type_settings['label'], '#export_type' => $export_type, '#url' => Url::fromRoute('entity_print.view', $route_params), '#weight' => $component['weight'] ?? 0, @@ -101,14 +105,46 @@ function entity_print_form_entity_view_display_edit_form_alter(&$form, FormState $display = $form_state->getFormObject()->getEntity(); $export_types = \Drupal::service('plugin.manager.entity_print.export_type')->getDefinitions(); + $entity_type_id = $display->getTargetEntityTypeId(); + $bundle = $display->getTargetBundle(); + + /** @var \Drupal\Core\Entity\EntityDisplayRepository $entity_display_repository */ + $entity_display_repository = \Drupal::service('entity_display.repository'); + $entity_view_modes = \Drupal::service('entity_display.repository')->getViewModes($entity_type_id); + $view_modes = []; + foreach ($entity_view_modes as $key => $value) { + $entity_display = $entity_display_repository->getViewDisplay($entity_type_id, $bundle, $key); + $entity_display_enabled = $entity_display->getThirdPartySetting('entity_print', 'enabled'); + if ($entity_display_enabled) { + $view_modes[$key] = $value['label']; + } + } + foreach ($export_types as $export_type => $definition) { + $default_settings = entity_print_default_link_settings($definition['label']); + + $export_type_settings = $display->getThirdPartySetting('entity_print', 'links:' . $export_type, $default_settings); $form['fields']['entity_print_view_' . $export_type]['empty_cell'] = [ - '#type' => 'textfield', - '#title' => '', - '#default_value' => $display->getThirdPartySetting('entity_print', $export_type . '_label', t('View @label', ['@label' => $definition['label']])), + [ + '#type' => 'textfield', + '#title' => 'Link label', + '#default_value' => $export_type_settings['label'], + ], + [ + '#title' => 'View mode', + '#type' => 'select', + '#default_value' => $export_type_settings['view_mode'], + '#options' => $view_modes, + ], ]; } + $form['entity_print'] = [ + '#type' => 'checkbox', + '#title' => t('Enable entity print for this view mode'), + '#default_value' => $display->getThirdPartySetting('entity_print', 'enabled') ?? 0, + ]; + $form['#validate'][] = 'entity_print_form_entity_view_display_edit_form_validate'; $form['actions']['submit']['#submit'][] = 'entity_print_form_entity_view_display_edit_form_submit'; } @@ -136,14 +172,33 @@ function entity_print_form_entity_view_display_edit_form_submit(&$form, FormStat $display = $form_state->getFormObject()->getEntity(); $export_types = \Drupal::service('plugin.manager.entity_print.export_type')->getDefinitions(); + + $enabled = (bool) $form_state->getValue('entity_print'); + $display->setThirdPartySetting('entity_print', 'enabled', $enabled); + foreach ($export_types as $export_type => $definition) { $key = 'entity_print_view_' . $export_type; // If we've enabled the entity_print_view field then save the label for // rendering later. if ($display->getComponent($key)) { - $value = $form_state->getValue(['fields', $key])['empty_cell']; - $display->setThirdPartySetting('entity_print', $export_type . '_label', $value); + $value_label = $form_state->getValue(['fields', $key])['empty_cell'][0]; + $value_view_mode = $form_state->getValue(['fields', $key])['empty_cell'][1]; + $link = [ + 'label' => $value_label, + 'view_mode' => $value_view_mode, + ]; + $display->setThirdPartySetting('entity_print', 'links:' . $export_type, $link); } } $display->save(); } + +/** + * Returns the default entity print link settings + */ +function entity_print_default_link_settings($label) { + return [ + 'label' => t('View @label', ['@label' => $label]), + 'view_mode' => 'pdf', + ]; +} diff --git a/entity_print.routing.yml b/entity_print.routing.yml index a3ec50f..b567b39 100644 --- a/entity_print.routing.yml +++ b/entity_print.routing.yml @@ -15,15 +15,16 @@ entity_print.view.legacy_debug: _custom_access: '\Drupal\entity_print\Controller\EntityPrintController::checkAccess' entity_print.view: - path: 'print/{export_type}/{entity_type}/{entity_id}' + path: 'print/{export_type}/{entity_type}/{entity_id}/{view_mode}' defaults: _controller: '\Drupal\entity_print\Controller\EntityPrintController::viewPrint' _title: 'Entity Print' + view_mode: 'pdf' requirements: _custom_access: '\Drupal\entity_print\Controller\EntityPrintController::checkAccess' entity_print.view.debug: - path: 'print/{export_type}/{entity_type}/{entity_id}/debug' + path: 'print/{export_type}/{entity_type}/{entity_id}/{view_mode}/debug' defaults: _controller: '\Drupal\entity_print\Controller\EntityPrintController::viewPrintDebug' _title: 'Entity Print Debug' diff --git a/modules/entity_print_views/src/Renderer/ViewRenderer.php b/modules/entity_print_views/src/Renderer/ViewRenderer.php index 1e214cd..c79e70a 100644 --- a/modules/entity_print_views/src/Renderer/ViewRenderer.php +++ b/modules/entity_print_views/src/Renderer/ViewRenderer.php @@ -28,8 +28,8 @@ class ViewRenderer extends RendererBase implements TrustedCallbackInterface { /** * {@inheritdoc} */ - public function render(array $views) { - return array_map([$this, 'renderSingle'], $views); + public function render(array $entities, $custom_view_mode = 'pdf') { + return array_map([$this, 'renderSingle'], $entities); } /** diff --git a/src/Controller/EntityPrintController.php b/src/Controller/EntityPrintController.php index 9bfdeb3..cae01a5 100644 --- a/src/Controller/EntityPrintController.php +++ b/src/Controller/EntityPrintController.php @@ -76,19 +76,21 @@ class EntityPrintController extends ControllerBase { * The entity type. * @param int $entity_id * The entity id. + * @param string $view_mode + * View mode to render. * * @return \Symfony\Component\HttpFoundation\Response * The response object on error otherwise the Print is sent. */ - public function viewPrint($export_type, $entity_type, $entity_id) { + public function viewPrint($export_type, $entity_type, $entity_id, $view_mode = 'pdf') { // Create the Print engine plugin. $config = $this->config('entity_print.settings'); $entity = $this->entityTypeManager->getStorage($entity_type)->load($entity_id); $print_engine = $this->pluginManager->createSelectedInstance($export_type); - return (new StreamedResponse(function () use ($entity, $print_engine, $config) { + return (new StreamedResponse(function () use ($entity, $print_engine, $config, $view_mode) { // The Print is sent straight to the browser. - $this->printBuilder->deliverPrintable([$entity], $print_engine, $config->get('force_download'), $config->get('default_css')); + $this->printBuilder->deliverPrintable([$entity], $print_engine, $config->get('force_download'), $config->get('default_css'), $view_mode); }))->send(); } @@ -101,16 +103,18 @@ class EntityPrintController extends ControllerBase { * The entity type. * @param int $entity_id * The entity id. + * @param string $view_mode + * The view mode. * * @return \Symfony\Component\HttpFoundation\Response * The response object. * * @todo improve permissions in https://www.drupal.org/node/2759553 */ - public function viewPrintDebug($export_type, $entity_type, $entity_id) { + public function viewPrintDebug($export_type, $entity_type, $entity_id, $view_mode = 'pdf') { $entity = $this->entityTypeManager->getStorage($entity_type)->load($entity_id); $use_default_css = $this->config('entity_print.settings')->get('default_css'); - return new Response($this->printBuilder->printHtml($entity, $use_default_css, FALSE)); + return new Response($this->printBuilder->printHtml($entity, $use_default_css, FALSE, $view_mode)); } /** diff --git a/src/Plugin/Action/PrintDownload.php b/src/Plugin/Action/PrintDownload.php index 8fd1df5..386b9fb 100644 --- a/src/Plugin/Action/PrintDownload.php +++ b/src/Plugin/Action/PrintDownload.php @@ -117,7 +117,7 @@ class PrintDownload extends ConfigurableActionBase implements ContainerFactoryPl public function executeMultiple(array $entities) { try { (new StreamedResponse(function () use ($entities) { - $this->printBuilder->deliverPrintable($entities, $this->entityPrintPluginManager->createSelectedInstance($this->configuration['export_type']), TRUE); + $this->printBuilder->deliverPrintable($entities, $this->entityPrintPluginManager->createSelectedInstance($this->configuration['export_type'], $this->configuration['view_mode']), TRUE, FALSE, $this->configuration['view_mode']); }))->send(); } catch (PrintEngineException $e) { diff --git a/src/Plugin/EntityPrintPluginManager.php b/src/Plugin/EntityPrintPluginManager.php index dba2754..7922d85 100644 --- a/src/Plugin/EntityPrintPluginManager.php +++ b/src/Plugin/EntityPrintPluginManager.php @@ -74,8 +74,8 @@ class EntityPrintPluginManager extends DefaultPluginManager implements EntityPri /** * {@inheritdoc} */ - public function createInstance($plugin_id, array $configuration = []) { - $configuration = array_merge($this->getPrintEngineSettings($plugin_id), $configuration); + public function createInstance($plugin_id, array $configuration = [], $view_mode = 'pdf') { + $configuration = array_merge($this->getPrintEngineSettings($plugin_id, $view_mode), $configuration); /** @var \Drupal\entity_print\Plugin\PrintEngineInterface $class */ $definition = $this->getDefinition($plugin_id); @@ -93,7 +93,7 @@ class EntityPrintPluginManager extends DefaultPluginManager implements EntityPri /** * {@inheritdoc} */ - public function createSelectedInstance($export_type) { + public function createSelectedInstance($export_type, $view_mode = 'pdf') { $config = $this->configFactory->get('entity_print.settings'); $config_engine = 'print_engines.' . $export_type . '_engine'; $plugin_id = $config->get($config_engine); @@ -102,7 +102,7 @@ class EntityPrintPluginManager extends DefaultPluginManager implements EntityPri throw new PrintEngineException(sprintf('Please configure a %s print engine.', $export_type)); } - return $this->createInstance($plugin_id); + return $this->createInstance($plugin_id, [], $view_mode); } /** @@ -147,11 +147,13 @@ class EntityPrintPluginManager extends DefaultPluginManager implements EntityPri * * @param string $plugin_id * The plugin id. + * @param string $view_mode + * View mode to render. * * @return array * An array of Print engine settings for this plugin. */ - protected function getPrintEngineSettings($plugin_id) { + protected function getPrintEngineSettings($plugin_id, $view_mode = 'pdf') { /** @var \Drupal\entity_print\Entity\PrintEngineStorageInterface $storage */ $storage = $this->entityTypeManager->getStorage('print_engine'); if (!$entity = $storage->load($plugin_id)) { @@ -161,6 +163,7 @@ class EntityPrintPluginManager extends DefaultPluginManager implements EntityPri $event = new GenericEvent(PrintEvents::CONFIGURATION_ALTER, [ 'configuration' => $configuration, 'config' => $entity, + 'view_mode' => $view_mode, ]); $this->dispatcher->dispatch($event, PrintEvents::CONFIGURATION_ALTER); $configuration = $event->getArgument('configuration'); diff --git a/src/Plugin/EntityPrintPluginManagerInterface.php b/src/Plugin/EntityPrintPluginManagerInterface.php index 96df907..72f66ac 100644 --- a/src/Plugin/EntityPrintPluginManagerInterface.php +++ b/src/Plugin/EntityPrintPluginManagerInterface.php @@ -14,11 +14,13 @@ interface EntityPrintPluginManagerInterface extends PluginManagerInterface { * * @param string $export_type * The export type plugin id. + * @param string $view_mode + * View mode to render. * * @return \Drupal\entity_print\Plugin\PrintEngineInterface * The loaded print engine. */ - public function createSelectedInstance($export_type); + public function createSelectedInstance($export_type, $view_mode = 'pdf'); /** * Checks if a plugin is enabled based on its dependencies. diff --git a/src/PrintBuilder.php b/src/PrintBuilder.php index 6e0b172..92ba194 100644 --- a/src/PrintBuilder.php +++ b/src/PrintBuilder.php @@ -52,8 +52,8 @@ class PrintBuilder implements PrintBuilderInterface { /** * {@inheritdoc} */ - public function deliverPrintable(array $entities, PrintEngineInterface $print_engine, $force_download = FALSE, $use_default_css = TRUE) { - $renderer = $this->prepareRenderer($entities, $print_engine, $use_default_css); + public function deliverPrintable(array $entities, PrintEngineInterface $print_engine, $force_download = FALSE, $use_default_css = TRUE, $view_mode = 'pdf') { + $renderer = $this->prepareRenderer($entities, $print_engine, $use_default_css, $view_mode); // Allow other modules to alter the generated Print object. $this->dispatcher->dispatch(new PreSendPrintEvent($print_engine, $entities), PrintEvents::PRE_SEND); @@ -67,9 +67,9 @@ class PrintBuilder implements PrintBuilderInterface { /** * {@inheritdoc} */ - public function printHtml(EntityInterface $entity, $use_default_css = TRUE, $optimize_css = TRUE) { + public function printHtml(EntityInterface $entity, $use_default_css = TRUE, $optimize_css = TRUE, $view_mode = 'pdf') { $renderer = $this->rendererFactory->create([$entity]); - $content[] = $renderer->render([$entity]); + $content[] = $renderer->render([$entity], $view_mode); $render = [ '#theme' => 'entity_print__' . $entity->getEntityTypeId() . '__' . $entity->bundle(), @@ -77,14 +77,14 @@ class PrintBuilder implements PrintBuilderInterface { '#content' => $content, '#attached' => [], ]; - return $renderer->generateHtml([$entity], $render, $use_default_css, $optimize_css); + return $renderer->generateHtml([$entity], $render, $use_default_css, $optimize_css, $view_mode); } /** * {@inheritdoc} */ - public function savePrintable(array $entities, PrintEngineInterface $print_engine, $scheme = 'public', $filename = FALSE, $use_default_css = TRUE) { - $renderer = $this->prepareRenderer($entities, $print_engine, $use_default_css); + public function savePrintable(array $entities, PrintEngineInterface $print_engine, $scheme = 'public', $filename = FALSE, $use_default_css = TRUE, $custom_view_mode = 'pdf') { + $renderer = $this->prepareRenderer($entities, $print_engine, $use_default_css, $custom_view_mode); // Allow other modules to alter the generated Print object. $this->dispatcher->dispatch(new PreSendPrintEvent($print_engine, $entities), PrintEvents::PRE_SEND); @@ -109,17 +109,19 @@ class PrintBuilder implements PrintBuilderInterface { * The print engine. * @param bool $use_default_css * TRUE if we want the default CSS included. + * @param string $custom_view_mode + * View mode to render. * * @return \Drupal\entity_print\Renderer\RendererInterface * A print renderer. */ - protected function prepareRenderer(array $entities, PrintEngineInterface $print_engine, $use_default_css) { + protected function prepareRenderer(array $entities, PrintEngineInterface $print_engine, $use_default_css, $custom_view_mode = 'pdf') { if (empty($entities)) { throw new \InvalidArgumentException('You must pass at least 1 entity'); } $renderer = $this->rendererFactory->create($entities); - $content = $renderer->render($entities); + $content = $renderer->render($entities, $custom_view_mode); $first_entity = reset($entities); $render = [ @@ -129,7 +131,7 @@ class PrintBuilder implements PrintBuilderInterface { '#attached' => [], ]; - $print_engine->addPage($renderer->generateHtml($entities, $render, $use_default_css, TRUE)); + $print_engine->addPage($renderer->generateHtml($entities, $render, $use_default_css, TRUE, $custom_view_mode)); return $renderer; } diff --git a/src/PrintBuilderInterface.php b/src/PrintBuilderInterface.php index fae2bef..4527f1b 100644 --- a/src/PrintBuilderInterface.php +++ b/src/PrintBuilderInterface.php @@ -21,11 +21,13 @@ interface PrintBuilderInterface { * (optional) TRUE to try and force the document download. * @param bool $use_default_css * (optional) TRUE if you want the default CSS included, otherwise FALSE. + * @param string $view_mode + * (optional) The view mode. * * @return string * FALSE or the Print content will be sent to the browser. */ - public function deliverPrintable(array $entities, PrintEngineInterface $print_engine, $force_download = FALSE, $use_default_css = TRUE); + public function deliverPrintable(array $entities, PrintEngineInterface $print_engine, $force_download = FALSE, $use_default_css = TRUE, $view_mode = 'pdf'); /** * Get a HTML version of the entity as used for the Print rendering. @@ -36,11 +38,13 @@ interface PrintBuilderInterface { * TRUE if you want the default CSS included, otherwise FALSE. * @param bool $optimize_css * TRUE if you the CSS should be compressed otherwise FALSE. + * @param string $view_mode + * (optional) name of view mode to render. * * @return string * The rendered HTML for the entity, the same as what is used for the Print. */ - public function printHtml(EntityInterface $entity, $use_default_css = TRUE, $optimize_css = TRUE); + public function printHtml(EntityInterface $entity, $use_default_css = TRUE, $optimize_css = TRUE, $view_mode = 'pdf'); /** * Render any content entity as a printed document and save to disk. @@ -61,10 +65,12 @@ interface PrintBuilderInterface { * (optional) The filename or empty to have one generated. * @param bool $use_default_css * (optional) TRUE if you want the default CSS included, otherwise FALSE. + * @param string $custom_view_mode + * (optional) name of view mode to render. * * @return string * FALSE or the URI to the file. E.g. public://my-file.pdf. */ - public function savePrintable(array $entities, PrintEngineInterface $print_engine, $scheme = 'public', $filename = '', $use_default_css = TRUE); + public function savePrintable(array $entities, PrintEngineInterface $print_engine, $scheme = 'public', $filename = '', $use_default_css = TRUE, $custom_view_mode = 'pdf'); } diff --git a/src/Renderer/ContentEntityRenderer.php b/src/Renderer/ContentEntityRenderer.php index 4ac83e8..121e617 100644 --- a/src/Renderer/ContentEntityRenderer.php +++ b/src/Renderer/ContentEntityRenderer.php @@ -58,11 +58,11 @@ class ContentEntityRenderer extends RendererBase { /** * {@inheritdoc} */ - public function render(array $entities) { + public function render(array $entities, $custom_view_mode = 'pdf') { $build = []; foreach ($entities as $entity) { $render_controller = $this->entityTypeManager->getViewBuilder($entity->getEntityTypeId()); - $build[] = $render_controller->view($entity, $this->getViewMode($entity)); + $build[] = $render_controller->view($entity, $this->getViewMode($entity, $custom_view_mode)); } return $build; } @@ -72,14 +72,16 @@ class ContentEntityRenderer extends RendererBase { * * @param \Drupal\Core\Entity\EntityInterface $entity * The content entity we're viewing. + * @param string $custom_view_mode + * (optional) name of view mode to render. * * @return string * The view mode machine name. */ - protected function getViewMode(EntityInterface $entity) { + protected function getViewMode(EntityInterface $entity, $custom_view_mode = 'pdf') { // We check to see if the PDF view display have been configured, if not // then we simply fall back to the full display. - $view_mode = 'pdf'; + $view_mode = $custom_view_mode; if (!$this->entityTypeManager->getStorage('entity_view_display')->load($entity->getEntityTypeId() . '.' . $entity->bundle() . '.' . $view_mode)) { $view_mode = 'full'; } diff --git a/src/Renderer/RendererBase.php b/src/Renderer/RendererBase.php index 568786a..1c3095f 100644 --- a/src/Renderer/RendererBase.php +++ b/src/Renderer/RendererBase.php @@ -80,8 +80,8 @@ abstract class RendererBase implements RendererInterface, EntityHandlerInterface /** * {@inheritdoc} */ - public function generateHtml(array $entities, array $render, $use_default_css, $optimize_css) { - $rendered_css = $this->assetRenderer->render($entities, $use_default_css, $optimize_css); + public function generateHtml(array $entities, array $render, $use_default_css, $optimize_css, $view_mode = 'pdf') { + $rendered_css = $this->assetRenderer->render($entities, $use_default_css, $optimize_css, $view_mode); $render['#entity_print_css'] = $this->renderer->executeInRenderContext(new RenderContext(), function () use (&$rendered_css) { return $this->renderer->render($rendered_css); }); diff --git a/src/Renderer/RendererInterface.php b/src/Renderer/RendererInterface.php index a25f48b..1feb9d4 100644 --- a/src/Renderer/RendererInterface.php +++ b/src/Renderer/RendererInterface.php @@ -12,11 +12,13 @@ interface RendererInterface { * * @param \Drupal\Core\Entity\EntityInterface[] $entities * The entities we're rendering. + * @param string $custom_view_mode + * (optional) name of view mode to render. * * @return array * The renderable array for the entity. */ - public function render(array $entities); + public function render(array $entities, $custom_view_mode = 'pdf'); /** * Generates the HTML from the renderable array of entities. @@ -29,11 +31,13 @@ interface RendererInterface { * TRUE if we should inject our default CSS otherwise FALSE. * @param bool $optimize_css * TRUE if we should compress the CSS otherwise FALSE. + * @param string $view_mode + * (optional) name of view mode to render. * * @return string * The generated HTML. */ - public function generateHtml(array $entities, array $render, $use_default_css, $optimize_css); + public function generateHtml(array $entities, array $render, $use_default_css, $optimize_css, $view_mode = 'pdf'); /** * Get the filename for the entity we're printing *without* the extension.