You are here

function support_ticket_entity_update in Support Ticketing System 8

Implements hook_entity_update().

Parameters

object $support_ticket: The support ticket entity object.

File

modules/support_ticket/support_ticket.module, line 256
Enables use of support tickets with optional time tracking.

Code

function support_ticket_entity_update($support_ticket) {

  // Determines what fields have changed when the support ticket is updated.
  if ($support_ticket instanceof SupportTicketInterface && !empty($support_ticket->original)) {
    $type = SupportTicketType::load($support_ticket
      ->bundle());
    if (!($field_name = _support_ticket_comment_diff_field($type
      ->id()))) {

      // There's no field to write revision diffs into, so skip calculating a diff.
      return;
    }
    $field_storage = FieldStorageConfig::loadByName('support_ticket', $field_name);
    $comment_type = $field_storage
      ->getSetting('comment_type');
    if (!($diff_revision_changes_field = _support_ticket_comment_diff_revision_changes($type
      ->id(), $comment_type))) {

      // There's no field to write revision diffs into, so skip calculating a diff.
      return;
    }

    // Load some variables we need to generate a properly formatted diff.
    $config = \Drupal::configFactory()
      ->get('support_ticket.settings');
    $filter_format = $config
      ->get('support_ticket_type_settings.' . $type
      ->id() . '.filter_format');

    // Get a RevisionController to generate a diff.
    $diffFormatter = \Drupal::service('diff.diff.formatter');
    $dateFormatter = \Drupal::service('date.formatter');
    $pluginManager = \Drupal::service('plugin.manager.diff.builder');
    $diffEntityParser = \Drupal::service('diff.entity_parser');
    $revisionController = new \Drupal\support_ticket\Controller\SupportTicketRevisionController($diffFormatter, $dateFormatter, $pluginManager, $diffEntityParser);

    // Compare the original entity with the current revision.
    $original = $support_ticket->original;
    $fields = $revisionController
      ->compareRevisions($original, $support_ticket);
    $diff_rows = array();

    // Format the differences as rows in a table.
    foreach ($fields as $field) {
      $field_label_row = '';
      if (!empty($field['#name'])) {
        $field_label_row = array(
          'data' => t('Changes to %name', array(
            '%name' => $field['#name'],
          )),
          'colspan' => 4,
          'class' => array(
            'field-name',
          ),
        );
      }
      $field_diff_rows = _support_ticket_get_rows($field['#states']['raw']['#left'], $field['#states']['raw']['#right']);

      // Add the field label to the table only if there are changes to that field.
      if (!empty($field_diff_rows) && !empty($field_label_row)) {
        $diff_rows[] = array(
          $field_label_row,
        );
      }

      // Add field diff rows to the table rows.
      $diff_rows = array_merge($diff_rows, $field_diff_rows);
    }

    // Create our render array.
    $build['diff'] = array(
      '#type' => 'table',
      '#rows' => $diff_rows,
      '#empty' => t('No visible changes'),
      '#attributes' => array(
        'class' => array(
          'diff',
        ),
      ),
    );

    // Store generated diff as a comment.
    $diff_comment = array(
      'cid' => NULL,
      'uid' => \Drupal::currentUser()
        ->id(),
      'entity_id' => $support_ticket
        ->id(),
      'entity_type' => 'support_ticket',
      'field_name' => $field_name,
      'pid' => 0,
      'comment_body' => array(
        'value' => '<em>' . t('Automatically generated:') . '</em>',
        'format' => $filter_format,
      ),
      $diff_revision_changes_field => array(
        'value' => \Drupal::service('renderer')
          ->renderPlain($build['diff']),
        'format' => $filter_format,
      ),
      'comment_type' => $comment_type,
    );

    // Store revision ID if the field exists.
    if ($diff_revision_reference_field = _support_ticket_comment_diff_revision_reference($type
      ->id(), $comment_type)) {
      $diff_comment[$diff_revision_reference_field] = $support_ticket
        ->getRevisionId();
    }
    entity_create('comment', $diff_comment)
      ->save();
  }
}