diff --git a/entity_translation.api.php b/entity_translation.api.php index c048d11..b968878 100644 --- a/entity_translation.api.php +++ b/entity_translation.api.php @@ -48,6 +48,8 @@ * - edit form: The key to be used to retrieve the entity object from the form * state array. An empty value prevents Entity translation from performing * alterations to the entity form. Defaults to ENTITY_TYPE. + * - skip original values access: A flag specifying whether skipping access + * control when editing original values for this entity. Defaults to FALSE. */ function hook_entity_info() { $info['custom_entity'] = array( diff --git a/entity_translation.info b/entity_translation.info index 58c8771..f4ba85d 100644 --- a/entity_translation.info +++ b/entity_translation.info @@ -8,6 +8,7 @@ files[] = includes/translation.handler.inc files[] = includes/translation.handler.comment.inc files[] = includes/translation.handler.node.inc files[] = includes/translation.handler.taxonomy_term.inc +files[] = includes/translation.handler.user.inc files[] = tests/entity_translation.test files[] = views/entity_translation_handler_relationship.inc files[] = views/entity_translation_handler_field_translate_link.inc diff --git a/entity_translation.install b/entity_translation.install index ffff0b8..d973b1d 100644 --- a/entity_translation.install +++ b/entity_translation.install @@ -93,6 +93,73 @@ function entity_translation_install() { // Make translation use the content language type. variable_set('translation_language_type', LANGUAGE_TYPE_CONTENT); + + // Grant the 'edit original values' permission, so we don't break editing on + // existing sites. + $msg = _entity_translation_grant_original_values_permissions(); + drupal_set_message($msg); +} + +/** + * Grant 'edit $type original values' permission to existing roles. + */ +function _entity_translation_grant_original_values_permissions() { + $permissions = array(); + + // Nodes. + $permissions['node'][] = 'bypass node access'; + foreach (node_permissions_get_configured_types() as $type) { + $permissions['node'][] = "edit own $type content"; + $permissions['node'][] = "edit any $type content"; + } + + // Comments. + $permissions['comment'][] = 'administer comments'; + if (module_exists('comment')) { + $permissions['comment'][] = 'edit own comments'; + } + + // Taxonomy terms. + if (module_exists('taxonomy')) { + $permissions['taxonomy_term'][] = 'administer taxonomy'; + foreach (taxonomy_get_vocabularies() as $vocabulary) { + $permissions['taxonomy_term'][] = "edit terms in {$vocabulary->vid}"; + } + } + + $assignments = array(); + foreach ($permissions as $entity_type => $permissions_filter) { + $permission = "edit $entity_type original values"; + $assignments[] = _entity_translation_grant_permission($permission, $permissions_filter); + } + $assignments = ''; + + $t = get_t(); + return $t('The following permissions have been assigned to existing roles: !assignments', array('!assignments' => $assignments)); +} + +/** + * Grant the given permission to all roles which already have any of the + * permissions specified in the $permissions_filter parameter. + * + * @param $permission + * The new permission which to grant. + * @param $permissions_filter + * List of permissions used for loading roles. + * + * @return + * A message describing permission changes. + */ +function _entity_translation_grant_permission($permission, $permissions_filter = NULL) { + $roles = user_roles(FALSE, $permissions_filter); + foreach ($roles as $rid => $role) { + user_role_grant_permissions($rid, array($permission)); + } + $t = get_t(); + return $t('%permission was assigned to %roles', array( + '%permission' => $permission, + '%roles' => implode(', ', $roles) + )); } /** @@ -167,3 +234,10 @@ function entity_translation_update_7001() { ->condition('name', 'entity_translation') ->execute(); } + +/** + * Grant 'edit original values' permission to roles which have entity editing permissions. + */ +function entity_translation_update_7002() { + return _entity_translation_grant_original_values_permissions(); +} diff --git a/entity_translation.module b/entity_translation.module index 01934df..71b01b0 100644 --- a/entity_translation.module +++ b/entity_translation.module @@ -84,6 +84,15 @@ function entity_translation_entity_info() { ); } + $info['user'] = array( + 'translation' => array( + 'entity_translation' => array( + 'class' => 'EntityTranslationUserHandler', + 'skip original values access' => TRUE, + ), + ), + ); + return $info; } @@ -510,14 +519,14 @@ function entity_translation_permission() { 'title' => t('Edit shared fields'), 'description' => t('Edit fields shared between translations on the translation form.'), ), - 'edit original values' => array( - 'title' => t('Edit original values'), - 'description' => t('Access the entity edit form in the original language.'), - ), 'translate any entity' => array( 'title' => t('Translate any entity'), 'description' => t('Translate field content for any fieldable entity.'), ), + 'edit original values' => array( + 'title' => t('Edit original values'), + 'description' => t('Access any entity edit form in the original language.'), + ), ); foreach (entity_get_info() as $entity_type => $info) { @@ -527,6 +536,16 @@ function entity_translation_permission() { 'title' => t('Translate entities of type @type', array('@type' => $label)), 'description' => t('Translate field content for entities of type @type.', array('@type' => $label)), ); + + // Avoid access control for original values on the current entity. + if (!empty($info['translation']['entity_translation']['skip original values access'])) { + continue; + } + + $permission["edit $entity_type original values"] = array( + 'title' => t('Edit original values on entities of type @type', array('@type' => $label)), + 'description' => t('Access the edit form in the original language for entities of type @type.', array('@type' => $label)), + ); } } diff --git a/includes/translation.handler.inc b/includes/translation.handler.inc index 5c64f3b..63ff802 100644 --- a/includes/translation.handler.inc +++ b/includes/translation.handler.inc @@ -662,7 +662,7 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa * @see EntityTranslationHandlerInterface::getTranslationAccess() */ public function getTranslationAccess($langcode) { - return $langcode != $this->getLanguage() || user_access('edit original values'); + return $langcode != $this->getLanguage() || user_access('edit original values') || user_access("edit {$this->entityType} original values"); } /** diff --git a/includes/translation.handler.user.inc b/includes/translation.handler.user.inc new file mode 100644 index 0000000..a1c75f8 --- /dev/null +++ b/includes/translation.handler.user.inc @@ -0,0 +1,23 @@ +