Drupal 8:自定义评论排序
Drupal 8 的评论系统具有线程化功能,以便用户可以直接回复其他用户的评论并创建对话线程。我一直觉得这很难使用和阅读,所以我想在我设置这个网站时把它关掉。我遇到的唯一问题是我可以关闭线程,但无法更改评论的顺序。
Drupal 8 中默认的注释排序是按线程排序的。这意味着即使您关闭线程,评论也始终按线程顺序显示。Drupal 使用 CommentDefaultFormatter 类来显示注释并包含这行代码。
$comments = $this->storage->loadThread($entity, $field_name, $mode, $comments_per_page, $this->getSetting('pager_id'));
没有选项可以将其更改loadThread()为其他内容,这意味着只要 Drupal 使用此类来显示注释,它将始终使用此方法。
要覆盖它,我们可以使用自定义 FieldFormatter 插件并使用自定义格式化程序重新排序注释。
在自定义模块中,在 src/Plugin/Field/FieldFormatter/CustomCommentFormatter.php 创建一个类。这是允许我们提供我们自己的自定义评论排序的插件。这个类只是扩展了 CommentDefaultFormatter 类(这是我们想要覆盖的类),所以我们只需要包含我们需要覆盖的方法。
<?php
namespace Drupal\custom_comment_module\Plugin\Field\FieldFormatter;
use Drupal\comment\Plugin\Field\FieldFormatter\CommentDefaultFormatter;
/**
* Provides a custom comment formatter to order comments by date.
*
* @FieldFormatter(
* id = "comment_orderbydate",
* module = "comment",
* label = @Translation("Custom comment list"),
* field_types = {
* "comment"
* },
* quickedit = {
* "editor" = "disabled"
* }
* )
*/
class CustomCommentFormatter extends CommentDefaultFormatter {
}
由于在 Drupal 中检索和排序评论的方式,我们需要覆盖 CommentStorage 类以更改评论的加载方式。这可以通过使用 hook_entity_type_alter()更改 Comment 实体的存储处理程序来实现。这将通过以下方式完成。
/*** Implements hook_entity_type_alter().
*/
function custom_comment_entity_type_alter(array &$entity_types) {
$entity_types['page']->setHandlerClass('storage', CustomCommentStorage::class);
}
另一种(也许更简单?)的方法是loadThread()用一些能以我们想要的方式加载注释的东西替换类中的方法。为此,我首先需要修改 CustomCommentFormatter 类,以便通过依赖注入加载到数据库中。虽然看起来我在这里写了很多代码,但实际上只是添加了数据库处理程序,所有其他注入的依赖项已经被 CommentDefaultFormatter 类使用,因此需要包含在内。
<?php
namespace Drupal\custom_comment_module\Plugin\Field\FieldFormatter;
use Drupal\comment\Plugin\Field\FieldFormatter\CommentDefaultFormatter;
use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface;
use Drupal\comment\CommentInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Entity\EntityFormBuilderInterface;
use Drupal\Core\Routing\RouteMatchInterface;
/**
* Provides a custom comment formatter to order comments by date.
*
* @FieldFormatter(
* id = "comment_orderbydate",
* module = "comment",
* label = @Translation("Custom comment list"),
* field_types = {
* "comment"
* },
* quickedit = {
* "editor" = "disabled"
* }
* )
*/
class CustomCommentFormatter extends CommentDefaultFormatter {
/**
* The entity form builder.
*
* @var \Drupal\Core\Database\Connection
*/
protected $database;
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$plugin_id,
$plugin_definition,
$configuration['field_definition'],
$configuration['settings'],
$configuration['label'],
$configuration['view_mode'],
$configuration['third_party_settings'],
$container->get('current_user'),
$container->get('entity.manager'),
$container->get('entity.form_builder'),
$container->get('current_route_match'),
$container->get('database')
);
}
/**
* CustomCommentFormatter constructor.
*
* @param string $plugin_id
* The plugin_id for the formatter.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
* The definition of the field to which the formatter is associated.
* @param array $settings
* The formatter settings.
* @param string $label
* The formatter label display setting.
* @param string $view_mode
* The view mode.
* @param array $third_party_settings
* Third party settings.
* @param \Drupal\Core\Session\AccountInterface $current_user
* The current user.
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
* The entity manager
* @param \Drupal\Core\Entity\EntityFormBuilderInterface $entity_form_builder
* The entity form builder.
* @param \Drupal\Core\Routing\RouteMatchInterface $route_match
* The route match object.
* @param \Drupal\Core\Database\Connection $database
* The database connection to be used.
*/
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, AccountInterface $current_user, EntityManagerInterface $entity_manager, EntityFormBuilderInterface $entity_form_builder, RouteMatchInterface $route_match, Connection $database) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings, $current_user, $entity_manager, $entity_form_builder, $route_match);
$this->database = $database;
}
}
有了这个,我们就可以添加一个自定义loadComments()方法。此方法与 方法非常相似loadThread(),但在这种情况下,它按日期加载评论,按升序排列。
/*** Retrieves comments for a thread, sorted in an order suitable for display.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The entity whose comment(s) needs rendering.
* @param string $field_name
* The field_name whose comment(s) needs rendering.
* @param int $mode
* The comment display mode: CommentManagerInterface::COMMENT_MODE_FLAT or
* CommentManagerInterface::COMMENT_MODE_THREADED.
* @param int $comments_per_page
* (optional) The amount of comments to display per page.
* Defaults to 0, which means show all comments.
* @param int $pager_id
* (optional) Pager id to use in case of multiple pagers on the one page.
* Defaults to 0; is only used when $comments_per_page is greater than zero.
*
* @return array
* Ordered array of comment objects, keyed by comment id.
*/
public function loadComments(EntityInterface $entity, $field_name, $mode, $comments_per_page = 0, $pager_id = 0) {
$query = $this->database->select('comment_field_data', 'c');
$query->addField('c', 'cid');
$query
->condition('c.entity_id', $entity->id())
->condition('c.entity_type', $entity->getEntityTypeId())
->condition('c.field_name', $field_name)
->condition('c.default_langcode', 1)
->addTag('entity_access')
->addTag('comment_filter')
->addMetaData('base_table', 'comment')
->addMetaData('entity', $entity)
->addMetaData('field_name', $field_name);
if ($comments_per_page) {
$query = $query->extend('Drupal\Core\Database\Query\PagerSelectExtender')
->limit($comments_per_page);
if ($pager_id) {
$query->element($pager_id);
}
$count_query = $this->database->select('comment_field_data', 'c');
$count_query->addExpression('COUNT(*)');
$count_query
->condition('c.entity_id', $entity->id())
->condition('c.entity_type', $entity->getEntityTypeId())
->condition('c.field_name', $field_name)
->condition('c.default_langcode', 1)
->addTag('entity_access')
->addTag('comment_filter')
->addMetaData('base_table', 'comment')
->addMetaData('entity', $entity)
->addMetaData('field_name', $field_name);
$query->setCountQuery($count_query);
}
if (!$this->currentUser->hasPermission('administer comments')) {
$query->condition('c.status', CommentInterface::PUBLISHED);
if ($comments_per_page) {
$count_query->condition('c.status', CommentInterface::PUBLISHED);
}
}
$query->orderBy('c.created', 'ASC');
$cids = $query->execute()->fetchCol();
$comments = [];
if ($cids) {
$comments = $this->storage->loadMultiple($cids);
}
return $comments;
}
现在所需要做的就是将viewElements()方法更改为 使用新loadComments()方法而不是loadThread().
$comments = $this->loadComments($entity, $field_name, $mode, $comments_per_page, $this->getSetting('pager_id'));
激活模块后,我们现在可以从管理显示管理区域中选择格式化程序。这可以在启用评论的内容类型的字段管理区域中找到。
保存表单后,评论将按日期顺序排列。
以上是 Drupal 8:自定义评论排序 的全部内容, 来源链接: utcz.com/z/359258.html