You are here

public function PhotosImageViewController::view in Album Photos 6.0.x

Same name and namespace in other branches
  1. 8.5 src/Controller/PhotosImageViewController.php \Drupal\photos\Controller\PhotosImageViewController::view()

Provides a page to render a single entity.

Parameters

\Drupal\Core\Entity\EntityInterface $_entity: The Entity to be rendered. Note this variable is named $_entity rather than $entity to prevent collisions with other named placeholders in the route.

string $view_mode: (optional) The view mode that should be used to display the entity. Defaults to 'full'.

Return value

array A render array as expected by \Drupal\Core\Render\RendererInterface::render().

Overrides EntityViewController::view

1 call to PhotosImageViewController::view()
PhotosLegacyImageViewController::view in src/Controller/PhotosLegacyImageViewController.php
Provides a page to render a single entity.
1 method overrides PhotosImageViewController::view()
PhotosLegacyImageViewController::view in src/Controller/PhotosLegacyImageViewController.php
Provides a page to render a single entity.

File

src/Controller/PhotosImageViewController.php, line 116

Class

PhotosImageViewController
Image view controller.

Namespace

Drupal\photos\Controller

Code

public function view(EntityInterface $photos_image, $view_mode = 'full', $langcode = NULL) {
  if (!$photos_image) {
    throw new NotFoundHttpException();
  }
  $build = parent::view($photos_image, $view_mode);

  /** @var \Drupal\photos\Entity\PhotosImage $photosImage */
  $photosImage = $photos_image;

  // Get config settings.
  // @todo inject config factory?
  $config = \Drupal::config('photos.settings');

  // Current destination.
  $destination = $this
    ->getDestinationArray();

  // Get album node.
  $node = $this->entityTypeManager
    ->getStorage('node')
    ->load($photos_image
    ->getAlbumId());
  switch ($view_mode) {
    case 'list':
      if ($photosImage
        ->access('edit')) {

        // Image edit link.
        $build['links']['edit'] = [
          '#type' => 'link',
          '#title' => 'Edit',
          '#url' => Url::fromRoute('entity.photos_image.edit_form', [
            'photos_image' => $photosImage
              ->id(),
          ], [
            'query' => [
              $destination,
            ],
            'attributes' => [
              'class' => [
                'colorbox-load',
                'photos-edit-edit',
              ],
            ],
          ]),
        ];

        // Set to album cover link.
        $build['links']['cover'] = [
          '#type' => 'link',
          '#title' => 'Set to Cover',
          '#url' => Url::fromRoute('photos.album.update.cover', [
            'node' => $photosImage
              ->getAlbumId(),
            'photos_image' => $photosImage
              ->id(),
          ], [
            'query' => [
              $destination,
            ],
          ]),
        ];
      }
      if ($photosImage
        ->access('delete')) {

        // Image delete link.
        // @todo cancel should go back to image. Confirm to album.
        $build['links']['delete'] = [
          '#type' => 'link',
          '#title' => 'Delete',
          '#url' => Url::fromRoute('entity.photos_image.delete_form', [
            'photos_image' => $photosImage
              ->id(),
          ], [
            'query' => [
              'destination' => 'node/' . $photosImage
                ->getAlbumId(),
            ],
            'attributes' => [
              'class' => [
                'colorbox-load',
                'photos-edit-delete',
              ],
            ],
          ]),
        ];
      }
      break;
    case 'full':

      // Image pager.
      $build['links']['pager'] = $photosImage
        ->getPager($photosImage
        ->getAlbumId(), 'album_id');
      if ($photosImage
        ->access('update')) {

        // Set image to album cover link.
        $build['links']['cover'] = [
          '#type' => 'link',
          '#title' => 'Set to Cover',
          '#url' => Url::fromRoute('photos.album.update.cover', [
            'node' => $photosImage
              ->getAlbumId(),
            'photos_image' => $photosImage
              ->id(),
          ], [
            'query' => [
              $destination,
            ],
          ]),
        ];
      }

      // Get comments.
      $renderCommentCount = [];
      if ($config
        ->get('photos_comment') && \Drupal::moduleHandler()
        ->moduleExists('comment')) {

        // Comment integration.
        $entities = [
          $photosImage
            ->id() => $photosImage,
        ];
        $stats = \Drupal::service('comment.statistics')
          ->read($entities, 'photos_image');
        if ($stats) {
          $comCount = 0;
          foreach ($stats as $commentStats) {
            $comCount = $comCount + $commentStats->comment_count;
          }
          $renderCommentCount = [
            '#markup' => $this
              ->formatPlural($comCount, "@count comment", "@count comments"),
          ];
        }
      }
      $build['links']['comment'] = $renderCommentCount;

      // Check count image views variable.
      $disableImageVisitCount = $config
        ->get('photos_image_count');
      if (!$disableImageVisitCount) {

        // @todo migrate to core statistics when it can handle other entities.
        // @see https://www.drupal.org/project/drupal/issues/2532334
        $build['#attached']['library'][] = 'photos/photos.statistics';
        $settings = [
          'data' => [
            'id' => $photosImage
              ->id(),
          ],
          'url' => Url::fromRoute('photos.statistics.update')
            ->toString(),
        ];
        $build['#attached']['drupalSettings']['photosStatistics'] = $settings;
      }

      // Attach default styling.
      // @see https://www.drupal.org/docs/8/theming/adding-stylesheets-css-and-javascript-js-to-a-drupal-8-theme#override-extend
      $build['#attached']['library'][] = 'photos/photos.default.style';
      break;
    default:
      break;
  }

  // Since this generates absolute URLs, it can only be cached "per site".
  $build['#cache']['contexts'][] = 'url.site';

  // Given this varies by $this->currentUser->isAuthenticated(), add a cache
  // context based on the anonymous role.
  $build['#cache']['contexts'][] = 'user.roles:anonymous';
  return $build;
}