|  | @@ -1,61 +1,303 @@
 | 
	
		
			
				|  |  |  <?php
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +//    __  __                                 __  __  _
 | 
	
		
			
				|  |  | +//   / / / /_______  __________   ________  / /_/ /_(_)___  ____ ______
 | 
	
		
			
				|  |  | +//  / / / / ___/ _ \/ ___/ ___/  / ___/ _ \/ __/ __/ / __ \/ __ `/ ___/
 | 
	
		
			
				|  |  | +// / /_/ (__  )  __/ /  (__  )  (__  )  __/ /_/ /_/ / / / / /_/ (__  )
 | 
	
		
			
				|  |  | +// \____/____/\___/_/  /____/  /____/\___/\__/\__/_/_/ /_/\__, /____/
 | 
	
		
			
				|  |  | +//                                                       /____/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  | - * Implements hook_init().
 | 
	
		
			
				|  |  | + * Implements hook_user_insert().
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  | -// function materio_translator_init() {
 | 
	
		
			
				|  |  | -//   drupal_add_js(drupal_get_path('module', 'materio_translator').'/js/materio_translator.js');
 | 
	
		
			
				|  |  | -// }
 | 
	
		
			
				|  |  | +function materio_translator_user_insert(&$edit, &$account, $category = NULL) {
 | 
	
		
			
				|  |  | +  materio_translator_user_update($edit, $account, $category);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Implements hook_user_update().
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function materio_translator_user_update(&$edit, &$account, $category = NULL) {
 | 
	
		
			
				|  |  | +  if ($category == 'account') {
 | 
	
		
			
				|  |  | +    // see user_admin_perm_submit()
 | 
	
		
			
				|  |  | +    if (isset($edit['materio_translator'])) {
 | 
	
		
			
				|  |  | +      db_delete('materio_translator')
 | 
	
		
			
				|  |  | +        ->condition('uid', $account->uid)
 | 
	
		
			
				|  |  | +        ->execute();
 | 
	
		
			
				|  |  | +      $edit['materio_translator'] = array_filter($edit['materio_translator']);
 | 
	
		
			
				|  |  | +      if (count($edit['materio_translator'])) {
 | 
	
		
			
				|  |  | +        db_insert('materio_translator')
 | 
	
		
			
				|  |  | +          ->fields(array(
 | 
	
		
			
				|  |  | +            'uid' => $account->uid,
 | 
	
		
			
				|  |  | +            'perm' => implode(', ', array_keys($edit['materio_translator'])),
 | 
	
		
			
				|  |  | +        ))->execute();
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      unset($edit['materio_translator']);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Implements hook_user_delete().
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function materio_translator_user_delete($account) {
 | 
	
		
			
				|  |  | +  db_delete('materio_translator')
 | 
	
		
			
				|  |  | +    ->condition('uid', $account->uid)
 | 
	
		
			
				|  |  | +    ->execute();
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Load the language permissions for a given user
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function materio_translator_load_permissions($uid = NULL) {
 | 
	
		
			
				|  |  | +  $perms = &drupal_static(__FUNCTION__);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // use the global user id if none is passed
 | 
	
		
			
				|  |  | +  if (!isset($uid)) {
 | 
	
		
			
				|  |  | +    $uid = $GLOBALS['user']->uid;
 | 
	
		
			
				|  |  | +    $account = NULL;
 | 
	
		
			
				|  |  | +  }else {
 | 
	
		
			
				|  |  | +    $account = user_load($uid);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (!isset($perms[$uid])) {
 | 
	
		
			
				|  |  | +    $perm_string = db_query('SELECT perm FROM {materio_translator} WHERE uid = :uid', array(':uid' => $uid))->fetchField();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if ($perm_string) {
 | 
	
		
			
				|  |  | +      $perms[$uid] = drupal_map_assoc(explode(', ', $perm_string));
 | 
	
		
			
				|  |  | +    }else {
 | 
	
		
			
				|  |  | +      $perms[$uid] = array();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // adding the default languages if permission has been granted
 | 
	
		
			
				|  |  | +  if (user_access('access selected languages', $account)) {
 | 
	
		
			
				|  |  | +    $perms[$uid] = array_merge($perms[$uid], drupal_map_assoc(variable_get('materio_translator_languages', array())));
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return $perms[$uid];
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Implements hook_permission().
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  | -// function materio_translator_permission() {
 | 
	
		
			
				|  |  | -//   $perms =  array(
 | 
	
		
			
				|  |  | -//     'add showroom localisation' =>  array(
 | 
	
		
			
				|  |  | -//       'title' => t('add showroom localisation'),
 | 
	
		
			
				|  |  | -//       'description' => t('add showroom localisation'),
 | 
	
		
			
				|  |  | -//     ),
 | 
	
		
			
				|  |  | -//   );
 | 
	
		
			
				|  |  | -//
 | 
	
		
			
				|  |  | -//   return $perms;
 | 
	
		
			
				|  |  | -// }
 | 
	
		
			
				|  |  | +function materio_translator_permission() {
 | 
	
		
			
				|  |  | +  return array(
 | 
	
		
			
				|  |  | +    'access selected languages' => array(
 | 
	
		
			
				|  |  | +      'title' => t('Access selected languages'),
 | 
	
		
			
				|  |  | +      'description' => t('This permission gives this role edit/delete access to all content which are in the <a href="!url" target="_blank">selected language</a>. View/create access needs a different access level.', array('!url' => url('admin/config/regional/language/access'))),
 | 
	
		
			
				|  |  | +      'restrict access' => TRUE,
 | 
	
		
			
				|  |  | +    ),
 | 
	
		
			
				|  |  | +  );
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Implements hook_form_alter().
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  | -function DISABLED_materio_translator_form_alter(&$form, &$form_state, $form_id) {
 | 
	
		
			
				|  |  | -  // act only on node edit form
 | 
	
		
			
				|  |  | -  if(isset($form['#node_edit_form'])){
 | 
	
		
			
				|  |  | -    // dsm($form_id, 'form_id');
 | 
	
		
			
				|  |  | -    // dsm($form, 'form');
 | 
	
		
			
				|  |  | -    // dsm($form_state, 'form_state');
 | 
	
		
			
				|  |  | +function materio_translator_form_alter(&$form, &$form_state, $form_id) {
 | 
	
		
			
				|  |  | +    // Add materio_translator things to user/edit /user/add
 | 
	
		
			
				|  |  | +    if ($form_id == 'user_register_form' || $form_id == 'user_profile_form' ) {
 | 
	
		
			
				|  |  | +      // dsm($form_id, 'form_id');
 | 
	
		
			
				|  |  | +      // dsm($form, 'form');
 | 
	
		
			
				|  |  | +      // dsm($form_state, 'form_state');
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +      $form['materio_translator'] = array(
 | 
	
		
			
				|  |  | +        '#type' => 'fieldset',
 | 
	
		
			
				|  |  | +        '#title' => t('Translation access'),
 | 
	
		
			
				|  |  | +        '#tree' => 0,
 | 
	
		
			
				|  |  | +        '#access' => user_access('administer users'),
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +      $form['materio_translator']['materio_translator'] = array(
 | 
	
		
			
				|  |  | +        '#type' => 'checkboxes',
 | 
	
		
			
				|  |  | +        '#options' => array(LANGUAGE_NONE => t('Language neutral')) + locale_language_list('name'),
 | 
	
		
			
				|  |  | +        '#default_value' => materio_translator_load_permissions($form['#user']->uid),
 | 
	
		
			
				|  |  | +        '#description' => t('The user get edit, delete access to all content which are in this enabled languages. Create, view access needs a different access level.'),
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  | - * Implements hook_field_access().
 | 
	
		
			
				|  |  | + * Implements hook_menu().
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  | -function DISABLED_materio_translator_field_access($op, $field, $entity_type, $entity, $account) {
 | 
	
		
			
				|  |  | -  // dsm($op,'op');
 | 
	
		
			
				|  |  | -  // dsm($entity_type,'entity_type');
 | 
	
		
			
				|  |  | -  // if($op == "edit" && $entity_type == 'node'){
 | 
	
		
			
				|  |  | -  //   if($field['translatable'] == 0){
 | 
	
		
			
				|  |  | -  //     if($field['field_permissions']['type'] == FIELD_PERMISSIONS_CUSTOM){
 | 
	
		
			
				|  |  | -  //       dsm($field,$field['field_name']);
 | 
	
		
			
				|  |  | -  //       // dsm($entity,'entity');
 | 
	
		
			
				|  |  | -  //       // dsm($account,'account');
 | 
	
		
			
				|  |  | -  //
 | 
	
		
			
				|  |  | -  //       // check if field permissions are handled by field_permissions module
 | 
	
		
			
				|  |  | -  //
 | 
	
		
			
				|  |  | -  //       // return FALSE;
 | 
	
		
			
				|  |  | -  //     }
 | 
	
		
			
				|  |  | -  //   }
 | 
	
		
			
				|  |  | -  // }
 | 
	
		
			
				|  |  | +function materio_translator_menu() {
 | 
	
		
			
				|  |  | +  $items['admin/config/regional/language/access'] = array(
 | 
	
		
			
				|  |  | +    'title' => 'Access',
 | 
	
		
			
				|  |  | +    'page callback' => 'drupal_get_form',
 | 
	
		
			
				|  |  | +    'page arguments' => array('materio_translator_admin_settings'),
 | 
	
		
			
				|  |  | +    'access arguments' => array('administer site configuration'),
 | 
	
		
			
				|  |  | +    'type' => MENU_LOCAL_TASK,
 | 
	
		
			
				|  |  | +    'weight' => 10,
 | 
	
		
			
				|  |  | +  );
 | 
	
		
			
				|  |  | +  return $items;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Admin settings form.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function materio_translator_admin_settings($form) {
 | 
	
		
			
				|  |  | +  $form['materio_translator_languages'] = array(
 | 
	
		
			
				|  |  | +    '#title' => t('Select the default access languages'),
 | 
	
		
			
				|  |  | +    '#type' => 'select',
 | 
	
		
			
				|  |  | +    '#multiple' => TRUE,
 | 
	
		
			
				|  |  | +    '#options' => array(LANGUAGE_NONE => t('Language neutral')) + locale_language_list('name'),
 | 
	
		
			
				|  |  | +    '#default_value' => variable_get('materio_translator_languages', array()),
 | 
	
		
			
				|  |  | +    '#description' => t("This selection of languages will be connected with the 'access selected languages' permission which you can use to grant a role access to these languages at once.")
 | 
	
		
			
				|  |  | +  );
 | 
	
		
			
				|  |  | +  return system_settings_form($form);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//     _   __          __                                   _
 | 
	
		
			
				|  |  | +//    / | / /___  ____/ /__     ____ _   _____  ______   __(_)__ _      __
 | 
	
		
			
				|  |  | +//   /  |/ / __ \/ __  / _ \   / __ \ | / / _ \/ ___/ | / / / _ \ | /| / /
 | 
	
		
			
				|  |  | +//  / /|  / /_/ / /_/ /  __/  / /_/ / |/ /  __/ /   | |/ / /  __/ |/ |/ /
 | 
	
		
			
				|  |  | +// /_/ |_/\____/\__,_/\___/   \____/|___/\___/_/    |___/_/\___/|__/|__/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Implements hook_menu_alter().
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function materio_translator_menu_alter(&$items) {
 | 
	
		
			
				|  |  | +  // due to hook_module_implementation_alter calling entity translation last, we can't change the callback here, i've done it in entity_translation.node.inc - consider calling it here?
 | 
	
		
			
				|  |  | +  // $items['node/%node/translate']['page callback'] = 'materio_translator_translation_node_overview';
 | 
	
		
			
				|  |  |    //
 | 
	
		
			
				|  |  | -  // return TRUE;
 | 
	
		
			
				|  |  | +  foreach ($items as $path => $item) {
 | 
	
		
			
				|  |  | +    // if(strpos($path, 'node/%node/translate') !== false){
 | 
	
		
			
				|  |  | +    if(preg_match('/^node\/%node\/translate$/', $path)){
 | 
	
		
			
				|  |  | +      // dsm($path);
 | 
	
		
			
				|  |  | +      // dsm($item);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      // create new page arguments
 | 
	
		
			
				|  |  | +      $pargs = $item['page arguments'];
 | 
	
		
			
				|  |  | +      // add page call back for entity_translation call
 | 
	
		
			
				|  |  | +      // and memorize old page callback (i18n) for entity_translation call args
 | 
	
		
			
				|  |  | +      $pargs[2]['page callback'] = $item['page callback'];
 | 
	
		
			
				|  |  | +      $pargs[2]['file'] = $item['file'];
 | 
	
		
			
				|  |  | +      $pargs[2]['module'] = $item['module'];
 | 
	
		
			
				|  |  | +      $pargs[2]['page arguments'] = $item['page arguments'];
 | 
	
		
			
				|  |  | +      // dsm($pargs, "pargs");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      // change page callback for our own function
 | 
	
		
			
				|  |  | +      $items["node/%node/translate"]['page callback'] = "materio_translator_translation_node_overview";
 | 
	
		
			
				|  |  | +      // add our own page raguments
 | 
	
		
			
				|  |  | +      $items["node/%node/translate"]['page arguments'] = $pargs;
 | 
	
		
			
				|  |  | +      /*
 | 
	
		
			
				|  |  | +      original $item :
 | 
	
		
			
				|  |  | +      Array(
 | 
	
		
			
				|  |  | +        [title] => Translate
 | 
	
		
			
				|  |  | +        [page callback] => entity_translation_overview
 | 
	
		
			
				|  |  | +        [page arguments] => Array
 | 
	
		
			
				|  |  | +            (
 | 
	
		
			
				|  |  | +                [0] => node
 | 
	
		
			
				|  |  | +                [1] => 1
 | 
	
		
			
				|  |  | +                [2] => Array
 | 
	
		
			
				|  |  | +                    (
 | 
	
		
			
				|  |  | +                        [page callback] => i18n_node_translation_overview
 | 
	
		
			
				|  |  | +                        [file] => i18n_node.pages.inc
 | 
	
		
			
				|  |  | +                        [module] => i18n_node
 | 
	
		
			
				|  |  | +                    )
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                [3] => 1
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [type] => 132
 | 
	
		
			
				|  |  | +        [weight] => 1
 | 
	
		
			
				|  |  | +        [context] => 3
 | 
	
		
			
				|  |  | +        [access callback] => entity_translation_node_tab_access
 | 
	
		
			
				|  |  | +        [access arguments] => Array
 | 
	
		
			
				|  |  | +            (
 | 
	
		
			
				|  |  | +                [0] => 1
 | 
	
		
			
				|  |  | +                [1] => _translation_tab_access
 | 
	
		
			
				|  |  | +                [2] => 1
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [file] => entity_translation.admin.inc
 | 
	
		
			
				|  |  | +        [module] => entity_translation
 | 
	
		
			
				|  |  | +      )
 | 
	
		
			
				|  |  | +      */
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Implements hook_module_implements_alter().
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function materio_translator_module_implements_alter(&$implementations, $hook) {
 | 
	
		
			
				|  |  | +  switch ($hook) {
 | 
	
		
			
				|  |  | +    case 'menu_alter':
 | 
	
		
			
				|  |  | +      // Move our hook_menu_alter implementation to the end of the list.
 | 
	
		
			
				|  |  | +      $group = $implementations['materio_translator'];
 | 
	
		
			
				|  |  | +      unset($implementations['materio_translator']);
 | 
	
		
			
				|  |  | +      $implementations['materio_translator'] = $group;
 | 
	
		
			
				|  |  | +      break;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Most logic comes from translation/i18n_node module.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * We removes here only the "add translation" links for languages which are not your selected language.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @see translation_node_overview
 | 
	
		
			
				|  |  | + * @see i18n_node_translation_overview
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @param object $node
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @return array.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function materio_translator_translation_node_overview($entity_type, $entity, $callback = NULL) {
 | 
	
		
			
				|  |  | +  // dsm($entity_type, "entity_type");
 | 
	
		
			
				|  |  | +  // dsm($entity, "entity");
 | 
	
		
			
				|  |  | +  // dsm($callback, "callback");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // first call entity_translation original callback
 | 
	
		
			
				|  |  | +  // we retrieve the original build object of translation overview
 | 
	
		
			
				|  |  | +  if ($callback) {
 | 
	
		
			
				|  |  | +    $callback['page arguments'][1] = $entity;
 | 
	
		
			
				|  |  | +    $build = materio_translator_overview_callback($callback);
 | 
	
		
			
				|  |  | +    // dsm($build, "build");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    global $user;
 | 
	
		
			
				|  |  | +    $perms = materio_translator_load_permissions($user->uid);
 | 
	
		
			
				|  |  | +    // dsm($perms, 'perms');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $i = 0;
 | 
	
		
			
				|  |  | +    foreach ($build['entity_translation_overview']['#rows'] as $row) {
 | 
	
		
			
				|  |  | +      // retrieve teh translation link
 | 
	
		
			
				|  |  | +      $link = $row['data'][4];
 | 
	
		
			
				|  |  | +      // dsm($link, "link");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      // retrieve the langcode from link
 | 
	
		
			
				|  |  | +      preg_match('/xml:lang="([^"]+)"/', $link, $matches);
 | 
	
		
			
				|  |  | +      $langcode = $matches[1];
 | 
	
		
			
				|  |  | +      // dsm($langcode, 'langcode');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      // remove link if langcode not in perms
 | 
	
		
			
				|  |  | +      if(!in_array($langcode, $perms)){
 | 
	
		
			
				|  |  | +        $build['entity_translation_overview']['#rows'][$i]['data'][4] = "";
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      $i++;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return $build;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Calls the appropriate translation overview callback.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function materio_translator_overview_callback($callback) {
 | 
	
		
			
				|  |  | +  if (module_exists($callback['module'])) {
 | 
	
		
			
				|  |  | +    if (isset($callback['file'])) {
 | 
	
		
			
				|  |  | +      $path = isset($callback['file path']) ? $callback['file path'] : drupal_get_path('module', $callback['module']);
 | 
	
		
			
				|  |  | +      require_once DRUPAL_ROOT . '/' . $path . '/' . $callback['file'];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return call_user_func_array($callback['page callback'], $callback['page arguments']);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  }
 |