diff -u b/views/entity_translation.views.inc b/views/entity_translation.views.inc --- b/views/entity_translation.views.inc +++ b/views/entity_translation.views.inc @@ -209,6 +209,11 @@ $table['entity_translations'] = array( 'title' => t('Entity translation: translations'), 'help' => t('Translation information.'), + 'field' => array( + 'title' => t('Entity translations'), + 'help' => t('Information and links for entity translations available.'), + 'handler' => 'entity_translation_handler_field_entity_translations', + ), 'relationship' => array( 'label' => t('Translations'), 'base' => 'entity_translation', @@ -222,13 +227,6 @@ 'entity type' => $type, ), ); - $table['entity_translations'] = array( - 'title' => t('Entity translations'), - 'help' => t('Information and links for entity translations available.'), - 'field' => array( - 'handler' => 'entity_translation_handler_field_entity_translations', - ), - ); } } diff -u b/views/entity_translation_handler_field_entity_translations.inc b/views/entity_translation_handler_field_entity_translations.inc --- b/views/entity_translation_handler_field_entity_translations.inc +++ b/views/entity_translation_handler_field_entity_translations.inc @@ -67,6 +67,7 @@ 'no' => t('No link provided'), 'view' => t('View link'), 'edit' => t('Edit link'), + 'edit_add' => t('Edit link, with add fallback'), ), '#default_value' => $this->options['link'], ); @@ -80,68 +81,141 @@ parent::options_form($form, $form_state); } - function render($values) { - $items = array(); - if ($entity = $this->get_value($values)) { - if (!empty($entity->translations)) { - $handler = entity_translation_get_handler($this->entity_type, $entity); - $languages = language_list(); - switch ($this->options['link']) { - case 'edit': - $link_method = 'getEditPath'; - break; - case 'view': - $link_method = 'getViewPath'; - break; - default: - $link_method = NULL; - break; - } - foreach ($entity->translations->data as $langcode => $translation) { - switch ($this->options['text']) { - case 'label': - $text = _entity_translation_label($this->entity_type, $entity, $langcode); - break; - case 'language_native': - $text = $languages[$langcode]->native; - break; - case 'language_name': - $text = $languages[$langcode]->native; - break; - case 'language_code': - $text = $languages[$langcode]->native; - break; - } - if (!empty($link_method)) { - $path = $handler->{$link_method}($langcode); - $link_options = array( - 'language' => $languages[$langcode], - ); - $items[$langcode] = l($text, $path, $link_options); + + function get_view_path(EntityTranslationHandlerInterface $handler, $language) { + $uri = entity_uri($this->entity_type, $handler->getEntity()); + return array('path' => $uri['path'], 'options' => array('language' => $language)); + } + + + function get_edit_path(EntityTranslationHandlerInterface $handler, $language) { + $path = $handler->getEditPath($language->language); + return array('path' => $path, 'options' => array('language' => $language)); + } + + + function get_add_path(EntityTranslationHandlerInterface $handler, $language) { + $source = $handler->getLanguage(); + if ($source !== $language->language) { + $edit_path = $handler->getEditPath(); + $add_path = "$edit_path/add/$source/$language->language"; + return array('path' => $add_path, 'options' => array('language' => $language)); + } + return null; + } + + + function get_translation_paths($entity, $link_type) { + $translations = array(); + if (!empty($entity->translations->data)) { + $translations = $entity->translations->data; + } + $handler = entity_translation_get_handler($this->entity_type, $entity); + $languages = language_list(); + + $links = array(); + switch($link_type) { + case 'no': + foreach ($translations as $langcode => $translation) { + $links[$langcode] = true; + } + break; + + case 'view': + foreach ($translations as $langcode => $translation) { + $links[$langcode] = $this->get_view_path($handler, $languages[$langcode]); + } + break; + + case 'edit': + foreach ($translations as $langcode => $translation) { + $links[$langcode] = $this->get_edit_path($handler, $languages[$langcode]); + } + break; + + case 'edit_add': + foreach ($languages as $langcode => $language) { + if (isset($translations[$langcode])) { + $links[$langcode] = $this->get_edit_path($handler, $language); } - else { - $items[$langcode] = $text; + elseif ($language->enabled) { + $links[$langcode] = $this->get_add_path($handler, $language); } } - } + break; + } + + return array_filter($links); + } + + + function get_language_labels($property, array $languages) { + $labels = array(); + foreach ($languages as $langcode => $path) { + $labels[$langcode] = $languages[$langcode]->{$property}; } - if (!empty($items)) { - if ($this->options['type'] == 'separator') { - $output = implode($this->sanitize_value($this->options['separator'], 'xss_admin'), $items); + return $labels; + } + + + function get_entity_labels($entity, $languages) { + $labels = array(); + foreach ($languages as $langcode => $path) { + $labels[$langcode] = _entity_translation_label($this->entity_type, $entity, $langcode); + } + return $labels; + } + + + function render($values) { + $items = array(); + if ($entity = $this->get_value($values)) { + $paths = $this->get_translation_paths($entity, $this->options['link']); + $languages = array_intersect_key(language_list(), $paths); + + $label_type = $this->options['text']; + if($label_type === 'title') { + $labels = $this->get_entity_labels($entity, $languages); } else { - $output = theme('item_list', - array( - 'items' => $items, - 'title' => NULL, - 'type' => $this->options['type'] - )); + $property_map = array( + 'language_native' => 'native', + 'language_name' => 'name', + 'language_code' => 'language', + ); + if(isset($property_map)) { + $labels = $this->get_language_labels($property_map[$label_type], $languages); + } + else { + $labels = array_fill_keys(array_keys($paths), ''); + } + } + + foreach($paths as $langcode => $path) { + $label = check_plain($labels[$langcode]); + $attributes = array('lang' => $langcode); + + if(!isset($path['path'])) { + $items[$langcode] = '' . $label . ''; + continue; + } + + $attributes['class'][] = 'language-link'; + $options = array('attributes' => $attributes) + $path['options']; + $items[$langcode] = l($label, $path['path'], $options); } } - else { - $output = !empty($this->options['no_translations_text']) ? $this->options['no_translations_text'] : t('No translations available'); + + if(empty($items)) { + return !empty($this->options['no_translations_text']) + ? $this->options['no_translations_text'] + : t('No translations available'); + } + + if ($this->options['type'] === 'separator') { + return implode($this->sanitize_value($this->options['separator'], 'xss_admin'), $items); } - return $output; + return theme('item_list', array('items' => $items, 'title' => NULL, 'type' => $this->options['type'])); } }