Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 8 |
CRAP | |
0.00% |
0 / 139 |
ForumController | |
0.00% |
0 / 1 |
|
0.00% |
0 / 8 |
420 | |
0.00% |
0 / 139 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 11 |
|||
create | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 14 |
|||
forumPage | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 13 |
|||
forumIndex | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 12 |
|||
build | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 33 |
|||
addForum | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 7 |
|||
addContainer | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 7 |
|||
buildActionLinks | |
0.00% |
0 / 1 |
56 | |
0.00% |
0 / 42 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\forum\Controller\ForumController. | |
*/ | |
namespace Drupal\forum\Controller; | |
use Drupal\Core\Cache\Cache; | |
use Drupal\Core\Controller\ControllerBase; | |
use Drupal\Core\Entity\EntityAccessControlHandlerInterface; | |
use Drupal\Core\Entity\EntityStorageInterface; | |
use Drupal\Core\Entity\EntityTypeInterface; | |
use Drupal\Core\Render\RendererInterface; | |
use Drupal\Core\Session\AccountInterface; | |
use Drupal\Core\Url; | |
use Drupal\forum\ForumManagerInterface; | |
use Drupal\taxonomy\TermInterface; | |
use Drupal\taxonomy\TermStorageInterface; | |
use Drupal\taxonomy\VocabularyStorageInterface; | |
use Symfony\Component\DependencyInjection\ContainerInterface; | |
/** | |
* Controller routines for forum routes. | |
*/ | |
class ForumController extends ControllerBase { | |
/** | |
* Forum manager service. | |
* | |
* @var \Drupal\forum\ForumManagerInterface | |
*/ | |
protected $forumManager; | |
/** | |
* Vocabulary storage. | |
* | |
* @var \Drupal\taxonomy\VocabularyStorageInterface | |
*/ | |
protected $vocabularyStorage; | |
/** | |
* Term storage. | |
* | |
* @var \Drupal\taxonomy\TermStorageInterface | |
*/ | |
protected $termStorage; | |
/** | |
* Node access control handler. | |
* | |
* @var \Drupal\Core\Entity\EntityAccessControlHandlerInterface | |
*/ | |
protected $nodeAccess; | |
/** | |
* Field map of existing fields on the site. | |
* | |
* @var array | |
*/ | |
protected $fieldMap; | |
/** | |
* Node type storage handler. | |
* | |
* @var \Drupal\Core\Entity\EntityStorageInterface | |
*/ | |
protected $nodeTypeStorage; | |
/** | |
* The renderer. | |
* | |
* @var \Drupal\Core\Render\RendererInterface | |
*/ | |
protected $renderer; | |
/** | |
* Node entity type, we need to get cache tags from here. | |
* | |
* @var \Drupal\Core\Entity\EntityTypeInterface | |
*/ | |
protected $nodeEntityTypeDefinition; | |
/** | |
* Comment entity type, we need to get cache tags from here. | |
* | |
* @var \Drupal\Core\Entity\EntityTypeInterface | |
*/ | |
protected $commentEntityTypeDefinition; | |
/** | |
* Constructs a ForumController object. | |
* | |
* @param \Drupal\forum\ForumManagerInterface $forum_manager | |
* The forum manager service. | |
* @param \Drupal\taxonomy\VocabularyStorageInterface $vocabulary_storage | |
* Vocabulary storage. | |
* @param \Drupal\taxonomy\TermStorageInterface $term_storage | |
* Term storage. | |
* @param \Drupal\Core\Session\AccountInterface $current_user | |
* The current logged in user. | |
* @param \Drupal\Core\Entity\EntityAccessControlHandlerInterface $node_access | |
* Node access control handler. | |
* @param array $field_map | |
* Array of active fields on the site. | |
* @param \Drupal\Core\Entity\EntityStorageInterface $node_type_storage | |
* Node type storage handler. | |
* @param \Drupal\Core\Render\RendererInterface $renderer | |
* The renderer. | |
* @param \Drupal\Core\Entity\EntityTypeInterface $node_entity_type_definition | |
* Node entity type definition object | |
* @param \Drupal\Core\Entity\EntityTypeInterface $comment_entity_type_definition | |
* Comment entity type definition object | |
*/ | |
public function __construct(ForumManagerInterface $forum_manager, VocabularyStorageInterface $vocabulary_storage, TermStorageInterface $term_storage, AccountInterface $current_user, EntityAccessControlHandlerInterface $node_access, array $field_map, EntityStorageInterface $node_type_storage, RendererInterface $renderer, EntityTypeInterface $node_entity_type_definition, EntityTypeInterface $comment_entity_type_definition) { | |
$this->forumManager = $forum_manager; | |
$this->vocabularyStorage = $vocabulary_storage; | |
$this->termStorage = $term_storage; | |
$this->currentUser = $current_user; | |
$this->nodeAccess = $node_access; | |
$this->fieldMap = $field_map; | |
$this->nodeTypeStorage = $node_type_storage; | |
$this->renderer = $renderer; | |
$this->nodeEntityTypeDefinition = $node_entity_type_definition; | |
$this->commentEntityTypeDefinition = $comment_entity_type_definition; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public static function create(ContainerInterface $container) { | |
/** @var \Drupal\Core\Entity\EntityManagerInterface $entity_manager */ | |
$entity_manager = $container->get('entity.manager'); | |
return new static( | |
$container->get('forum_manager'), | |
$entity_manager->getStorage('taxonomy_vocabulary'), | |
$entity_manager->getStorage('taxonomy_term'), | |
$container->get('current_user'), | |
$entity_manager->getAccessControlHandler('node'), | |
$entity_manager->getFieldMap(), | |
$entity_manager->getStorage('node_type'), | |
$container->get('renderer'), | |
$entity_manager->getDefinition('node'), | |
$entity_manager->getDefinition('comment') | |
); | |
} | |
/** | |
* Returns forum page for a given forum. | |
* | |
* @param \Drupal\taxonomy\TermInterface $taxonomy_term | |
* The forum to render the page for. | |
* | |
* @return array | |
* A render array. | |
*/ | |
public function forumPage(TermInterface $taxonomy_term) { | |
// Get forum details. | |
$taxonomy_term->forums = $this->forumManager->getChildren($this->config('forum.settings')->get('vocabulary'), $taxonomy_term->id()); | |
$taxonomy_term->parents = $this->forumManager->getParents($taxonomy_term->id()); | |
if (empty($taxonomy_term->forum_container->value)) { | |
$build = $this->forumManager->getTopics($taxonomy_term->id(), $this->currentUser()); | |
$topics = $build['topics']; | |
$header = $build['header']; | |
} | |
else { | |
$topics = []; | |
$header = []; | |
} | |
return $this->build($taxonomy_term->forums, $taxonomy_term, $topics, $taxonomy_term->parents, $header); | |
} | |
/** | |
* Returns forum index page. | |
* | |
* @return array | |
* A render array. | |
*/ | |
public function forumIndex() { | |
$vocabulary = $this->vocabularyStorage->load($this->config('forum.settings')->get('vocabulary')); | |
$index = $this->forumManager->getIndex(); | |
$build = $this->build($index->forums, $index); | |
if (empty($index->forums)) { | |
// Root of empty forum. | |
$build['#title'] = $this->t('No forums defined'); | |
} | |
else { | |
// Set the page title to forum's vocabulary name. | |
$build['#title'] = $vocabulary->label(); | |
$this->renderer->addCacheableDependency($build, $vocabulary); | |
} | |
return $build; | |
} | |
/** | |
* Returns a renderable forum index page array. | |
* | |
* @param array $forums | |
* A list of forums. | |
* @param \Drupal\taxonomy\TermInterface $term | |
* The taxonomy term of the forum. | |
* @param array $topics | |
* The topics of this forum. | |
* @param array $parents | |
* The parent forums in relation this forum. | |
* @param array $header | |
* Array of header cells. | |
* | |
* @return array | |
* A render array. | |
*/ | |
protected function build($forums, TermInterface $term, $topics = array(), $parents = array(), $header = array()) { | |
$config = $this->config('forum.settings'); | |
$build = array( | |
'#theme' => 'forums', | |
'#forums' => $forums, | |
'#topics' => $topics, | |
'#parents' => $parents, | |
'#header' => $header, | |
'#term' => $term, | |
'#sortby' => $config->get('topics.order'), | |
'#forums_per_page' => $config->get('topics.page_limit'), | |
); | |
if (empty($term->forum_container->value)) { | |
$build['#attached']['feed'][] = array('taxonomy/term/' . $term->id() . '/feed', 'RSS - ' . $term->getName()); | |
} | |
$this->renderer->addCacheableDependency($build, $config); | |
foreach ($forums as $forum) { | |
$this->renderer->addCacheableDependency($build, $forum); | |
} | |
foreach ($topics as $topic) { | |
$this->renderer->addCacheableDependency($build, $topic); | |
} | |
foreach ($parents as $parent) { | |
$this->renderer->addCacheableDependency($build, $parent); | |
} | |
$this->renderer->addCacheableDependency($build, $term); | |
return [ | |
'action' => $this->buildActionLinks($config->get('vocabulary'), $term), | |
'forum' => $build, | |
'#cache' => [ | |
'tags' => Cache::mergeTags($this->nodeEntityTypeDefinition->getListCacheTags(), $this->commentEntityTypeDefinition->getListCacheTags()), | |
], | |
]; | |
} | |
/** | |
* Returns add forum entity form. | |
* | |
* @return array | |
* Render array for the add form. | |
*/ | |
public function addForum() { | |
$vid = $this->config('forum.settings')->get('vocabulary'); | |
$taxonomy_term = $this->termStorage->create(array( | |
'vid' => $vid, | |
'forum_controller' => 0, | |
)); | |
return $this->entityFormBuilder()->getForm($taxonomy_term, 'forum'); | |
} | |
/** | |
* Returns add container entity form. | |
* | |
* @return array | |
* Render array for the add form. | |
*/ | |
public function addContainer() { | |
$vid = $this->config('forum.settings')->get('vocabulary'); | |
$taxonomy_term = $this->termStorage->create(array( | |
'vid' => $vid, | |
'forum_container' => 1, | |
)); | |
return $this->entityFormBuilder()->getForm($taxonomy_term, 'container'); | |
} | |
/** | |
* Generates an action link to display at the top of the forum listing. | |
* | |
* @param string $vid | |
* Vocabulary ID. | |
* @param \Drupal\taxonomy\TermInterface $forum_term | |
* The term for which the links are to be built. | |
* | |
* @return array | |
* Render array containing the links. | |
*/ | |
protected function buildActionLinks($vid, TermInterface $forum_term = NULL) { | |
$user = $this->currentUser(); | |
$links = []; | |
// Loop through all bundles for forum taxonomy vocabulary field. | |
foreach ($this->fieldMap['node']['taxonomy_forums']['bundles'] as $type) { | |
if ($this->nodeAccess->createAccess($type)) { | |
$node_type = $this->nodeTypeStorage->load($type); | |
$links[$type] = [ | |
'#attributes' => ['class' => ['action-links']], | |
'#theme' => 'menu_local_action', | |
'#link' => [ | |
'title' => $this->t('Add new @node_type', [ | |
'@node_type' => $this->nodeTypeStorage->load($type)->label(), | |
]), | |
'url' => Url::fromRoute('node.add', ['node_type' => $type]), | |
], | |
'#cache' => [ | |
'tags' => $node_type->getCacheTags(), | |
], | |
]; | |
if ($forum_term && $forum_term->bundle() == $vid) { | |
// We are viewing a forum term (specific forum), append the tid to | |
// the url. | |
$links[$type]['#link']['localized_options']['query']['forum_id'] = $forum_term->id(); | |
} | |
} | |
} | |
if (empty($links)) { | |
// Authenticated user does not have access to create new topics. | |
if ($user->isAuthenticated()) { | |
$links['disallowed'] = [ | |
'#markup' => $this->t('You are not allowed to post new content in the forum.'), | |
]; | |
} | |
// Anonymous user does not have access to create new topics. | |
else { | |
$links['login'] = [ | |
'#attributes' => ['class' => ['action-links']], | |
'#theme' => 'menu_local_action', | |
'#link' => array( | |
'title' => $this->t('Log in to post new content in the forum.'), | |
'url' => Url::fromRoute('user.login', [], ['query' => $this->getDestinationArray()]), | |
), | |
]; | |
} | |
} | |
return $links; | |
} | |
} |