Issue #1534674 by plach, slowflyer: Fixed Comment field language is completely broken.
authorDavid Rothstein
Thu, 27 Dec 2012 03:49:51 +0000 (22:49 -0500)
committerDavid Rothstein
Thu, 27 Dec 2012 03:49:51 +0000 (22:49 -0500)
CHANGELOG.txt
modules/comment/comment.admin.inc
modules/comment/comment.module
modules/locale/locale.module
modules/locale/locale.test

index ba4a4ac..b238688 100644 (file)
@@ -1,6 +1,7 @@
 
 Drupal 7.19, xxxx-xx-xx (development version)
 -----------------------
+- Fixed broken support for translatable comment fields.
 - Added an assertThemeOutput() method to Simpletest to allow tests to check
   that themed output matches an expected HTML string (API addition).
 - Added a link to "Install another module" after a module has been successfully
index 4f3d350..43b53e2 100644 (file)
@@ -98,13 +98,14 @@ function comment_admin_overview($form, &$form_state, $arg) {
     // Remove the first node title from the node_titles array and attach to
     // the comment.
     $comment->node_title = array_shift($node_titles);
+    $comment_body = field_get_items('comment', $comment, 'comment_body');
     $options[$comment->cid] = array(
       'subject' => array(
         'data' => array(
           '#type' => 'link',
           '#title' => $comment->subject,
           '#href' => 'comment/' . $comment->cid,
-          '#options' => array('attributes' => array('title' => truncate_utf8($comment->comment_body[LANGUAGE_NONE][0]['value'], 128)), 'fragment' => 'comment-' . $comment->cid),
+          '#options' => array('attributes' => array('title' => truncate_utf8($comment_body[0]['value'], 128)), 'fragment' => 'comment-' . $comment->cid),
         ),
       ),
       'author' => theme('username', array('account' => $comment)),
index 4241538..8b51f76 100644 (file)
@@ -2041,7 +2041,8 @@ function comment_form($form, &$form_state, $comment) {
 
   // Attach fields.
   $comment->node_type = 'comment_node_' . $node->type;
-  field_attach_form('comment', $comment, $form, $form_state);
+  $langcode = entity_language('comment', $comment);
+  field_attach_form('comment', $comment, $form, $form_state, $langcode);
 
   return $form;
 }
@@ -2066,7 +2067,8 @@ function comment_preview($comment) {
   $node = node_load($comment->nid);
 
   if (!form_get_errors()) {
-    $comment->format = $comment->comment_body[LANGUAGE_NONE][0]['format'];
+    $comment_body = field_get_items('comment', $comment, 'comment_body');
+    $comment->format = $comment_body[0]['format'];
     // Attach the user and time information.
     if (!empty($comment->name)) {
       $account = user_load_by_name($comment->name);
@@ -2190,7 +2192,9 @@ function comment_submit($comment) {
     // 1) Filter it into HTML
     // 2) Strip out all HTML tags
     // 3) Convert entities back to plain-text.
-    $comment_body = $comment->comment_body[LANGUAGE_NONE][0];
+    $field = field_info_field('comment_body');
+    $langcode = field_is_translatable('comment', $field) ? entity_language('comment', $comment) : LANGUAGE_NONE;
+    $comment_body = $comment->comment_body[$langcode][0];
     if (isset($comment_body['format'])) {
       $comment_text = check_markup($comment_body['value'], $comment_body['format']);
     }
index 94e7cd1..b60c531 100644 (file)
@@ -386,20 +386,53 @@ function locale_form_node_form_alter(&$form, &$form_state) {
 /**
  * Form submit handler for node_form().
  *
- * Checks if Locale is registered as a translation handler and handle possible
- * node language changes.
- *
  * This submit handler needs to run before entity_form_submit_build_entity()
  * is invoked by node_form_submit_build_node(), because it alters the values of
  * attached fields. Therefore, it cannot be a hook_node_submit() implementation.
  */
 function locale_field_node_form_submit($form, &$form_state) {
-  if (field_has_translation_handler('node', 'locale')) {
-    $node = (object) $form_state['values'];
-    $current_language = entity_language('node', $node);
-    list(, , $bundle) = entity_extract_ids('node', $node);
+  locale_field_entity_form_submit('node', $form, $form_state);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function locale_form_comment_form_alter(&$form, &$form_state, $form_id) {
+  // If a content type has multilingual support we set the content language as
+  // comment language.
+  if ($form['language']['#value'] == LANGUAGE_NONE && locale_multilingual_node_type($form['#node']->type)) {
+    global $language_content;
+    $form['language']['#value'] = $language_content->language;
+    $submit_callback = 'locale_field_comment_form_submit';
+    array_unshift($form['actions']['preview']['#submit'], $submit_callback);
+    array_unshift($form['#submit'], $submit_callback);
+  }
+}
 
-    foreach (field_info_instances('node', $bundle) as $instance) {
+/**
+ * Form submit handler for comment_form().
+ *
+ * This submit handler needs to run before entity_form_submit_build_entity()
+ * is invoked by comment_form_submit_build_comment(), because it alters the
+ * values of attached fields.
+ */
+function locale_field_comment_form_submit($form, &$form_state) {
+  locale_field_entity_form_submit('comment', $form, $form_state);
+}
+
+/**
+ * Handles field language on submit for the given entity type.
+ *
+ * Checks if Locale is registered as a translation handler and handle possible
+ * language changes.
+ */
+function locale_field_entity_form_submit($entity_type, $form, &$form_state ) {
+  if (field_has_translation_handler($entity_type, 'locale')) {
+    $entity = (object) $form_state['values'];
+    $current_language = entity_language($entity_type, $entity);
+    list(, , $bundle) = entity_extract_ids($entity_type, $entity);
+
+    foreach (field_info_instances($entity_type, $bundle) as $instance) {
       $field_name = $instance['field_name'];
       $field = field_info_field($field_name);
       $previous_language = $form[$field_name]['#language'];
@@ -407,7 +440,7 @@ function locale_field_node_form_submit($form, &$form_state) {
       // Handle a possible language change: new language values are inserted,
       // previous ones are deleted.
       if ($field['translatable'] && $previous_language != $current_language) {
-        $form_state['values'][$field_name][$current_language] = $node->{$field_name}[$previous_language];
+        $form_state['values'][$field_name][$current_language] = $entity->{$field_name}[$previous_language];
         $form_state['values'][$field_name][$previous_language] = array();
       }
     }
@@ -491,6 +524,9 @@ function locale_field_language_fallback(&$display_language, $entity, $langcode)
  */
 function locale_entity_info_alter(&$entity_info) {
   $entity_info['node']['translation']['locale'] = TRUE;
+  if (isset($entity_info['comment'])) {
+    $entity_info['comment']['translation']['locale'] = TRUE;
+  }
 }
 
 /**
@@ -1060,15 +1096,3 @@ function locale_url_outbound_alter(&$path, &$options, $original_path) {
     }
   }
 }
-
-/**
- * Implements hook_form_FORM_ID_alter().
- */
-function locale_form_comment_form_alter(&$form, &$form_state, $form_id) {
-  // If a content type has multilingual support we set the content language as
-  // comment language.
-  if ($form['language']['#value'] == LANGUAGE_NONE && locale_multilingual_node_type($form['#node']->type)) {
-    global $language_content;
-    $form['language']['#value'] = $language_content->language;
-  }
-}
index 632506e..d88634e 100644 (file)
@@ -2758,7 +2758,7 @@ class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
     parent::setUp('locale', 'locale_test');
 
     // Create and login user.
-    $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages', 'administer content types', 'create article content'));
+    $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages', 'administer content types', 'administer comments', 'create article content'));
     $this->drupalLogin($admin_user);
 
     // Add language.
@@ -2787,6 +2787,12 @@ class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
     // French no matter what path prefix the URLs have.
     $edit = array('language' => 'fr');
     $this->drupalPost("user/{$admin_user->uid}/edit", $edit, t('Save'));
+
+    // Make comment body translatable.
+    $field = field_info_field('comment_body');
+    $field['translatable'] = TRUE;
+    field_update_field($field);
+    $this->assertTrue(field_is_translatable('comment', $field), 'Comment body is translatable.');
   }
 
   /**
@@ -2817,22 +2823,46 @@ class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
       foreach (language_list() as $langcode => $language) {
         // Post a comment with content language $langcode.
         $prefix = empty($language->prefix) ? '' : $language->prefix . '/';
-        $edit = array("comment_body[$language_none][0][value]" => $this->randomName());
-        $this->drupalPost("{$prefix}node/{$node->nid}", $edit, t('Save'));
+        $comment_values[$node_langcode][$langcode] = $this->randomName();
+        // Initially field form widgets have no language.
+        $edit = array(
+          'subject' => $this->randomName(),
+          "comment_body[$language_none][0][value]" => $comment_values[$node_langcode][$langcode],
+        );
+        $this->drupalPost("{$prefix}node/{$node->nid}", $edit, t('Preview'));
+        // After the first submit the submitted entity language is taken into
+        // account.
+        $edit = array(
+          'subject' => $edit['subject'],
+          "comment_body[$langcode][0][value]" => $comment_values[$node_langcode][$langcode],
+        );
+        $this->drupalPost(NULL, $edit, t('Save'));
 
         // Check that comment language matches the current content language.
-        $comment = db_select('comment', 'c')
-          ->fields('c')
+        $cid = db_select('comment', 'c')
+          ->fields('c', array('cid'))
           ->condition('nid', $node->nid)
           ->orderBy('cid', 'DESC')
+          ->range(0, 1)
           ->execute()
-          ->fetchObject();
+          ->fetchField();
+        $comment = comment_load($cid);
         $comment_langcode = entity_language('comment', $comment);
         $args = array('%node_language' => $node_langcode, '%comment_language' => $comment_langcode, '%langcode' => $langcode);
         $this->assertEqual($comment_langcode, $langcode, t('The comment posted with content language %langcode and belonging to the node with language %node_language has language %comment_language', $args));
+        $this->assertEqual($comment->comment_body[$langcode][0]['value'], $comment_values[$node_langcode][$langcode], 'Comment body correctly stored.');
+      }
+    }
+
+    // Check that comment bodies appear in the administration UI.
+    $this->drupalGet('admin/content/comment');
+    foreach ($comment_values as $node_values) {
+      foreach ($node_values as $value) {
+        $this->assertRaw($value);
       }
     }
   }
+
 }
 
 /**