댓글의 수정된 시각 출력

Submitted by westporch on 2018.03.10.(Sat) - 13:31

댓글을 수정하면 댓글의 수정 시각이 출력되도록 하였습니다. 기존에는 댓글의 최초 작성 시각만 출력되며, 댓글의 수정 시각은 출력되지 않는 문제가 있었습니다. 댓글 작성·수정시 출력되는 샘플 정보는 아래와 같습니다.

* 변경 전(前)  
westporch
Sat, 03/10/2018 - 12:28

* 변경 후(後)
westporch
Submitted: Sat, 03/10/2018 - 12:28
Modified: Sat, 03/10/2018 - 13:20

1. 해결 방법
drupal/core/themes/bartik/templates/comment.html.twig 파일을 아래와 같이 수정함으로써 댓글이 수정된 시각을 출력할 수 있었습니다.

(.. 생략 ..)
-    <p class="comment__time">{{ created }}</p>
+    <p class="comment__time">Submitted: {{ created }}</p>
+    <p class="comment__time">Modified: {{ changed }}</p>
(.. 생략 ..)

가장 먼저 드루팔의 관리자 설정 화면에서 댓글의 수정된 시각을 출력하는 옵션을 찾아보았지만 이와 관련된 설정은 없었습니다. 대략 2시간 동안 구글링을 해봤지만 원하는 답을 찾을 수 없었습니다. 그래서 직접 드루팔의 테마·모듈 파일들을 열어본 결과 comment.html.twig 파일을 수정하면 댓글의 수정된 시각을 출력할 수 있다는 것을 알게 되었습니다.

2. 작업 과정
이 항목에서는 세부 작업 과정을 설명합니다.

2.1. 드루팔 테마의 댓글 관련 파일(comment.html.twig) 확인
드루팔의 테마(bartik) 파일을 수정하면 댓글 시간을 출력할 수 있을 것 같았습니다. 그래서 드루팔 테마의 댓글 관련 파일인 drupal/core/themes/bartik/templates/comment.html.twig를 살펴보았습니다. 이 파일에서 아래와 같은 created, changed 변수에 대한 설명을 확인할 수 있었습니다.

{#
/**
 * @file
 * Bartik's theme implementation for comments.
 *
 * Available variables:
 * - author: Comment author. Can be a link or plain text.
(.. 생략 ..)
 * - created: Formatted date and time for when the comment was created.
 *   Preprocess functions can reformat it by calling format_date() with the
 *   desired parameters on the 'comment.created' variable.
 * - changed: Formatted date and time for when the comment was last changed.
(.. 생략 ..)
 */
#}

2.2. 드루팔의 댓글 모듈(comment.module) 확인
comment.html.twig에서 찾은 changed 변수가 댓글 모듈(drupal/core/modules/comment/comment.module)에서 어떻게 사용되는지 궁금해서 comment.module 파일을 열어보았습니다. 아래처럼 comment.module 파일에서 template_preprocess_comment 함수에서 댓글의 변경된 시각을 가져오는 부분(if-else 구문)을 찾았습니다.

function template_preprocess_comment(&$variables) {
  /** @var \Drupal\comment\CommentInterface $comment */
  $comment = $variables['elements']['#comment'];
  $commented_entity = $comment->getCommentedEntity();
  $variables['comment'] = $comment;
  $variables['commented_entity'] = $commented_entity;
  $variables['threaded'] = $variables['elements']['#comment_threaded'];

  $account = $comment->getOwner();
  $username = array(
    '#theme' => 'username',
    '#account' => $account,
  );
  $variables['author'] = drupal_render($username);
  $variables['author_id'] = $comment->getOwnerId();
  $variables['new_indicator_timestamp'] = $comment->getChangedTime();
  $variables['created'] = format_date($comment->getCreatedTime());
  // Avoid calling format_date() twice on the same timestamp.
  if ($comment->getChangedTime() == $comment->getCreatedTime()) {
    $variables['changed'] = $variables['created'];
  }
  else {
    $variables['changed'] = format_date($comment->getChangedTime());
  }
(.. 이하 생략 ..)
}

2.3. comment.html.twig 파일 수정
comment.html.twig{{ created }} 처럼 {{ changed }}를 추가하면 댓글의 수정된 시각을 출력할 수 있을 것 같았습니다. 그래서 댓글의 변경된 시각을 출력하기 위해서 comment.html.twig 파일을 아래와 같이 수정했습니다.

<article role="article"{{ attributes.addClass(classes)|without('role') }}>
  {#
    Hide the "new" indicator by default, let a piece of JavaScript ask the
    server which comments are new for the user. Rendering the final "new"
    indicator here would break the render cache.
  #}
  <span class="hidden" data-comment-timestamp="{{ new_indicator_timestamp }}"></span>

  <footer class="comment__meta">
    {{ user_picture }}
    <p class="comment__author">{{ author }}</p>
-    <p class="comment__time">{{ created }}</p>
+    <p class="comment__time">Submitted: {{ created }}</p>
+    <p class="comment__time">Modified: {{ changed }}</p>
    <p class="comment__permalink">{{ permalink }}</p>
    {#
      Indicate the semantic relationship between parent and child comments
      for accessibility. The list is difficult to navigate in a screen
      reader without this information.
    #}
    {% if parent %}
      <p class="visually-hidden">{{ parent }}</p>
    {% endif %}
  </footer>

  <div{{ content_attributes.addClass('comment__content') }}>
    {% if title %}
      {{ title_prefix }}
      <h3{{ title_attributes }}>{{ title }}</h3>
      {{ title_suffix }}
    {% endif %}
    {{ content }}
  </div>
</article>

2.4. 작업 내용 확인
수정된 comment.html.twig 파일의 내용을 반영하기 위해서 관리자 페이지에서 드루팔의 Cache를 비웠습니다. 이후 댓글이 작성·수정된 페이지를 새로고침하니 댓글의 작성 시각뿐만 아니라 댓글의 수정 시각도 추가로 확인할 수 있었습니다.

westporch
Submitted: Sat, 03/10/2018 - 12:28
Modified: Sat, 03/10/2018 - 13:20