upgrades core to 8.4.2
This commit is contained in:
@@ -2,7 +2,6 @@
|
||||
|
||||
namespace Drupal\comment;
|
||||
|
||||
|
||||
use Drupal\Core\Database\Connection;
|
||||
use Drupal\Core\Entity\FieldableEntityInterface;
|
||||
use Drupal\Core\Entity\EntityChangedInterface;
|
||||
|
||||
@@ -126,12 +126,15 @@ class CommentViewBuilder extends EntityViewBuilder {
|
||||
$display = $displays[$entity->bundle()];
|
||||
if ($display->getComponent('links')) {
|
||||
$build[$id]['links'] = [
|
||||
'#lazy_builder' => ['comment.lazy_builders:renderLinks', [
|
||||
$entity->id(),
|
||||
$view_mode,
|
||||
$entity->language()->getId(),
|
||||
!empty($entity->in_preview),
|
||||
]],
|
||||
'#lazy_builder' => [
|
||||
'comment.lazy_builders:renderLinks',
|
||||
[
|
||||
$entity->id(),
|
||||
$view_mode,
|
||||
$entity->language()->getId(),
|
||||
!empty($entity->in_preview),
|
||||
],
|
||||
],
|
||||
'#create_placeholder' => TRUE,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ class CommentViewsData extends EntityViewsData {
|
||||
|
||||
$data['comment_field_data']['subject']['title'] = $this->t('Title');
|
||||
$data['comment_field_data']['subject']['help'] = $this->t('The title of the comment.');
|
||||
$data['comment_field_data']['subject']['field']['default_formatter'] = 'comment_permalink';
|
||||
|
||||
$data['comment_field_data']['name']['title'] = $this->t('Author');
|
||||
$data['comment_field_data']['name']['help'] = $this->t("The name of the comment's author. Can be rendered as a link to the author's homepage.");
|
||||
@@ -168,6 +169,17 @@ class CommentViewsData extends EntityViewsData {
|
||||
],
|
||||
];
|
||||
|
||||
$data['comment_field_data']['entity_id']['field']['id'] = 'commented_entity';
|
||||
unset($data['comment_field_data']['entity_id']['relationship']);
|
||||
|
||||
$data['comment']['comment_bulk_form'] = [
|
||||
'title' => $this->t('Comment operations bulk form'),
|
||||
'help' => $this->t('Add a form element that lets you run operations on multiple comments.'),
|
||||
'field' => [
|
||||
'id' => 'comment_bulk_form',
|
||||
],
|
||||
];
|
||||
|
||||
$data['comment_field_data']['thread']['field'] = [
|
||||
'title' => $this->t('Depth'),
|
||||
'help' => $this->t('Display the depth of the comment if it is threaded.'),
|
||||
|
||||
@@ -288,7 +288,7 @@ class CommentController extends ControllerBase {
|
||||
// Check if the user has the proper permissions.
|
||||
$access = $access->andIf(AccessResult::allowedIfHasPermission($account, 'access comments'));
|
||||
|
||||
/// Load the parent comment.
|
||||
// Load the parent comment.
|
||||
$comment = $this->entityManager()->getStorage('comment')->load($pid);
|
||||
// Check if the parent comment is published and belongs to the entity.
|
||||
$access = $access->andIf(AccessResult::allowedIf($comment && $comment->isPublished() && $comment->getCommentedEntityId() == $entity->id()));
|
||||
|
||||
@@ -57,6 +57,7 @@ use Drupal\user\UserInterface;
|
||||
* "canonical" = "/comment/{comment}",
|
||||
* "delete-form" = "/comment/{comment}/delete",
|
||||
* "edit-form" = "/comment/{comment}/edit",
|
||||
* "create" = "/comment",
|
||||
* },
|
||||
* bundle_entity_type = "comment_type",
|
||||
* field_ui_base_route = "entity.comment_type.edit_form",
|
||||
@@ -138,17 +139,20 @@ class Comment extends ContentEntityBase implements CommentInterface {
|
||||
} while (!\Drupal::lock()->acquire($lock_name));
|
||||
$this->threadLock = $lock_name;
|
||||
}
|
||||
// We test the value with '===' because we need to modify anonymous
|
||||
// users as well.
|
||||
if ($this->getOwnerId() === \Drupal::currentUser()->id() && \Drupal::currentUser()->isAuthenticated()) {
|
||||
$this->setAuthorName(\Drupal::currentUser()->getUsername());
|
||||
}
|
||||
$this->setThread($thread);
|
||||
if (!$this->getHostname()) {
|
||||
// Ensure a client host from the current request.
|
||||
$this->setHostname(\Drupal::request()->getClientIP());
|
||||
}
|
||||
}
|
||||
// The entity fields for name and mail have no meaning if the user is not
|
||||
// Anonymous. Set them to NULL to make it clearer that they are not used.
|
||||
// For anonymous users see \Drupal\comment\CommentForm::form() for mail,
|
||||
// and \Drupal\comment\CommentForm::buildEntity() for name setting.
|
||||
if (!$this->getOwner()->isAnonymous()) {
|
||||
$this->set('name', NULL);
|
||||
$this->set('mail', NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -559,7 +563,7 @@ class Comment extends ContentEntityBase implements CommentInterface {
|
||||
* @see ::baseFieldDefinitions()
|
||||
*
|
||||
* @return bool
|
||||
* TRUE if the comment should be published, FALSE otherwise.
|
||||
* TRUE if the comment should be published, FALSE otherwise.
|
||||
*/
|
||||
public static function getDefaultStatus() {
|
||||
return \Drupal::currentUser()->hasPermission('skip comment approval') ? CommentInterface::PUBLISHED : CommentInterface::NOT_PUBLISHED;
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
namespace Drupal\comment\Form;
|
||||
|
||||
use Drupal\comment\CommentInterface;
|
||||
use Drupal\comment\CommentStorageInterface;
|
||||
use Drupal\Component\Utility\Unicode;
|
||||
use Drupal\Core\Datetime\DateFormatterInterface;
|
||||
use Drupal\Core\Entity\EntityManagerInterface;
|
||||
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
||||
use Drupal\Core\Extension\ModuleHandlerInterface;
|
||||
use Drupal\Core\Form\FormBase;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
use Drupal\user\PrivateTempStoreFactory;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
@@ -18,11 +18,11 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
class CommentAdminOverview extends FormBase {
|
||||
|
||||
/**
|
||||
* The entity storage.
|
||||
* The entity type manager.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityManagerInterface
|
||||
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
|
||||
*/
|
||||
protected $entityManager;
|
||||
protected $entityTypeManager;
|
||||
|
||||
/**
|
||||
* The comment storage.
|
||||
@@ -45,23 +45,31 @@ class CommentAdminOverview extends FormBase {
|
||||
*/
|
||||
protected $moduleHandler;
|
||||
|
||||
/**
|
||||
* The tempstore factory.
|
||||
*
|
||||
* @var \Drupal\user\PrivateTempStoreFactory
|
||||
*/
|
||||
protected $tempStoreFactory;
|
||||
|
||||
/**
|
||||
* Creates a CommentAdminOverview form.
|
||||
*
|
||||
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
|
||||
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
|
||||
* The entity manager service.
|
||||
* @param \Drupal\comment\CommentStorageInterface $comment_storage
|
||||
* The comment storage.
|
||||
* @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
|
||||
* The date formatter service.
|
||||
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
|
||||
* The module handler.
|
||||
* @param \Drupal\user\PrivateTempStoreFactory $temp_store_factory
|
||||
* The tempstore factory.
|
||||
*/
|
||||
public function __construct(EntityManagerInterface $entity_manager, CommentStorageInterface $comment_storage, DateFormatterInterface $date_formatter, ModuleHandlerInterface $module_handler) {
|
||||
$this->entityManager = $entity_manager;
|
||||
$this->commentStorage = $comment_storage;
|
||||
public function __construct(EntityTypeManagerInterface $entity_type_manager, DateFormatterInterface $date_formatter, ModuleHandlerInterface $module_handler, PrivateTempStoreFactory $temp_store_factory) {
|
||||
$this->entityTypeManager = $entity_type_manager;
|
||||
$this->commentStorage = $entity_type_manager->getStorage('comment');
|
||||
$this->dateFormatter = $date_formatter;
|
||||
$this->moduleHandler = $module_handler;
|
||||
$this->tempStoreFactory = $temp_store_factory;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -69,10 +77,10 @@ class CommentAdminOverview extends FormBase {
|
||||
*/
|
||||
public static function create(ContainerInterface $container) {
|
||||
return new static(
|
||||
$container->get('entity.manager'),
|
||||
$container->get('entity.manager')->getStorage('comment'),
|
||||
$container->get('entity_type.manager'),
|
||||
$container->get('date.formatter'),
|
||||
$container->get('module_handler')
|
||||
$container->get('module_handler'),
|
||||
$container->get('user.private_tempstore')
|
||||
);
|
||||
}
|
||||
|
||||
@@ -171,7 +179,9 @@ class CommentAdminOverview extends FormBase {
|
||||
}
|
||||
|
||||
foreach ($commented_entity_ids as $entity_type => $ids) {
|
||||
$commented_entities[$entity_type] = $this->entityManager->getStorage($entity_type)->loadMultiple($ids);
|
||||
$commented_entities[$entity_type] = $this->entityTypeManager
|
||||
->getStorage($entity_type)
|
||||
->loadMultiple($ids);
|
||||
}
|
||||
|
||||
foreach ($comments as $comment) {
|
||||
@@ -255,23 +265,33 @@ class CommentAdminOverview extends FormBase {
|
||||
public function submitForm(array &$form, FormStateInterface $form_state) {
|
||||
$operation = $form_state->getValue('operation');
|
||||
$cids = $form_state->getValue('comments');
|
||||
|
||||
foreach ($cids as $cid) {
|
||||
// Delete operation handled in \Drupal\comment\Form\ConfirmDeleteMultiple
|
||||
// see \Drupal\comment\Controller\AdminController::adminPage().
|
||||
if ($operation == 'unpublish') {
|
||||
$comment = $this->commentStorage->load($cid);
|
||||
$comment->setPublished(FALSE);
|
||||
$comment->save();
|
||||
}
|
||||
elseif ($operation == 'publish') {
|
||||
$comment = $this->commentStorage->load($cid);
|
||||
$comment->setPublished(TRUE);
|
||||
/** @var \Drupal\comment\CommentInterface[] $comments */
|
||||
$comments = $this->commentStorage->loadMultiple($cids);
|
||||
if ($operation != 'delete') {
|
||||
foreach ($comments as $comment) {
|
||||
if ($operation == 'unpublish') {
|
||||
$comment->setUnpublished();
|
||||
}
|
||||
elseif ($operation == 'publish') {
|
||||
$comment->setPublished();
|
||||
}
|
||||
$comment->save();
|
||||
}
|
||||
drupal_set_message($this->t('The update has been performed.'));
|
||||
$form_state->setRedirect('comment.admin');
|
||||
}
|
||||
else {
|
||||
$info = [];
|
||||
/** @var \Drupal\comment\CommentInterface $comment */
|
||||
foreach ($comments as $comment) {
|
||||
$langcode = $comment->language()->getId();
|
||||
$info[$comment->id()][$langcode] = $langcode;
|
||||
}
|
||||
$this->tempStoreFactory
|
||||
->get('comment_multiple_delete_confirm')
|
||||
->set($this->currentUser()->id(), $info);
|
||||
$form_state->setRedirect('comment.multiple_delete_confirm');
|
||||
}
|
||||
drupal_set_message($this->t('The update has been performed.'));
|
||||
$form_state->setRedirect('comment.admin');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
namespace Drupal\comment\Form;
|
||||
|
||||
use Drupal\comment\CommentStorageInterface;
|
||||
use Drupal\Component\Utility\Html;
|
||||
use Drupal\user\PrivateTempStoreFactory;
|
||||
use Drupal\Core\Form\ConfirmFormBase;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
use Drupal\Core\Url;
|
||||
@@ -14,6 +14,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
*/
|
||||
class ConfirmDeleteMultiple extends ConfirmFormBase {
|
||||
|
||||
/**
|
||||
* The tempstore factory.
|
||||
*
|
||||
* @var \Drupal\user\PrivateTempStoreFactory
|
||||
*/
|
||||
protected $tempStoreFactory;
|
||||
|
||||
/**
|
||||
* The comment storage.
|
||||
*
|
||||
@@ -24,18 +31,21 @@ class ConfirmDeleteMultiple extends ConfirmFormBase {
|
||||
/**
|
||||
* An array of comments to be deleted.
|
||||
*
|
||||
* @var \Drupal\comment\CommentInterface[]
|
||||
* @var string[][]
|
||||
*/
|
||||
protected $comments;
|
||||
protected $commentInfo;
|
||||
|
||||
/**
|
||||
* Creates an new ConfirmDeleteMultiple form.
|
||||
*
|
||||
* @param \Drupal\comment\CommentStorageInterface $comment_storage
|
||||
* The comment storage.
|
||||
* @param \Drupal\user\PrivateTempStoreFactory $temp_store_factory
|
||||
* The tempstore factory.
|
||||
*/
|
||||
public function __construct(CommentStorageInterface $comment_storage) {
|
||||
public function __construct(CommentStorageInterface $comment_storage, PrivateTempStoreFactory $temp_store_factory) {
|
||||
$this->commentStorage = $comment_storage;
|
||||
$this->tempStoreFactory = $temp_store_factory;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -43,7 +53,8 @@ class ConfirmDeleteMultiple extends ConfirmFormBase {
|
||||
*/
|
||||
public static function create(ContainerInterface $container) {
|
||||
return new static(
|
||||
$container->get('entity.manager')->getStorage('comment')
|
||||
$container->get('entity.manager')->getStorage('comment'),
|
||||
$container->get('user.private_tempstore')
|
||||
);
|
||||
}
|
||||
|
||||
@@ -58,7 +69,7 @@ class ConfirmDeleteMultiple extends ConfirmFormBase {
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getQuestion() {
|
||||
return $this->t('Are you sure you want to delete these comments and all their children?');
|
||||
return $this->formatPlural(count($this->commentInfo), 'Are you sure you want to delete this comment and all its children?', 'Are you sure you want to delete these comments and all their children?');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -72,39 +83,56 @@ class ConfirmDeleteMultiple extends ConfirmFormBase {
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getConfirmText() {
|
||||
return $this->t('Delete comments');
|
||||
return $this->t('Delete');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildForm(array $form, FormStateInterface $form_state) {
|
||||
$edit = $form_state->getUserInput();
|
||||
$this->commentInfo = $this->tempStoreFactory->get('comment_multiple_delete_confirm')->get($this->currentUser()->id());
|
||||
if (empty($this->commentInfo)) {
|
||||
return $this->redirect('comment.admin');
|
||||
}
|
||||
/** @var \Drupal\comment\CommentInterface[] $comments */
|
||||
$comments = $this->commentStorage->loadMultiple(array_keys($this->commentInfo));
|
||||
|
||||
$items = [];
|
||||
foreach ($this->commentInfo as $id => $langcodes) {
|
||||
foreach ($langcodes as $langcode) {
|
||||
$comment = $comments[$id]->getTranslation($langcode);
|
||||
$key = $id . ':' . $langcode;
|
||||
$default_key = $id . ':' . $comment->getUntranslated()->language()->getId();
|
||||
|
||||
// If we have a translated entity we build a nested list of translations
|
||||
// that will be deleted.
|
||||
$languages = $comment->getTranslationLanguages();
|
||||
if (count($languages) > 1 && $comment->isDefaultTranslation()) {
|
||||
$names = [];
|
||||
foreach ($languages as $translation_langcode => $language) {
|
||||
$names[] = $language->getName();
|
||||
unset($items[$id . ':' . $translation_langcode]);
|
||||
}
|
||||
$items[$default_key] = [
|
||||
'label' => [
|
||||
'#markup' => $this->t('@label (Original translation) - <em>The following comment translations will be deleted:</em>', ['@label' => $comment->label()]),
|
||||
],
|
||||
'deleted_translations' => [
|
||||
'#theme' => 'item_list',
|
||||
'#items' => $names,
|
||||
],
|
||||
];
|
||||
}
|
||||
elseif (!isset($items[$default_key])) {
|
||||
$items[$key] = $comment->label();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$form['comments'] = [
|
||||
'#prefix' => '<ul>',
|
||||
'#suffix' => '</ul>',
|
||||
'#tree' => TRUE,
|
||||
'#theme' => 'item_list',
|
||||
'#items' => $items,
|
||||
];
|
||||
// array_filter() returns only elements with actual values.
|
||||
$comment_counter = 0;
|
||||
$this->comments = $this->commentStorage->loadMultiple(array_keys(array_filter($edit['comments'])));
|
||||
foreach ($this->comments as $comment) {
|
||||
$cid = $comment->id();
|
||||
$form['comments'][$cid] = [
|
||||
'#type' => 'hidden',
|
||||
'#value' => $cid,
|
||||
'#prefix' => '<li>',
|
||||
'#suffix' => Html::escape($comment->label()) . '</li>'
|
||||
];
|
||||
$comment_counter++;
|
||||
}
|
||||
$form['operation'] = ['#type' => 'hidden', '#value' => 'delete'];
|
||||
|
||||
if (!$comment_counter) {
|
||||
drupal_set_message($this->t('There do not appear to be any comments to delete, or your selected comment was deleted by another administrator.'));
|
||||
$form_state->setRedirect('comment.admin');
|
||||
}
|
||||
|
||||
return parent::buildForm($form, $form_state);
|
||||
}
|
||||
@@ -113,12 +141,56 @@ class ConfirmDeleteMultiple extends ConfirmFormBase {
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function submitForm(array &$form, FormStateInterface $form_state) {
|
||||
if ($form_state->getValue('confirm')) {
|
||||
$this->commentStorage->delete($this->comments);
|
||||
$count = count($form_state->getValue('comments'));
|
||||
$this->logger('comment')->notice('Deleted @count comments.', ['@count' => $count]);
|
||||
drupal_set_message($this->formatPlural($count, 'Deleted 1 comment.', 'Deleted @count comments.'));
|
||||
if ($form_state->getValue('confirm') && !empty($this->commentInfo)) {
|
||||
$total_count = 0;
|
||||
$delete_comments = [];
|
||||
/** @var \Drupal\Core\Entity\ContentEntityInterface[][] $delete_translations */
|
||||
$delete_translations = [];
|
||||
/** @var \Drupal\comment\CommentInterface[] $comments */
|
||||
$comments = $this->commentStorage->loadMultiple(array_keys($this->commentInfo));
|
||||
|
||||
foreach ($this->commentInfo as $id => $langcodes) {
|
||||
foreach ($langcodes as $langcode) {
|
||||
$comment = $comments[$id]->getTranslation($langcode);
|
||||
if ($comment->isDefaultTranslation()) {
|
||||
$delete_comments[$id] = $comment;
|
||||
unset($delete_translations[$id]);
|
||||
$total_count += count($comment->getTranslationLanguages());
|
||||
}
|
||||
elseif (!isset($delete_comments[$id])) {
|
||||
$delete_translations[$id][] = $comment;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($delete_comments) {
|
||||
$this->commentStorage->delete($delete_comments);
|
||||
$this->logger('content')->notice('Deleted @count comments.', ['@count' => count($delete_comments)]);
|
||||
}
|
||||
|
||||
if ($delete_translations) {
|
||||
$count = 0;
|
||||
foreach ($delete_translations as $id => $translations) {
|
||||
$comment = $comments[$id]->getUntranslated();
|
||||
foreach ($translations as $translation) {
|
||||
$comment->removeTranslation($translation->language()->getId());
|
||||
}
|
||||
$comment->save();
|
||||
$count += count($translations);
|
||||
}
|
||||
if ($count) {
|
||||
$total_count += $count;
|
||||
$this->logger('content')->notice('Deleted @count comment translations.', ['@count' => $count]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($total_count) {
|
||||
drupal_set_message($this->formatPlural($total_count, 'Deleted 1 comment.', 'Deleted @count comments.'));
|
||||
}
|
||||
|
||||
$this->tempStoreFactory->get('comment_multiple_delete_confirm')->delete($this->currentUser()->id());
|
||||
}
|
||||
|
||||
$form_state->setRedirectUrl($this->getCancelUrl());
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\comment\Plugin\Action;
|
||||
|
||||
use Drupal\Core\Action\ActionBase;
|
||||
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
||||
use Drupal\Core\Session\AccountInterface;
|
||||
use Drupal\user\PrivateTempStoreFactory;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Deletes a comment.
|
||||
*
|
||||
* @Action(
|
||||
* id = "comment_delete_action",
|
||||
* label = @Translation("Delete comment"),
|
||||
* type = "comment",
|
||||
* confirm_form_route_name = "comment.multiple_delete_confirm"
|
||||
* )
|
||||
*/
|
||||
class DeleteComment extends ActionBase implements ContainerFactoryPluginInterface {
|
||||
|
||||
/**
|
||||
* The tempstore object.
|
||||
*
|
||||
* @var \Drupal\user\PrivateTempStore
|
||||
*/
|
||||
protected $tempStore;
|
||||
|
||||
/**
|
||||
* The current user.
|
||||
*
|
||||
* @var \Drupal\Core\Session\AccountInterface
|
||||
*/
|
||||
protected $currentUser;
|
||||
|
||||
/**
|
||||
* Constructs a new DeleteComment object.
|
||||
*
|
||||
* @param array $configuration
|
||||
* A configuration array containing information about the plugin instance.
|
||||
* @param string $plugin_id
|
||||
* The plugin ID for the plugin instance.
|
||||
* @param array $plugin_definition
|
||||
* The plugin implementation definition.
|
||||
* @param \Drupal\user\PrivateTempStoreFactory $temp_store_factory
|
||||
* The tempstore factory.
|
||||
* @param \Drupal\Core\Session\AccountInterface $current_user
|
||||
* The current user.
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, array $plugin_definition, PrivateTempStoreFactory $temp_store_factory, AccountInterface $current_user) {
|
||||
$this->currentUser = $current_user;
|
||||
$this->tempStore = $temp_store_factory->get('comment_multiple_delete_confirm');
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
|
||||
return new static(
|
||||
$configuration,
|
||||
$plugin_id,
|
||||
$plugin_definition,
|
||||
$container->get('user.private_tempstore'),
|
||||
$container->get('current_user')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function executeMultiple(array $entities) {
|
||||
$info = [];
|
||||
/** @var \Drupal\comment\CommentInterface $comment */
|
||||
foreach ($entities as $comment) {
|
||||
$langcode = $comment->language()->getId();
|
||||
$info[$comment->id()][$langcode] = $langcode;
|
||||
}
|
||||
$this->tempStore->set($this->currentUser->id(), $info);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function execute($entity = NULL) {
|
||||
$this->executeMultiple([$entity]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function access($comment, AccountInterface $account = NULL, $return_as_object = FALSE) {
|
||||
/** @var \Drupal\comment\CommentInterface $comment */
|
||||
return $comment->access('delete', $account, $return_as_object);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -66,6 +66,8 @@ class CommentSelection extends DefaultSelection {
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function entityQueryAlter(SelectInterface $query) {
|
||||
parent::entityQueryAlter($query);
|
||||
|
||||
$tables = $query->getTables();
|
||||
$data_table = 'comment_field_data';
|
||||
if (!isset($tables['comment_field_data']['alias'])) {
|
||||
|
||||
@@ -192,12 +192,15 @@ class CommentDefaultFormatter extends FormatterBase implements ContainerFactoryP
|
||||
$elements['#cache']['contexts'][] = 'user.roles';
|
||||
if ($this->currentUser->hasPermission('post comments')) {
|
||||
$output['comment_form'] = [
|
||||
'#lazy_builder' => ['comment.lazy_builders:renderForm', [
|
||||
$entity->getEntityTypeId(),
|
||||
$entity->id(),
|
||||
$field_name,
|
||||
$this->getFieldSetting('comment_type'),
|
||||
]],
|
||||
'#lazy_builder' => [
|
||||
'comment.lazy_builders:renderForm',
|
||||
[
|
||||
$entity->getEntityTypeId(),
|
||||
$entity->id(),
|
||||
$field_name,
|
||||
$this->getFieldSetting('comment_type'),
|
||||
],
|
||||
],
|
||||
'#create_placeholder' => TRUE,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\comment\Plugin\Field\FieldFormatter;
|
||||
|
||||
use Drupal\Component\Utility\Unicode;
|
||||
use Drupal\Core\Entity\EntityInterface;
|
||||
use Drupal\Core\Field\FieldDefinitionInterface;
|
||||
use Drupal\Core\Field\Plugin\Field\FieldFormatter\StringFormatter;
|
||||
|
||||
/**
|
||||
* Plugin implementation of the 'comment_permalink' formatter.
|
||||
*
|
||||
* All the other entities use 'canonical' or 'revision' links to link the entity
|
||||
* to itself but comments use permalink URL.
|
||||
*
|
||||
* @FieldFormatter(
|
||||
* id = "comment_permalink",
|
||||
* label = @Translation("Comment Permalink"),
|
||||
* field_types = {
|
||||
* "string",
|
||||
* "uri",
|
||||
* },
|
||||
* quickedit = {
|
||||
* "editor" = "plain_text"
|
||||
* }
|
||||
* )
|
||||
*/
|
||||
class CommentPermalinkFormatter extends StringFormatter {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getEntityUrl(EntityInterface $comment) {
|
||||
/* @var $comment \Drupal\comment\CommentInterface */
|
||||
$comment_permalink = $comment->permalink();
|
||||
if ($comment->hasField('comment_body') && ($body = $comment->get('comment_body')->value)) {
|
||||
$attributes = $comment_permalink->getOption('attributes') ?: [];
|
||||
$attributes += ['title' => Unicode::truncate($body, 128)];
|
||||
$comment_permalink->setOption('attributes', $attributes);
|
||||
}
|
||||
return $comment_permalink;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function isApplicable(FieldDefinitionInterface $field_definition) {
|
||||
return parent::isApplicable($field_definition) && $field_definition->getTargetEntityTypeId() === 'comment' && $field_definition->getName() === 'subject';
|
||||
}
|
||||
|
||||
}
|
||||
@@ -21,7 +21,8 @@ use Drupal\Core\Session\AnonymousUserSession;
|
||||
* description = @Translation("This field manages configuration and presentation of comments on an entity."),
|
||||
* list_class = "\Drupal\comment\CommentFieldItemList",
|
||||
* default_widget = "comment_default",
|
||||
* default_formatter = "comment_default"
|
||||
* default_formatter = "comment_default",
|
||||
* cardinality = 1,
|
||||
* )
|
||||
*/
|
||||
class CommentItem extends FieldItemBase implements CommentItemInterface {
|
||||
|
||||
@@ -10,7 +10,7 @@ use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "d6_comment",
|
||||
* source_provider = "comment"
|
||||
* source_module = "comment"
|
||||
* )
|
||||
*/
|
||||
class Comment extends DrupalSqlBase {
|
||||
@@ -21,8 +21,9 @@ class Comment extends DrupalSqlBase {
|
||||
public function query() {
|
||||
$query = $this->select('comments', 'c')
|
||||
->fields('c', ['cid', 'pid', 'nid', 'uid', 'subject',
|
||||
'comment', 'hostname', 'timestamp', 'status', 'thread', 'name',
|
||||
'mail', 'homepage', 'format']);
|
||||
'comment', 'hostname', 'timestamp', 'status', 'thread', 'name',
|
||||
'mail', 'homepage', 'format',
|
||||
]);
|
||||
$query->innerJoin('node', 'n', 'c.nid = n.nid');
|
||||
$query->fields('n', ['type']);
|
||||
$query->orderBy('c.timestamp');
|
||||
@@ -33,6 +34,20 @@ class Comment extends DrupalSqlBase {
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function prepareRow(Row $row) {
|
||||
return parent::prepareRow($this->prepareComment($row));
|
||||
}
|
||||
|
||||
/**
|
||||
* This is a backward compatibility layer for the deprecated migrate source
|
||||
* plugins d6_comment_variable and d6_comment_variable_per_comment_type.
|
||||
*
|
||||
* @param \Drupal\migrate\Row $row
|
||||
* The row from the source to process.
|
||||
* @return \Drupal\migrate\Row
|
||||
* The row object.
|
||||
* @deprecated in Drupal 8.4.x, to be removed before Drupal 9.0.x.
|
||||
*/
|
||||
protected function prepareComment(Row $row) {
|
||||
if ($this->variableGet('comment_subject_field_' . $row->getSourceProperty('type'), 1)) {
|
||||
// Comment subject visible.
|
||||
$row->setSourceProperty('field_name', 'comment');
|
||||
@@ -42,10 +57,11 @@ class Comment extends DrupalSqlBase {
|
||||
$row->setSourceProperty('field_name', 'comment_no_subject');
|
||||
$row->setSourceProperty('comment_type', 'comment_no_subject');
|
||||
}
|
||||
|
||||
// In D6, status=0 means published, while in D8 means the opposite.
|
||||
// See https://www.drupal.org/node/237636.
|
||||
$row->setSourceProperty('status', !$row->getSourceProperty('status'));
|
||||
return parent::prepareRow($row);
|
||||
return $row;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,13 +2,19 @@
|
||||
|
||||
namespace Drupal\comment\Plugin\migrate\source\d6;
|
||||
|
||||
@trigger_error('CommentVariable is deprecated in Drupal 8.4.x and will be removed before Drupal 9.0.x. Use \Drupal\node\Plugin\migrate\source\d6\NodeType instead.', E_USER_DEPRECATED);
|
||||
|
||||
use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
|
||||
use Drupal\migrate\Plugin\migrate\source\DummyQueryTrait;
|
||||
|
||||
/**
|
||||
* @MigrateSource(
|
||||
* id = "d6_comment_variable"
|
||||
* id = "d6_comment_variable",
|
||||
* source_module = "comment"
|
||||
* )
|
||||
*
|
||||
* @deprecated in Drupal 8.4.x, to be removed before Drupal 9.0.x. Use
|
||||
* \Drupal\node\Plugin\migrate\source\d6\NodeType instead.
|
||||
*/
|
||||
class CommentVariable extends DrupalSqlBase {
|
||||
|
||||
|
||||
@@ -2,10 +2,16 @@
|
||||
|
||||
namespace Drupal\comment\Plugin\migrate\source\d6;
|
||||
|
||||
@trigger_error('CommentVariablePerCommentType is deprecated in Drupal 8.4.x and will be removed before Drupal 9.0.x. Use \Drupal\node\Plugin\migrate\source\d6\NodeType instead.', E_USER_DEPRECATED);
|
||||
|
||||
/**
|
||||
* @MigrateSource(
|
||||
* id = "d6_comment_variable_per_comment_type"
|
||||
* id = "d6_comment_variable_per_comment_type",
|
||||
* source_module = "comment"
|
||||
* )
|
||||
*
|
||||
* @deprecated in Drupal 8.4.x, to be removed before Drupal 9.0.x. Use
|
||||
* \Drupal\node\Plugin\migrate\source\d6\NodeType instead.
|
||||
*/
|
||||
class CommentVariablePerCommentType extends CommentVariable {
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ use Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity;
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "d7_comment",
|
||||
* source_provider = "comment"
|
||||
* source_module = "comment"
|
||||
* )
|
||||
*/
|
||||
class Comment extends FieldableEntity {
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace Drupal\comment\Plugin\migrate\source\d7;
|
||||
|
||||
@trigger_error('CommentType is deprecated in Drupal 8.4.x and will be removed before Drupal 9.0.x. Use \Drupal\node\Plugin\migrate\source\d7\NodeType instead.', E_USER_DEPRECATED);
|
||||
|
||||
use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface;
|
||||
use Drupal\migrate\Row;
|
||||
use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
|
||||
@@ -11,8 +13,11 @@ use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "d7_comment_type",
|
||||
* source_provider = "comment"
|
||||
* source_module = "comment"
|
||||
* )
|
||||
*
|
||||
* @deprecated in Drupal 8.4.x, to be removed before Drupal 9.0.x. Use
|
||||
* \Drupal\node\Plugin\migrate\source\d7\NodeType instead.
|
||||
*/
|
||||
class CommentType extends DrupalSqlBase {
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace Drupal\comment\Plugin\views\argument;
|
||||
|
||||
use Drupal\Core\Database\Connection;
|
||||
use Drupal\Core\Database\Query\Condition;
|
||||
use Drupal\views\Plugin\views\argument\ArgumentPluginBase;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
@@ -90,7 +91,7 @@ class UserUid extends ArgumentPluginBase {
|
||||
$subselect->where("c.entity_id = $this->tableAlias.$entity_id");
|
||||
$subselect->condition('c.entity_type', $entity_type);
|
||||
|
||||
$condition = db_or()
|
||||
$condition = (new Condition('OR'))
|
||||
->condition("$this->tableAlias.uid", $this->argument, '=')
|
||||
->exists($subselect);
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\comment\Plugin\views\field;
|
||||
|
||||
use Drupal\system\Plugin\views\field\BulkForm;
|
||||
|
||||
/**
|
||||
* Defines a comment operations bulk form element.
|
||||
*
|
||||
* @ViewsField("comment_bulk_form")
|
||||
*/
|
||||
class CommentBulkForm extends BulkForm {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function emptySelectedMessage() {
|
||||
return $this->t('Select one or more comments to perform the update on.');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\comment\Plugin\views\field;
|
||||
|
||||
use Drupal\views\Plugin\views\field\EntityField;
|
||||
use Drupal\views\ResultRow;
|
||||
|
||||
/**
|
||||
* Views field display for commented entity.
|
||||
*
|
||||
* @ViewsField("commented_entity")
|
||||
*/
|
||||
class CommentedEntity extends EntityField {
|
||||
|
||||
/**
|
||||
* Array of entities that has comments.
|
||||
*
|
||||
* We use this to load all the commented entities of same entity type at once
|
||||
* to the EntityStorageController static cache.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $loadedCommentedEntities = [];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getItems(ResultRow $values) {
|
||||
if (empty($this->loadedCommentedEntities)) {
|
||||
$result = $this->view->result;
|
||||
|
||||
$entity_ids_per_type = [];
|
||||
foreach ($result as $value) {
|
||||
/** @var \Drupal\comment\CommentInterface $comment */
|
||||
if ($comment = $this->getEntity($value)) {
|
||||
$entity_ids_per_type[$comment->getCommentedEntityTypeId()][] = $comment->getCommentedEntityId();
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($entity_ids_per_type as $type => $ids) {
|
||||
$this->loadedCommentedEntities[$type] = $this->entityManager->getStorage($type)->loadMultiple($ids);
|
||||
}
|
||||
}
|
||||
|
||||
return parent::getItems($values);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -72,7 +72,7 @@ class EntityLink extends FieldPluginBase {
|
||||
$entity = $this->getEntity($values);
|
||||
|
||||
// Only render the links, if they are defined.
|
||||
return !empty($this->build[$entity->id()]['links']['comment__comment']) ? drupal_render($this->build[$entity->id()]['links']['comment__comment']) : '';
|
||||
return !empty($this->build[$entity->id()]['links']['comment__comment']) ? \Drupal::service('renderer')->render($this->build[$entity->id()]['links']['comment__comment']) : '';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ class StatisticsLastCommentName extends FieldPluginBase {
|
||||
'#theme' => 'username',
|
||||
'#account' => $account,
|
||||
];
|
||||
return drupal_render($username);
|
||||
return \Drupal::service('renderer')->render($username);
|
||||
}
|
||||
else {
|
||||
return $this->sanitizeValue($this->getValue($values));
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace Drupal\comment\Plugin\views\filter;
|
||||
|
||||
use Drupal\Core\Database\Query\Condition;
|
||||
use Drupal\views\Plugin\views\filter\FilterPluginBase;
|
||||
|
||||
/**
|
||||
@@ -26,7 +27,7 @@ class UserUid extends FilterPluginBase {
|
||||
$subselect->where("c.entity_id = $this->tableAlias.$entity_id");
|
||||
$subselect->condition('c.entity_type', $entity_type);
|
||||
|
||||
$condition = db_or()
|
||||
$condition = (new Condition('OR'))
|
||||
->condition("$this->tableAlias.uid", $this->value, $this->operator)
|
||||
->exists($subselect);
|
||||
|
||||
|
||||
@@ -16,14 +16,14 @@ class Thread extends SortPluginBase {
|
||||
public function query() {
|
||||
$this->ensureMyTable();
|
||||
|
||||
//Read comment_render() in comment.module for an explanation of the
|
||||
//thinking behind this sort.
|
||||
// Read comment_render() in comment.module for an explanation of the
|
||||
// thinking behind this sort.
|
||||
if ($this->options['order'] == 'DESC') {
|
||||
$this->query->addOrderBy($this->tableAlias, $this->realField, $this->options['order']);
|
||||
}
|
||||
else {
|
||||
$alias = $this->tableAlias . '_' . $this->realField . 'asc';
|
||||
//@todo is this secure?
|
||||
// @todo is this secure?
|
||||
$this->query->addOrderBy(NULL, "SUBSTRING({$this->tableAlias}.{$this->realField}, 1, (LENGTH({$this->tableAlias}.{$this->realField}) - 1))", $this->options['order'], $alias);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,10 +129,12 @@ class CommentNewIndicatorTest extends CommentTestBase {
|
||||
$response = $this->renderNewCommentsNodeLinks([$this->node->id()]);
|
||||
$this->assertResponse(200);
|
||||
$json = Json::decode($response);
|
||||
$expected = [$this->node->id() => [
|
||||
'new_comment_count' => 1,
|
||||
'first_new_comment_link' => $this->node->url('canonical', ['fragment' => 'new']),
|
||||
]];
|
||||
$expected = [
|
||||
$this->node->id() => [
|
||||
'new_comment_count' => 1,
|
||||
'first_new_comment_link' => $this->node->url('canonical', ['fragment' => 'new']),
|
||||
],
|
||||
];
|
||||
$this->assertIdentical($expected, $json);
|
||||
|
||||
// Failing to specify node IDs for the endpoint should return a 404.
|
||||
|
||||
@@ -266,12 +266,18 @@ class CommentPagerTest extends CommentTestBase {
|
||||
$this->setCommentSettings('default_mode', CommentManagerInterface::COMMENT_MODE_FLAT, 'Comment paging changed.');
|
||||
|
||||
$expected_pages = [
|
||||
1 => 5, // Page of comment 5
|
||||
2 => 4, // Page of comment 4
|
||||
3 => 3, // Page of comment 3
|
||||
4 => 2, // Page of comment 2
|
||||
5 => 1, // Page of comment 1
|
||||
6 => 0, // Page of comment 0
|
||||
// Page of comment 5
|
||||
1 => 5,
|
||||
// Page of comment 4
|
||||
2 => 4,
|
||||
// Page of comment 3
|
||||
3 => 3,
|
||||
// Page of comment 2
|
||||
4 => 2,
|
||||
// Page of comment 1
|
||||
5 => 1,
|
||||
// Page of comment 0
|
||||
6 => 0,
|
||||
];
|
||||
|
||||
$node = Node::load($node->id());
|
||||
@@ -284,12 +290,18 @@ class CommentPagerTest extends CommentTestBase {
|
||||
$this->setCommentSettings('default_mode', CommentManagerInterface::COMMENT_MODE_THREADED, 'Switched to threaded mode.');
|
||||
|
||||
$expected_pages = [
|
||||
1 => 5, // Page of comment 5
|
||||
2 => 1, // Page of comment 4
|
||||
3 => 1, // Page of comment 4
|
||||
4 => 1, // Page of comment 4
|
||||
5 => 1, // Page of comment 4
|
||||
6 => 0, // Page of comment 0
|
||||
// Page of comment 5
|
||||
1 => 5,
|
||||
// Page of comment 4
|
||||
2 => 1,
|
||||
// Page of comment 4
|
||||
3 => 1,
|
||||
// Page of comment 4
|
||||
4 => 1,
|
||||
// Page of comment 4
|
||||
5 => 1,
|
||||
// Page of comment 0
|
||||
6 => 0,
|
||||
];
|
||||
|
||||
\Drupal::entityManager()->getStorage('node')->resetCache([$node->id()]);
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace Drupal\comment\Tests;
|
||||
|
||||
@trigger_error(__NAMESPACE__ . '\CommentTestBase is deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0. Use \Drupal\Tests\comment\Functional\CommentTestBase instead. See http://www.drupal.org/node/2908490', E_USER_DEPRECATED);
|
||||
|
||||
use Drupal\comment\Entity\CommentType;
|
||||
use Drupal\comment\Entity\Comment;
|
||||
use Drupal\comment\CommentInterface;
|
||||
@@ -12,6 +14,11 @@ use Drupal\simpletest\WebTestBase;
|
||||
|
||||
/**
|
||||
* Provides setup and helper methods for comment tests.
|
||||
*
|
||||
* @deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0.
|
||||
* Use \Drupal\Tests\comment\Functional\CommentTestBase instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2908490
|
||||
*/
|
||||
abstract class CommentTestBase extends WebTestBase {
|
||||
|
||||
@@ -159,7 +166,8 @@ abstract class CommentTestBase extends WebTestBase {
|
||||
preg_match('/#comment-([0-9]+)/', $this->getURL(), $match);
|
||||
|
||||
// Get comment.
|
||||
if ($contact !== TRUE) { // If true then attempting to find error message.
|
||||
if ($contact !== TRUE) {
|
||||
// If true then attempting to find error message.
|
||||
if ($subject) {
|
||||
$this->assertText($subject, 'Comment subject posted.');
|
||||
}
|
||||
@@ -192,12 +200,12 @@ abstract class CommentTestBase extends WebTestBase {
|
||||
}
|
||||
|
||||
$comment_title = $comment_element[0]->xpath('div/h3/a');
|
||||
if (empty($comment_title) || ((string)$comment_title[0]) !== $comment->getSubject()) {
|
||||
if (empty($comment_title) || ((string) $comment_title[0]) !== $comment->getSubject()) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$comment_body = $comment_element[0]->xpath('div/div/p');
|
||||
if (empty($comment_body) || ((string)$comment_body[0]) !== $comment->comment_body->value) {
|
||||
if (empty($comment_body) || ((string) $comment_body[0]) !== $comment->comment_body->value) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -354,7 +362,7 @@ abstract class CommentTestBase extends WebTestBase {
|
||||
$this->drupalPostForm('admin/content/comment' . ($approval ? '/approval' : ''), $edit, t('Update'));
|
||||
|
||||
if ($operation == 'delete') {
|
||||
$this->drupalPostForm(NULL, [], t('Delete comments'));
|
||||
$this->drupalPostForm(NULL, [], t('Delete'));
|
||||
$this->assertRaw(\Drupal::translation()->formatPlural(1, 'Deleted 1 comment.', 'Deleted @count comments.'), format_string('Operation "@operation" was performed on comment.', ['@operation' => $operation]));
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -2,13 +2,20 @@
|
||||
|
||||
namespace Drupal\comment\Tests\Views;
|
||||
|
||||
@trigger_error(__NAMESPACE__ . '\CommentTestBase is deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0. Use \Drupal\Tests\comment\Functional\Views\CommentTestBase instead. See http://www.drupal.org/node/2908490', E_USER_DEPRECATED);
|
||||
|
||||
use Drupal\comment\Tests\CommentTestTrait;
|
||||
use Drupal\views\Tests\ViewTestBase;
|
||||
use Drupal\views\Tests\ViewTestData;
|
||||
use Drupal\comment\Entity\Comment;
|
||||
|
||||
/**
|
||||
* Tests the argument_comment_user_uid handler.
|
||||
* Provides setup and helper methods for comment views tests.
|
||||
*
|
||||
* @deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0.
|
||||
* Use \Drupal\Tests\comment\Functional\Views\CommentTestBase instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2908490
|
||||
*/
|
||||
abstract class CommentTestBase extends ViewTestBase {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user