You are here

function taxonomy_revision_entity_diff in Taxonomy revision 7

Implements hook_entity_diff().

This function compares core taxonomy term properties. This is currently limited to:

  • name: The title of term.
  • description: The description of the term.

File

./taxonomy_revision.module, line 150
This is the main module file for the Taxonomy revision module.

Code

function taxonomy_revision_entity_diff($old_term, $new_term, $context) {
  $result = array();
  if ($context['entity_type'] == 'taxonomy_term') {

    // The wrappers are created for each field even though there are no
    // differences for the title (name) for example.
    $taxonomy_term_properties = entity_get_property_info('taxonomy_term');
    $new_term_wrapper = entity_metadata_wrapper('taxonomy_term', $new_term);
    $old_term_wrapper = entity_metadata_wrapper('taxonomy_term', $old_term);

    // We unset the entity id property because we don't want to diff it.
    unset($taxonomy_term_properties['properties']['tid']);
    $old_term_rendered = taxonomy_term_view($old_term);
    $new_term_rendered = taxonomy_term_view($new_term);
    foreach ($taxonomy_term_properties['properties'] as $property_name => $property) {
      if (empty($property['vocabulary'])) {
      }
      if (empty($property['computed'])) {

        // Not taking into much consideration how the settings for the node are made,
        // we create our settings similarly for each of our fields.
        $result[$property_name] = array(
          '#name' => $property['label'],
          '#states' => array(),
          '#weight' => -5,
          '#settings' => array(
            'compare_format' => 0,
            'markdown' => 'drupal_html_to_text',
            'line_counter' => '',
            'compare_summary' => 0,
            'show_header' => 1,
          ),
        );
        foreach ($context['states'] as $state) {

          // We need use the raw() not the value() function (Entity Wrapper).
          // The value() includes html tags which we don't need.
          // This however doesn't recognize some values correctly, but those values are not relevant for our task.
          $old_property = $old_term_wrapper->{$property_name}
            ->raw();
          $new_property = $new_term_wrapper->{$property_name}
            ->raw();

          // The Entity Wrapper generates objects.
          if (!is_object($old_property) && !is_object($new_property)) {
            switch ($state) {
              case 'rendered':
                $result[$property_name]['#states'][$state] = array(
                  '#old' => isset($old_term_rendered[$property_name]) ? drupal_render($old_term_rendered[$property_name]) : $old_term_rendered->{$property_name}
                    ->raw(),
                  '#new' => isset($new_term_rendered[$property_name]) ? drupal_render($new_term_rendered[$property_name]) : $new_term_rendered->{$property_name}
                    ->raw(),
                );
                break;

              // In case of raw_plain (taxonomy_revision only), for the node_revision there is only raw,
              // We create our array efficiently for our diff (module) functions to identify the parameters correctly.
              case 'raw_plain':
                $result[$property_name]['#states']['raw'] = array(
                  '#old' => $old_property,
                  '#new' => $new_property,
                );
                break;

              // Anything out of the ordinary will be considered : raw.
              default:
                $result[$property_name]['#states'][$state] = array(
                  '#old' => $old_property,
                  '#new' => $new_property,
                );
                break;
            }
          }
        }
      }
    }
  }
  return $result;
}