dateFormatter = $date_formatter; $this->renderer = $renderer; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('date.formatter'), $container->get('renderer') ); } /** * Displays add content links for available content types. * * Redirects to node/add/[type] if only one content type is available. * * @return array * A render array for a list of the node types that can be added; however, * if there is only one node type defined for the site, the function * redirects to the node add page for that one node type and does not return * at all. * * @see node_menu() */ public function addPage() { $content = array(); // Only use node types the user has access to. foreach ($this->entityManager()->getStorage('node_type')->loadMultiple() as $type) { if ($this->entityManager()->getAccessControlHandler('node')->createAccess($type->id())) { $content[$type->id()] = $type; } } // Bypass the node/add listing if only one content type is available. if (count($content) == 1) { $type = array_shift($content); return $this->redirect('node.add', array('node_type' => $type->id())); } return array( '#theme' => 'node_add_list', '#content' => $content, ); } /** * Provides the node submission form. * * @param \Drupal\node\NodeTypeInterface $node_type * The node type entity for the node. * * @return array * A node submission form. */ public function add(NodeTypeInterface $node_type) { $node = $this->entityManager()->getStorage('node')->create(array( 'type' => $node_type->id(), )); $form = $this->entityFormBuilder()->getForm($node); return $form; } /** * Displays a node revision. * * @param int $node_revision * The node revision ID. * * @return array * An array suitable for drupal_render(). */ public function revisionShow($node_revision) { $node = $this->entityManager()->getStorage('node')->loadRevision($node_revision); $node_view_controller = new NodeViewController($this->entityManager, $this->renderer); $page = $node_view_controller->view($node); unset($page['nodes'][$node->id()]['#cache']); return $page; } /** * Page title callback for a node revision. * * @param int $node_revision * The node revision ID. * * @return string * The page title. */ public function revisionPageTitle($node_revision) { $node = $this->entityManager()->getStorage('node')->loadRevision($node_revision); return $this->t('Revision of %title from %date', array('%title' => $node->label(), '%date' => format_date($node->getRevisionCreationTime()))); } /** * Generates an overview table of older revisions of a node. * * @param \Drupal\node\NodeInterface $node * A node object. * * @return array * An array as expected by drupal_render(). */ public function revisionOverview(NodeInterface $node) { $account = $this->currentUser(); $node_storage = $this->entityManager()->getStorage('node'); $type = $node->getType(); $build = array(); $build['#title'] = $this->t('Revisions for %title', array('%title' => $node->label())); $header = array($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 = array(); $vids = $node_storage->revisionIds($node); foreach (array_reverse($vids) as $vid) { if ($revision = $node_storage->loadRevision($vid)) { $row = array(); $revision_author = $revision->uid->entity; if ($vid == $node->getRevisionId()) { $username = array( '#theme' => 'username', '#account' => $revision_author, ); $row[] = array('data' => $this->t('!date by !username', array('!date' => $node->link($this->dateFormatter->format($revision->revision_timestamp->value, 'short')), '!username' => drupal_render($username))) . (($revision->revision_log->value != '') ? '

' . Xss::filter($revision->revision_log->value) . '

' : ''), 'class' => array('revision-current')); $row[] = array('data' => SafeMarkup::placeholder($this->t('current revision')), 'class' => array('revision-current')); } else { $username = array( '#theme' => 'username', '#account' => $revision_author, ); $row[] = $this->t('!date by !username', array('!date' => $this->l($this->dateFormatter->format($revision->revision_timestamp->value, 'short'), new Url('entity.node.revision', array('node' => $node->id(), 'node_revision' => $vid))), '!username' => drupal_render($username))) . (($revision->revision_log->value != '') ? '

' . Xss::filter($revision->revision_log->value) . '

' : ''); if ($revert_permission) { $links['revert'] = array( 'title' => $this->t('Revert'), 'url' => Url::fromRoute('node.revision_revert_confirm', ['node' => $node->id(), 'node_revision' => $vid]), ); } if ($delete_permission) { $links['delete'] = array( 'title' => $this->t('Delete'), 'url' => Url::fromRoute('node.revision_delete_confirm', ['node' => $node->id(), 'node_revision' => $vid]), ); } $row[] = array( 'data' => array( '#type' => 'operations', '#links' => $links, ), ); } $rows[] = $row; } } $build['node_revisions_table'] = array( '#theme' => 'table', '#rows' => $rows, '#header' => $header, '#attached' => array( 'library' => array('node/drupal.node.admin'), ), ); return $build; } /** * The _title_callback for the node.add route. * * @param \Drupal\node\NodeTypeInterface $node_type * The current node. * * @return string * The page title. */ public function addPageTitle(NodeTypeInterface $node_type) { return $this->t('Create @name', array('@name' => $node_type->label())); } }