function NodeController::revisionOverview

Same name in other branches
  1. 9 core/modules/node/src/Controller/NodeController.php \Drupal\node\Controller\NodeController::revisionOverview()
  2. 10 core/modules/node/src/Controller/NodeController.php \Drupal\node\Controller\NodeController::revisionOverview()
  3. 11.x core/modules/node/src/Controller/NodeController.php \Drupal\node\Controller\NodeController::revisionOverview()

Generates an overview table of older revisions of a node.

Parameters

\Drupal\node\NodeInterface $node: A node object.

Return value

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

1 string reference to 'NodeController::revisionOverview'
node.routing.yml in core/modules/node/node.routing.yml
core/modules/node/node.routing.yml

File

core/modules/node/src/Controller/NodeController.php, line 181

Class

NodeController
Returns responses for Node routes.

Namespace

Drupal\node\Controller

Code

public function revisionOverview(NodeInterface $node) {
    $account = $this->currentUser();
    $langcode = $node->language()
        ->getId();
    $langname = $node->language()
        ->getName();
    $languages = $node->getTranslationLanguages();
    $has_translations = count($languages) > 1;
    $node_storage = $this->entityTypeManager()
        ->getStorage('node');
    $type = $node->getType();
    $build['#title'] = $has_translations ? $this->t('@langname revisions for %title', [
        '@langname' => $langname,
        '%title' => $node->label(),
    ]) : $this->t('Revisions for %title', [
        '%title' => $node->label(),
    ]);
    $header = [
        $this->t('Revision'),
        $this->t('Operations'),
    ];
    $revert_permission = ($account->hasPermission("revert {$type} revisions") || $account->hasPermission('revert all revisions') || $account->hasPermission('administer nodes')) && $node->access('update');
    $delete_permission = ($account->hasPermission("delete {$type} revisions") || $account->hasPermission('delete all revisions') || $account->hasPermission('administer nodes')) && $node->access('delete');
    $rows = [];
    $default_revision = $node->getRevisionId();
    $current_revision_displayed = FALSE;
    foreach ($this->getRevisionIds($node, $node_storage) as $vid) {
        
        /** @var \Drupal\node\NodeInterface $revision */
        $revision = $node_storage->loadRevision($vid);
        // Only show revisions that are affected by the language that is being
        // displayed.
        if ($revision->hasTranslation($langcode) && $revision->getTranslation($langcode)
            ->isRevisionTranslationAffected()) {
            $username = [
                '#theme' => 'username',
                '#account' => $revision->getRevisionUser(),
            ];
            // Use revision link to link to revisions that are not active.
            $date = $this->dateFormatter
                ->format($revision->revision_timestamp->value, 'short');
            // We treat also the latest translation-affecting revision as current
            // revision, if it was the default revision, as its values for the
            // current language will be the same of the current default revision in
            // this case.
            $is_current_revision = $vid == $default_revision || !$current_revision_displayed && $revision->wasDefaultRevision();
            if (!$is_current_revision) {
                $link = Link::fromTextAndUrl($date, new Url('entity.node.revision', [
                    'node' => $node->id(),
                    'node_revision' => $vid,
                ]))
                    ->toString();
            }
            else {
                $link = $node->toLink($date)
                    ->toString();
                $current_revision_displayed = TRUE;
            }
            $row = [];
            $column = [
                'data' => [
                    '#type' => 'inline_template',
                    '#template' => '{% trans %}{{ date }} by {{ username }}{% endtrans %}{% if message %}<p class="revision-log">{{ message }}</p>{% endif %}',
                    '#context' => [
                        'date' => $link,
                        'username' => $this->renderer
                            ->renderPlain($username),
                        'message' => [
                            '#markup' => $revision->revision_log->value,
                            '#allowed_tags' => Xss::getHtmlTagList(),
                        ],
                    ],
                ],
            ];
            // @todo Simplify once https://www.drupal.org/node/2334319 lands.
            $this->renderer
                ->addCacheableDependency($column['data'], $username);
            $row[] = $column;
            if ($is_current_revision) {
                $row[] = [
                    'data' => [
                        '#prefix' => '<em>',
                        '#markup' => $this->t('Current revision'),
                        '#suffix' => '</em>',
                    ],
                ];
                $rows[] = [
                    'data' => $row,
                    'class' => [
                        'revision-current',
                    ],
                ];
            }
            else {
                $links = [];
                if ($revert_permission) {
                    $links['revert'] = [
                        'title' => $vid < $node->getRevisionId() ? $this->t('Revert') : $this->t('Set as current revision'),
                        'url' => $has_translations ? Url::fromRoute('node.revision_revert_translation_confirm', [
                            'node' => $node->id(),
                            'node_revision' => $vid,
                            'langcode' => $langcode,
                        ]) : Url::fromRoute('node.revision_revert_confirm', [
                            'node' => $node->id(),
                            'node_revision' => $vid,
                        ]),
                    ];
                }
                if ($delete_permission) {
                    $links['delete'] = [
                        'title' => $this->t('Delete'),
                        'url' => Url::fromRoute('node.revision_delete_confirm', [
                            'node' => $node->id(),
                            'node_revision' => $vid,
                        ]),
                    ];
                }
                $row[] = [
                    'data' => [
                        '#type' => 'operations',
                        '#links' => $links,
                    ],
                ];
                $rows[] = $row;
            }
        }
    }
    $build['node_revisions_table'] = [
        '#theme' => 'table',
        '#rows' => $rows,
        '#header' => $header,
        '#attached' => [
            'library' => [
                'node/drupal.node.admin',
            ],
        ],
        '#attributes' => [
            'class' => 'node-revision-table',
        ],
    ];
    $build['pager'] = [
        '#type' => 'pager',
    ];
    return $build;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.