diff --git a/metatag.install b/metatag.install index 6ff3292..cfcd582 100644 --- a/metatag.install +++ b/metatag.install @@ -72,7 +72,13 @@ function metatag_schema() { 'default' => 0, 'description' => 'The entity id this data is attached to.', ), - // @todo Enable revisionable meta tags. + 'vid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => FALSE, + 'default' => 0, + 'description' => 'The entity id vid this data is attached to' + ), 'data' => array( 'type' => 'blob', 'size' => 'big', @@ -87,7 +93,7 @@ function metatag_schema() { 'description' => 'The language of the tag.', ), ), - 'primary key' => array('entity_type', 'entity_id', 'language'), + 'primary key' => array('entity_type', 'entity_id', 'vid', 'language'), ); $schema['cache_metatag'] = drupal_get_schema_unprocessed('system', 'cache'); @@ -880,3 +886,14 @@ function metatag_update_7014() { drupal_set_message(t('Fixed @count corrupt meta tag record(s).', array('@count' => $records->rowCount()))); } } + +/** + * Implementation of hook_update_N() + * Add the vid from the entity into metatag schema + * Reset the primary keys to include vid + */ +function metatag_update_7015() { + db_add_field('metatag', 'vid', array('type' => 'int', 'unsigned' => TRUE, 'not null' => FALSE, 'default' => 0, 'description' => 'The entity id vid this data is attached to')); + db_drop_primary_key('metatag'); + db_add_primary_key('metatag', array('entity_type', 'entity_id', 'vid', 'language')); +} \ No newline at end of file diff --git a/metatag.module b/metatag.module index fd40f54..8da820b 100644 --- a/metatag.module +++ b/metatag.module @@ -348,7 +348,7 @@ function metatag_metatags_load($entity_type, $entity_id) { * @return * An array of tag data, keyed by ID. */ -function metatag_metatags_load_multiple($entity_type, array $entity_ids) { +function metatag_metatags_load_multiple($entity_type, array $entity_ids, array $vids) { // Double check entity IDs are numeric thanks to Entity API module. $entity_ids = array_filter($entity_ids, 'is_numeric'); if (empty($entity_ids)) { @@ -368,10 +368,11 @@ function metatag_metatags_load_multiple($entity_type, array $entity_ids) { } // Get all translations of tag data for this entity. - $result = db_query("SELECT entity_id, data, language FROM {metatag} WHERE (entity_type = :type) AND (entity_id IN (:ids))", array( + $result = db_query("SELECT entity_id, data, language FROM {metatag} WHERE (entity_type = :type) AND (entity_id IN (:ids) AND (vid IN (:vids))", array( ':type' => $entity_type, ':ids' => $entity_ids, - )); + ':vids' => $vids, + )); // Marshal it into an array keyed by entity ID. Each value is an array of // translations keyed by language code. @@ -394,13 +395,18 @@ function metatag_metatags_load_multiple($entity_type, array $entity_ids) { * All of the tag information * @param $language * The language of the translation set + * @param $vid + * The entity VID */ -function metatag_metatags_save($entity_type, $entity_id, $metatags, $language) { +function metatag_metatags_save($entity_type, $entity_id, $metatags, $language, $vid) { // If no language assigned, use the has-no-language language. if (!$language) { $language = LANGUAGE_NONE; } + if (empty($vid)) { + $vid = $entity_id; + } // Check that $entity_id is numeric because of Entity API and string IDs. if (!is_numeric($entity_id)) { return; @@ -426,7 +432,7 @@ function metatag_metatags_save($entity_type, $entity_id, $metatags, $language) { // hook_metatag_presave(). foreach (module_implements('metatag_presave') as $module) { $function = "{$module}_metatag_presave"; - $function($metatags, $entity_type, $entity_id, $language); + $function($metatags, $entity_type, $entity_id, $language, $vid); } if (empty($metatags)) { @@ -445,6 +451,7 @@ function metatag_metatags_save($entity_type, $entity_id, $metatags, $language) { 'entity_type' => $entity_type, 'entity_id' => $entity_id, 'language' => $language, + 'vid' => $vid, )) ->fields(array( 'data' => serialize($metatags), @@ -463,12 +470,14 @@ function metatag_metatags_save($entity_type, $entity_id, $metatags, $language) { * The entity type * @param $entity_id * The entity's ID + * @param $vid + * The entity's VID * @param $langcode * The language ID of the entry to delete. If left blank, all language * entries for this entity will be deleted. */ -function metatag_metatags_delete($entity_type, $entity_id, $langcode = NULL) { - return metatag_metatags_delete_multiple($entity_type, array($entity_id), $langcode); +function metatag_metatags_delete($entity_type, $entity_id, $vid, $langcode = NULL) { + return metatag_metatags_delete_multiple($entity_type, array($entity_id), array($vid), $langcode); } /** @@ -478,20 +487,22 @@ function metatag_metatags_delete($entity_type, $entity_id, $langcode = NULL) { * The entity type * @param $entity_ids * The list of IDs + * @param $vid + * The list of VIDs * @param $langcode * The language ID of the entities to delete. If left blank, all language * entries for the enities will be deleted. */ -function metatag_metatags_delete_multiple($entity_type, array $entity_ids, $langcode = NULL) { +function metatag_metatags_delete_multiple($entity_type, array $entity_ids, array $vids, $langcode = NULL) { // Double check entity IDs are numeric thanks to Entity API module. $entity_ids = array_filter($entity_ids, 'is_numeric'); - if ($metatags = metatag_metatags_load_multiple($entity_type, $entity_ids)) { + if ($metatags = metatag_metatags_load_multiple($entity_type, $entity_ids, $vids)) { $transaction = db_transaction(); try { // Let other modules know about the records being deleted using // hook_metatag_metatags_delete(). - module_invoke_all('metatag_metatags_delete', $entity_type, $entity_ids, $langcode); + module_invoke_all('metatag_metatags_delete', $entity_type, $entity_ids, $vids, $langcode); // Set the entity to delete. $query = db_delete('metatag') @@ -533,11 +544,21 @@ function metatag_metatags_cache_clear($entity_type, $entity_id = NULL) { * Implements hook_entity_load(). */ function metatag_entity_load($entities, $entity_type) { + // get the vids + $vids = array(); + //since some entities do not have revisions, set the vid to the id + foreach ($entities as $key => $entity) { + list($entity_id, $vid) = entity_extract_ids($entity_type, $entity); + if (!$vid) { + $vid = $entity_id; + } + $vids[] = $vid; + } // Wrap this in a try-catch block to work around occasions when the schema // hasn't been updated yet. try { if (metatag_entity_supports_metatags($entity_type)) { - $metatags = metatag_metatags_load_multiple($entity_type, array_keys($entities)); + $metatags = metatag_metatags_load_multiple($entity_type, array_keys($entities), $vids); foreach ($entities as $entity_id => $entity) { $entities[$entity_id]->metatags = isset($metatags[$entity_id]) ? $metatags[$entity_id] : array(); } @@ -557,12 +578,12 @@ function metatag_entity_load($entities, $entity_type) { */ function metatag_entity_insert($entity, $entity_type) { if (isset($entity->metatags)) { - list($entity_id) = entity_extract_ids($entity_type, $entity); + list($entity_id, $vid) = entity_extract_ids($entity_type, $entity); // Determine the entity's language. $language = metatag_entity_get_language($entity_type, $entity); - metatag_metatags_save($entity_type, $entity_id, $entity->metatags, $language); + metatag_metatags_save($entity_type, $entity_id, $entity->metatags, $language, $vid); } } @@ -574,7 +595,7 @@ function metatag_entity_update($entity, $entity_type) { return; } - list($entity_id) = entity_extract_ids($entity_type, $entity); + list($entity_id, $vid) = entity_extract_ids($entity_type, $entity); if (isset($entity->metatags)) { // Determine the entity's language. @@ -597,7 +618,7 @@ function metatag_entity_update($entity, $entity_type) { } // Save the record. - metatag_metatags_save($entity_type, $entity_id, $entity->metatags, $new_language); + metatag_metatags_save($entity_type, $entity_id, $entity->metatags, $new_language, $vid); } else { // Still ensure the meta tag output is cached. @@ -609,8 +630,8 @@ function metatag_entity_update($entity, $entity_type) { * Implements hook_entity_delete(). */ function metatag_entity_delete($entity, $entity_type) { - list($entity_id) = entity_extract_ids($entity_type, $entity); - metatag_metatags_delete($entity_type, $entity_id); + list($entity_id, $vid) = entity_extract_ids($entity_type, $entity); + metatag_metatags_delete($entity_type, $entity_id, $vid); } /** @@ -696,7 +717,7 @@ function metatag_entity_view($entity, $entity_type, $view_mode, $langcode) { // hook_metatag_page_cache_cid_parts_alter(). drupal_alter('metatag_page_cache_cid_parts', $cid_parts); - $cid = "output:{$entity_type}:{$entity_id}:{$langcode}:" . hash('sha256', serialize($cid_parts)); + $cid = "output:{$entity_type}:{$entity_id}:{$entity->vid}:{$langcode}:" . hash('sha256', serialize($cid_parts)); if ($cache = cache_get($cid, 'cache_metatag')) { $output = $cache->data;