Index: modules/blog/blog.test =================================================================== RCS file: /cvs/drupal/drupal/modules/blog/blog.test,v retrieving revision 1.22 diff -u -p -r1.22 blog.test --- modules/blog/blog.test 8 Nov 2009 10:02:41 -0000 1.22 +++ modules/blog/blog.test 30 Nov 2009 17:29:30 -0000 @@ -138,7 +138,8 @@ class BlogTestCase extends DrupalWebTest // View blog node. $this->drupalGet('node/' . $node->nid); $this->assertResponse(200); - $this->assertTitle($node->title[FIELD_LANGUAGE_NONE][0]['value'] . ' | Drupal', t('Blog node was displayed')); + + $this->assertEqual(trim(current($this->xpath('//h1'))), $node->title[FIELD_LANGUAGE_NONE][0]['value'], t('Blog node was displayed')); $this->assertText(t('Home ' . $crumb . ' Blogs ' . $crumb . ' @name' . $quote . 's blog', array('@name' => format_username($node_user))), t('Breadcrumbs were displayed')); // View blog edit node. Index: modules/book/book.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/book/book.admin.inc,v retrieving revision 1.27 diff -u -p -r1.27 book.admin.inc --- modules/book/book.admin.inc 21 Nov 2009 08:58:23 -0000 1.27 +++ modules/book/book.admin.inc 30 Nov 2009 15:20:39 -0000 @@ -77,7 +77,7 @@ function book_admin_settings_validate($f * @ingroup forms. */ function book_admin_edit($form, $form_state, $node) { - drupal_set_title($node->title[FIELD_LANGUAGE_NONE][0]['value']); + drupal_set_title(node_title_get_raw($node)); $form['#node'] = $node; _book_admin_table($node, $form); $form['save'] = array( @@ -130,7 +130,7 @@ function book_admin_edit_submit($form, & // Update the title if changed. if ($row['title']['#default_value'] != $values['title']) { $node = node_load($values['nid'], FALSE); - $langcode = FIELD_LANGUAGE_NONE; + $langcode = field_multilingual_valid_language($node->language); $node->title = array($langcode => array(array('value' => $values['title']))); $node->book['link_title'] = $values['title']; $node->revision = 1; Index: modules/book/book.module =================================================================== RCS file: /cvs/drupal/drupal/modules/book/book.module,v retrieving revision 1.526 diff -u -p -r1.526 book.module --- modules/book/book.module 26 Nov 2009 06:42:42 -0000 1.526 +++ modules/book/book.module 30 Nov 2009 15:20:40 -0000 @@ -57,7 +57,7 @@ function book_theme() { 'template' => 'book-all-books-block', ), 'book_node_export_html' => array( - 'variables' => array('node' => NULL, 'children' => NULL), + 'variables' => array('node' => NULL, 'title' => NULL, 'children' => NULL), 'template' => 'book-node-export-html', ), ); @@ -504,7 +504,7 @@ function _book_add_form_elements(&$form, if (isset($node->nid) && ($nid == $node->book['original_bid']) && ($node->book['parent_depth_limit'] == 0)) { // This is the top level node in a maximum depth book and thus cannot be moved. - $options[$node->nid] = $node->title[FIELD_LANGUAGE_NONE][0]['value']; + $options[$node->nid] = node_title_get_raw($node); } else { foreach (book_get_books() as $book) { @@ -553,7 +553,7 @@ function _book_update_outline($node) { $new = empty($node->book['mlid']); $node->book['link_path'] = 'node/' . $node->nid; - $node->book['link_title'] = $node->title[FIELD_LANGUAGE_NONE][0]['value']; + $node->book['link_title'] = node_title_get_raw($node); $node->book['parent_mismatch'] = FALSE; // The normal case. if ($node->book['bid'] == $node->nid) { @@ -909,7 +909,7 @@ function book_form_node_delete_confirm_a if (isset($node->book) && $node->book['has_children']) { $form['book_warning'] = array( - '#markup' => '

' . t('%title is part of a book outline, and has associated child pages. If you proceed with deletion, the child pages will be relocated automatically.', array('%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])) . '

', + '#markup' => '

' . t('%title is part of a book outline, and has associated child pages. If you proceed with deletion, the child pages will be relocated automatically.', array('%title' => node_title_get_raw($node))) . '

', '#weight' => -10, ); } @@ -1114,11 +1114,12 @@ function book_export_traverse($tree, $vi */ function book_node_export($node, $children = '') { $build = node_build($node, 'print'); + $title = drupal_render($build['title']); unset($build['#theme']); // @todo Rendering should happen in the template using render(). $node->rendered = drupal_render($build); - return theme('book_node_export_html', array('node' => $node, 'children' => $children)); + return theme('book_node_export_html', array('node' => $node, 'title' => $title, 'children' => $children)); } /** @@ -1132,7 +1133,6 @@ function book_node_export($node, $childr */ function template_preprocess_book_node_export_html(&$variables) { $variables['depth'] = $variables['node']->book['depth']; - $variables['title'] = check_plain($variables['node']->title[FIELD_LANGUAGE_NONE][0]['value']); $variables['content'] = $variables['node']->rendered; } Index: modules/book/book.pages.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/book/book.pages.inc,v retrieving revision 1.22 diff -u -p -r1.22 book.pages.inc --- modules/book/book.pages.inc 18 Nov 2009 18:51:11 -0000 1.22 +++ modules/book/book.pages.inc 30 Nov 2009 15:20:40 -0000 @@ -90,7 +90,7 @@ function book_export_html($nid) { * Menu callback; show the outline form for a single node. */ function book_outline($node) { - drupal_set_title($node->title[FIELD_LANGUAGE_NONE][0]['value']); + drupal_set_title(node_title_get_raw($node)); return drupal_get_form('book_outline_form', $node); } @@ -188,7 +188,7 @@ function book_outline_form_submit($form, */ function book_remove_form($form, &$form_state, $node) { $form['#node'] = $node; - $title = array('%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value']); + $title = array('%title' => node_title_get_raw($node)); if ($node->book['has_children']) { $description = t('%title has associated child pages, which will be relocated automatically to maintain their connection to the book. To recreate the hierarchy (as it was before removing this page), %title may be added again using the Outline tab, and each of its former child pages will need to be relocated manually.', $title); Index: modules/comment/comment.pages.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/comment/comment.pages.inc,v retrieving revision 1.29 diff -u -p -r1.29 comment.pages.inc --- modules/comment/comment.pages.inc 8 Nov 2009 10:02:41 -0000 1.29 +++ modules/comment/comment.pages.inc 30 Nov 2009 15:20:40 -0000 @@ -28,8 +28,6 @@ * The rendered parent node or comment plus the new comment form. */ function comment_reply($node, $pid = NULL) { - // Set the breadcrumb trail. - drupal_set_breadcrumb(array(l(t('Home'), NULL), l($node->title[FIELD_LANGUAGE_NONE][0]['value'], 'node/' . $node->nid))); $op = isset($_POST['op']) ? $_POST['op'] : ''; $build = array(); @@ -38,6 +36,12 @@ function comment_reply($node, $pid = NUL if ($op == t('Preview')) { if (user_access('post comments')) { $build['comment_form'] = drupal_get_form('comment_form', (object) array('pid' => $pid, 'nid' => $node->nid)); + // Set the breadcrumb trail + $build_copy = $build; + $title = drupal_render($build_copy['comment_form']['comment_output_below']['title']); + if ($title) { + drupal_set_breadcrumb(array(l(t('Home'), NULL), l($title, 'node/' . $node->nid))); + } } else { drupal_set_message(t('You are not authorized to post comments.'), 'error'); @@ -66,6 +70,13 @@ function comment_reply($node, $pid = NUL field_attach_load('comment', array($comment->cid => $comment)); $comment->name = $comment->uid ? $comment->registered_name : $comment->name; $build['comment_parent'] = comment_build($comment, $node); + // Set the breadcrumb trail. + $content = node_build($node); + $build_copy = $content; + $title = drupal_render($build_copy['title']); + if ($title) { + drupal_set_breadcrumb(array(l(t('Home'), NULL), l($title, 'node/' . $node->nid))); + } } else { drupal_set_message(t('The comment you are replying to does not exist.'), 'error'); @@ -75,6 +86,12 @@ function comment_reply($node, $pid = NUL // This is the case where the comment is in response to a node. Display the node. elseif (user_access('access content')) { $build['comment_node'] = node_build($node); + // Set the breadcrumb trail. + $build_copy = $build; + $title = drupal_render($build_copy['comment_node']['title']); + if ($title) { + drupal_set_breadcrumb(array(l(t('Home'), NULL), l($title, 'node/' . $node->nid, array('html' => TRUE)))); + } } // Should we show the reply box? @@ -96,7 +113,6 @@ function comment_reply($node, $pid = NUL drupal_set_message(t('You are not authorized to view comments.'), 'error'); drupal_goto("node/$node->nid"); } - return $build; } Index: modules/comment/comment.tokens.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/comment/comment.tokens.inc,v retrieving revision 1.6 diff -u -p -r1.6 comment.tokens.inc --- modules/comment/comment.tokens.inc 16 Oct 2009 20:40:05 -0000 1.6 +++ modules/comment/comment.tokens.inc 30 Nov 2009 15:20:40 -0000 @@ -209,7 +209,8 @@ function comment_tokens($type, $tokens, case 'node': $node = node_load($comment->nid); - $title = $node->title[FIELD_LANGUAGE_NONE][0]['value']; + //@todo: verify. + $title = node_title_get_raw($node); $replacements[$original] = $sanitize ? filter_xss($title) : $title; break; } Index: modules/field/field.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.module,v retrieving revision 1.48 diff -u -p -r1.48 field.module --- modules/field/field.module 26 Nov 2009 19:09:32 -0000 1.48 +++ modules/field/field.module 30 Nov 2009 15:20:40 -0000 @@ -692,6 +692,7 @@ function template_preprocess_field(&$var $items = array($element['items']); } + $formatter = $instance['display'][$element['#build_mode']]['type']; $additions = array( 'object' => $element['#object'], 'field' => $field, @@ -714,9 +715,12 @@ function template_preprocess_field(&$var ), 'template_files' => array( 'field', + 'field-' . $formatter, 'field-' . $element['#field_name'], 'field-' . $bundle, 'field-' . $element['#field_name'] . '-' . $bundle, + 'field-' . $formatter . '-' . $element['#field_name'], + 'field-' . $formatter . '-' . $element['#field_name'] . '-' . $bundle, ), ); $variables = array_merge($variables, $additions); Index: modules/field/modules/text/text.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/text/text.module,v retrieving revision 1.39 diff -u -p -r1.39 text.module --- modules/field/modules/text/text.module 29 Nov 2009 20:45:17 -0000 1.39 +++ modules/field/modules/text/text.module 30 Nov 2009 15:20:40 -0000 @@ -282,6 +282,11 @@ function text_field_formatter_info() { 'label' => t('Summary or trimmed'), 'field types' => array('text_with_summary'), ), + // The raw field formatter displays a raw version without wrapper. + 'text_raw' => array( + 'label' => t('Raw'), + 'field types' => array('text'), + ), ); } @@ -331,6 +336,11 @@ function theme_field_formatter_text_summ } } +function theme_field_formatter_text_raw($variables) { + $element = $variables['element']; + return strip_tags($element['#item']['safe']); +} + /** * Generate a trimmed, formatted version of a text field value. * Index: modules/forum/forum.test =================================================================== RCS file: /cvs/drupal/drupal/modules/forum/forum.test,v retrieving revision 1.42 diff -u -p -r1.42 forum.test --- modules/forum/forum.test 21 Nov 2009 20:33:56 -0000 1.42 +++ modules/forum/forum.test 30 Nov 2009 17:32:32 -0000 @@ -340,7 +340,7 @@ class ForumTestCase extends DrupalWebTes // View forum node. $this->drupalGet('node/' . $node->nid); $this->assertResponse(200); - $this->assertTitle($node->title[FIELD_LANGUAGE_NONE][0]['value'] . ' | Drupal', t('Forum node was displayed')); + $this->assertEqual(trim(current($this->xpath('//h1'))), $node->title[FIELD_LANGUAGE_NONE][0]['value'], t('Forum node was displayed')); $this->assertText(t('Home ' . $crumb . ' Forums ' . $crumb . ' @container ' . $crumb . ' @forum', array('@container' => $this->container['name'], '@forum' => $this->forum['name'])), t('Breadcrumbs were displayed')); // View forum edit node. Index: modules/locale/locale.test =================================================================== RCS file: /cvs/drupal/drupal/modules/locale/locale.test,v retrieving revision 1.51 diff -u -p -r1.51 locale.test --- modules/locale/locale.test 10 Nov 2009 17:27:53 -0000 1.51 +++ modules/locale/locale.test 30 Nov 2009 15:20:40 -0000 @@ -1310,7 +1310,7 @@ class LocaleContentFunctionalTest extend } function setUp() { - parent::setUp('locale'); + parent::setUp('locale', 'locale_test'); } /** @@ -1394,11 +1394,15 @@ class LocaleContentFunctionalTest extend $this->assertNoText($name_disabled, t('Disabled language not present.')); // Create page content. + variable_set('locale_test_entity_info_alter', TRUE); + field_info_cache_clear(); + drupal_static_reset('language_list'); + $node_title = $this->randomName(); $node_body = $this->randomName(); $edit = array( 'type' => 'page', - 'title' => array(FIELD_LANGUAGE_NONE => array(array('value' => $node_title))), + 'title' => array($langcode => array(array('value' => $node_title))), 'body' => array($langcode => array(array('value' => $node_body))), 'language' => $langcode, ); @@ -1680,13 +1684,15 @@ class LocaleMultilingualFieldsFunctional // Change node language. $this->drupalGet("node/$node->nid/edit"); $edit = array( - $title_key => $this->randomName(8), 'language' => 'it' ); $this->drupalPost(NULL, $edit, t('Save')); - $node = $this->drupalGetNodeByTitle($edit[$title_key]); + $node = $this->drupalGetNodeByTitle($title_value); $this->assertTrue($node, t('Node found in database.')); - + // Test title field + $assert = isset($node->title['it']) && !isset($node->title['en']) && $node->title['it'][0]['value'] == $title_value; + $this->assertTrue($assert, t('Field title language correctly changed.')); + // Test body field $assert = isset($node->body['it']) && !isset($node->body['en']) && $node->body['it'][0]['value'] == $body_value; $this->assertTrue($assert, t('Field language correctly changed.')); } Index: modules/locale/tests/locale_test.module =================================================================== RCS file: /cvs/drupal/drupal/modules/locale/tests/locale_test.module,v retrieving revision 1.4 diff -u -p -r1.4 locale_test.module --- modules/locale/tests/locale_test.module 18 Aug 2009 11:22:36 -0000 1.4 +++ modules/locale/tests/locale_test.module 30 Nov 2009 15:20:40 -0000 @@ -25,3 +25,12 @@ function locale_test_boot() { $_SERVER['HTTP_HOST'] = variable_get('locale_test_domain'); } } + +/** + * Implement hook_entity_info_alter(). + */ +function locale_test_entity_info_alter(&$entity_info) { + if (variable_get('locale_test_entity_info_alter', FALSE)) { + $entity_info['node']['translation']['locale'] = TRUE; + } +} \ No newline at end of file Index: modules/menu/menu.test =================================================================== RCS file: /cvs/drupal/drupal/modules/menu/menu.test,v retrieving revision 1.26 diff -u -p -r1.26 menu.test --- modules/menu/menu.test 10 Nov 2009 17:27:53 -0000 1.26 +++ modules/menu/menu.test 30 Nov 2009 17:41:22 -0000 @@ -316,7 +316,7 @@ class MenuTestCase extends DrupalWebTest // Verify menu link link. $this->clickLink($title); $title = $parent_node->title[FIELD_LANGUAGE_NONE][0]['value']; - $this->assertTitle(t("@title | Drupal", array('@title' => $title)), t('Parent menu link link target was correct')); + $this->assertEqual(trim(current($this->xpath('//h1'))), t("@title", array('@title' => $title)), t('Parent menu link link target was correct')); } // Verify menu link. @@ -326,7 +326,7 @@ class MenuTestCase extends DrupalWebTest // Verify menu link link. $this->clickLink($title); $title = $item_node->title[FIELD_LANGUAGE_NONE][0]['value']; - $this->assertTitle(t("@title | Drupal", array('@title' => $title)), t('Menu link link target was correct')); + $this->assertEqual(trim(current($this->xpath('//h1'))), t("@title", array('@title' => $title)), t('Menu link link target was correct')); } /** Index: modules/node/node.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.admin.inc,v retrieving revision 1.78 diff -u -p -r1.78 node.admin.inc --- modules/node/node.admin.inc 17 Nov 2009 02:50:41 -0000 1.78 +++ modules/node/node.admin.inc 30 Nov 2009 15:20:40 -0000 @@ -356,7 +356,7 @@ function _node_mass_update_batch_process $node = _node_mass_update_helper($nid, $updates); // Store result for post-processing in the finished callback. - $context['results'][] = l($node->title[FIELD_LANGUAGE_NONE][0]['value'], 'node/' . $node->nid); + $context['results'][] = l(node_title_get_raw($node), 'node/' . $node->nid); // Update our progress information. $context['sandbox']['progress']++; Index: modules/node/node.module =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.module,v retrieving revision 1.1170 diff -u -p -r1.1170 node.module --- modules/node/node.module 29 Nov 2009 10:43:53 -0000 1.1170 +++ modules/node/node.module 30 Nov 2009 15:20:40 -0000 @@ -593,6 +593,7 @@ function node_configure_fields($type) { $field = array( 'field_name' => 'title', 'type' => 'text', + 'translatable' => TRUE, ); $field = field_create_field($field); } @@ -612,12 +613,12 @@ function node_configure_fields($type) { 'display' => array( 'full' => array( 'label' => 'hidden', - 'type' => 'text_default', + 'type' => 'text_raw', 'weight' => $weight, ), 'teaser' => array( 'label' => 'hidden', - 'type' => 'text_default', + 'type' => 'text_raw', 'weight' => $weight, ), ), @@ -990,8 +991,7 @@ function node_save($node) { // column. After this we restore the field data structure to the previous node // title field. $title_field = $node->title; - $langcode = FIELD_LANGUAGE_NONE; - $node->title = $title_field[$langcode][0]['value']; + $node->title = node_title_get_raw($node); // Generate the node table query and the node_revisions table query. if ($node->is_new) { @@ -1222,10 +1222,12 @@ function node_build_content($node, $buil // to know when a teaser view is different than a full view. $links = array(); if ($build_mode == 'teaser') { + $build_copy = $node->content; + $title = drupal_render($build_copy['title']); $links['node_readmore'] = array( 'title' => t('Read more'), 'href' => 'node/' . $node->nid, - 'attributes' => array('rel' => 'tag', 'title' => strip_tags($node->title[FIELD_LANGUAGE_NONE][0]['value'])) + 'attributes' => array('rel' => 'tag', 'title' => $title) ); } $node->content['links']['node'] = array( @@ -1296,7 +1298,7 @@ function node_language_provider($languag */ function node_show($node, $message = FALSE) { if ($message) { - drupal_set_title(t('Revision of %title from %date', array('%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'], '%date' => format_date($node->revision_timestamp))), PASS_THROUGH); + drupal_set_title(t('Revision of %title from %date', array('%title' => node_title_get_raw($node), '%date' => format_date($node->revision_timestamp))), PASS_THROUGH); } // Update the history table, stating that this user viewed this node. @@ -1327,11 +1329,11 @@ function template_preprocess_node(&$vari $variables['node'] = $variables['elements']['#node']; $node = $variables['node']; - $variables['date'] = format_date($node->created); - $variables['name'] = theme('username', array('account' => $node)); - $variables['node_url'] = url('node/' . $node->nid); - $variables['node_title'] = check_plain($node->title[FIELD_LANGUAGE_NONE][0]['value']); - $variables['page'] = (bool)menu_get_object(); + $variables['date'] = format_date($node->created); + $variables['name'] = theme('username', array('account' => $node)); + $variables['node_url'] = url('node/' . $node->nid); + $variables['node_title'] = drupal_render($variables['elements']['title']); + $variables['page'] = (bool)menu_get_object(); if (!empty($node->in_preview)) { unset($node->content['links']); @@ -1571,6 +1573,7 @@ function node_search_execute($keys = NUL // Render the node. $node = node_load($item->sid); $build = node_build($node, 'search_result'); + $title = drupal_render($build['title']); unset($build['#theme']); $node->rendered = drupal_render($build); @@ -1583,8 +1586,8 @@ function node_search_execute($keys = NUL $results[] = array( 'link' => url('node/' . $item->sid, array('absolute' => TRUE)), - 'type' => check_plain(node_type_get_name($node)), - 'title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'], + 'type' => node_type_get_name($node), + 'title' => $title, 'user' => theme('username', array('account' => $node)), 'date' => $node->changed, 'node' => $node, @@ -2061,6 +2064,7 @@ function node_feed($nids = FALSE, $chann // The node gets built and modules add to or modify $node->rss_elements // and $node->rss_namespaces. $build = node_build($node, 'rss'); + $title = drupal_render($build['title']); unset($build['#theme']); if (!empty($node->rss_namespaces)) { @@ -2073,7 +2077,7 @@ function node_feed($nids = FALSE, $chann $item_text .= drupal_render($build); } - $items .= format_rss_item($node->title[FIELD_LANGUAGE_NONE][0]['value'], $node->link, $item_text, $node->rss_elements); + $items .= format_rss_item($title, $node->link, $item_text, $node->rss_elements); } $channel_defaults = array( @@ -2178,7 +2182,7 @@ function node_page_default() { function node_page_view($node) { $return = node_show($node); if (isset($return['nodes'][$node->nid]['title'])) { - drupal_set_title($return['nodes'][$node->nid]['title']['items'][0]['#item']['value']); + drupal_set_title(drupal_render($return['nodes'][$node->nid]['title']), PASS_THROUGH); } // Set the node path as the canonical URL to prevent duplicate content. drupal_add_html_head_link(array('rel' => 'canonical', 'href' => url('node/' . $node->nid)), TRUE); @@ -2216,9 +2220,14 @@ function _node_index_node($node) { // Render the node. $build = node_build($node, 'search_index'); unset($build['#theme']); - $node->rendered = drupal_render($build); + $title = drupal_render($build['title']); + $node->rendered = drupal_render($build); + $text = ''; + if ($title) { + $text = '

' . check_plain($title) . '

'; + } - $text = '

' . check_plain($node->title[FIELD_LANGUAGE_NONE][0]['value']) . '

' . $node->rendered; + $text .= $node->rendered; // Fetch extra data normally not visible $extra = module_invoke_all('node_update_index', $node); @@ -3043,7 +3052,7 @@ function node_action_info() { */ function node_publish_action($node, $context = array()) { $node->status = NODE_PUBLISHED; - watchdog('action', 'Set @type %title to published.', array('@type' => node_type_get_name($node), '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])); + watchdog('action', 'Set @type %title to published.', array('@type' => node_type_get_name($node), '%title' => node_title_get_raw($node))); } /** @@ -3052,7 +3061,7 @@ function node_publish_action($node, $con */ function node_unpublish_action($node, $context = array()) { $node->status = NODE_NOT_PUBLISHED; - watchdog('action', 'Set @type %title to unpublished.', array('@type' => node_type_get_name($node), '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])); + watchdog('action', 'Set @type %title to unpublished.', array('@type' => node_type_get_name($node), '%title' => node_title_get_raw($node))); } /** @@ -3061,7 +3070,7 @@ function node_unpublish_action($node, $c */ function node_make_sticky_action($node, $context = array()) { $node->sticky = NODE_STICKY; - watchdog('action', 'Set @type %title to sticky.', array('@type' => node_type_get_name($node), '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])); + watchdog('action', 'Set @type %title to sticky.', array('@type' => node_type_get_name($node), '%title' => node_title_get_raw($node))); } /** @@ -3070,7 +3079,7 @@ function node_make_sticky_action($node, */ function node_make_unsticky_action($node, $context = array()) { $node->sticky = NODE_NOT_STICKY; - watchdog('action', 'Set @type %title to unsticky.', array('@type' => node_type_get_name($node), '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])); + watchdog('action', 'Set @type %title to unsticky.', array('@type' => node_type_get_name($node), '%title' => node_title_get_raw($node))); } /** @@ -3079,7 +3088,7 @@ function node_make_unsticky_action($node */ function node_promote_action($node, $context = array()) { $node->promote = NODE_PROMOTED; - watchdog('action', 'Promoted @type %title to front page.', array('@type' => node_type_get_name($node), '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])); + watchdog('action', 'Promoted @type %title to front page.', array('@type' => node_type_get_name($node), '%title' => node_title_get_raw($node))); } /** @@ -3088,7 +3097,7 @@ function node_promote_action($node, $con */ function node_unpromote_action($node, $context = array()) { $node->promote = NODE_NOT_PROMOTED; - watchdog('action', 'Removed @type %title from front page.', array('@type' => node_type_get_name($node), '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])); + watchdog('action', 'Removed @type %title from front page.', array('@type' => node_type_get_name($node), '%title' => node_title_get_raw($node))); } /** @@ -3097,7 +3106,7 @@ function node_unpromote_action($node, $c */ function node_save_action($node) { node_save($node); - watchdog('action', 'Saved @type %title', array('@type' => node_type_get_name($node), '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])); + watchdog('action', 'Saved @type %title', array('@type' => node_type_get_name($node), '%title' => node_title_get_raw($node))); } /** @@ -3107,7 +3116,7 @@ function node_save_action($node) { function node_assign_owner_action($node, $context) { $node->uid = $context['owner_uid']; $owner_name = db_query("SELECT name FROM {users} WHERE uid = :uid", array(':uid' => $context['owner_uid']))->fetchField(); - watchdog('action', 'Changed owner of @type %title to uid %name.', array('@type' => node_type_get_type($node), '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'], '%name' => $owner_name)); + watchdog('action', 'Changed owner of @type %title to uid %name.', array('@type' => node_type_get_type($node), '%title' => node_title_get_raw($node), '%name' => $owner_name)); } function node_assign_owner_action_form($context) { @@ -3188,7 +3197,7 @@ function node_unpublish_by_keyword_actio foreach ($context['keywords'] as $keyword) { if (strpos(drupal_render(node_build(clone $node)), $keyword) !== FALSE || strpos($node->title, $keyword) !== FALSE) { $node->status = NODE_NOT_PUBLISHED; - watchdog('action', 'Set @type %title to unpublished.', array('@type' => node_type_get_name($node), '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])); + watchdog('action', 'Set @type %title to unpublished.', array('@type' => node_type_get_name($node), '%title' => node_title_get_raw($node))); break; } } @@ -3221,6 +3230,24 @@ function node_requirements($phase) { } /** + * Get the title value in the node language. + * + * @param $node + * The $node on wich get the title. + * @return + * The title value in the node language. + */ +function node_title_get_raw($node, $localized = FALSE) { + if (isset($node->language)) { + $langcode = field_multilingual_valid_language($node->language); + } + else { + $langcode = FIELD_LANGUAGE_NONE; + } + return $node->title[$langcode][0]['value']; +} + +/** * Controller class for nodes. * * This extends the DrupalDefaultEntityController class, adding required Index: modules/node/node.pages.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.pages.inc,v retrieving revision 1.100 diff -u -p -r1.100 node.pages.inc --- modules/node/node.pages.inc 8 Nov 2009 10:02:41 -0000 1.100 +++ modules/node/node.pages.inc 30 Nov 2009 15:20:40 -0000 @@ -12,7 +12,7 @@ */ function node_page_edit($node) { $type_name = node_type_get_name($node); - drupal_set_title(t('Edit @type @title', array('@type' => $type_name, '@title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])), PASS_THROUGH); + drupal_set_title(t('Edit @type @title', array('@type' => $type_name, '@title' => node_title_get_raw($node))), PASS_THROUGH); return drupal_get_form($node->type . '_node_form', $node); } @@ -417,8 +417,8 @@ function node_form_submit($form, &$form_ $insert = empty($node->nid); node_save($node); $node_link = l(t('view'), 'node/' . $node->nid); - $watchdog_args = array('@type' => $node->type, '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value']); - $t_args = array('@type' => node_type_get_name($node), '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value']); + $watchdog_args = array('@type' => $node->type, '%title' => node_title_get_raw($node)); + $t_args = array('@type' => node_type_get_name($node), '%title' => node_title_get_raw($node)); if ($insert) { watchdog('content', '@type: added %title.', $watchdog_args, WATCHDOG_NOTICE, $node_link); @@ -467,7 +467,7 @@ function node_delete_confirm($form, &$fo ); return confirm_form($form, - t('Are you sure you want to delete %title?', array('%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])), + t('Are you sure you want to delete %title?', array('%title' => node_title_get_raw($node))), 'node/' . $node->nid, t('This action cannot be undone.'), t('Delete'), @@ -482,8 +482,8 @@ function node_delete_confirm_submit($for if ($form_state['values']['confirm']) { $node = node_load($form_state['values']['nid']); node_delete($form_state['values']['nid']); - watchdog('content', '@type: deleted %title.', array('@type' => $node->type, '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])); - drupal_set_message(t('@type %title has been deleted.', array('@type' => node_type_get_name($node), '%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value']))); + watchdog('content', '@type: deleted %title.', array('@type' => $node->type, '%title' => node_title_get_raw($node))); + drupal_set_message(t('@type %title has been deleted.', array('@type' => node_type_get_name($node), '%title' => node_title_get_raw($node)))); } $form_state['redirect'] = ''; @@ -493,7 +493,7 @@ function node_delete_confirm_submit($for * Generate an overview table of older revisions of a node. */ function node_revision_overview($node) { - drupal_set_title(t('Revisions for %title', array('%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])), PASS_THROUGH); + drupal_set_title(t('Revisions for %title', array('%title' => node_title_get_raw($node))), PASS_THROUGH); $header = array(t('Revision'), array('data' => t('Operations'), 'colspan' => 2)); @@ -555,8 +555,8 @@ function node_revision_revert_confirm_su node_save($node_revision); - watchdog('content', '@type: reverted %title revision %revision.', array('@type' => $node_revision->type, '%title' => $node_revision->title[FIELD_LANGUAGE_NONE][0]['value'], '%revision' => $node_revision->vid)); - drupal_set_message(t('@type %title has been reverted back to the revision from %revision-date.', array('@type' => node_type_get_name($node_revision), '%title' => $node_revision->title[FIELD_LANGUAGE_NONE][0]['value'], '%revision-date' => format_date($node_revision->revision_timestamp)))); + watchdog('content', '@type: reverted %title revision %revision.', array('@type' => $node_revision->type, '%title' => node_title_get_raw($node_revision), '%revision' => $node_revision->vid)); + drupal_set_message(t('@type %title has been reverted back to the revision from %revision-date.', array('@type' => node_type_get_name($node_revision), '%title' => node_title_get_raw($node_revision), '%revision-date' => format_date($node_revision->revision_timestamp)))); $form_state['redirect'] = 'node/' . $node_revision->nid . '/revisions'; } @@ -569,8 +569,8 @@ function node_revision_delete_confirm_su $node_revision = $form['#node_revision']; node_revision_delete($node_revision->vid); - watchdog('content', '@type: deleted %title revision %revision.', array('@type' => $node_revision->type, '%title' => $node_revision->title[FIELD_LANGUAGE_NONE][0]['value'], '%revision' => $node_revision->vid)); - drupal_set_message(t('Revision from %revision-date of @type %title has been deleted.', array('%revision-date' => format_date($node_revision->revision_timestamp), '@type' => node_type_get_name($node_revision), '%title' => $node_revision->title[FIELD_LANGUAGE_NONE][0]['value']))); + watchdog('content', '@type: deleted %title revision %revision.', array('@type' => $node_revision->type, '%title' => node_title_get_raw($node_revision), '%revision' => $node_revision->vid)); + drupal_set_message(t('Revision from %revision-date of @type %title has been deleted.', array('%revision-date' => format_date($node_revision->revision_timestamp), '@type' => node_type_get_name($node_revision), '%title' => node_title_get_raw($node_revision)))); $form_state['redirect'] = 'node/' . $node_revision->nid; if (db_query('SELECT COUNT(vid) FROM {node_revision} WHERE nid = :nid', array(':nid' => $node_revision->nid))->fetchField() > 1) { $form_state['redirect'] .= '/revisions'; Index: modules/node/node.test =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.test,v retrieving revision 1.57 diff -u -p -r1.57 node.test --- modules/node/node.test 29 Nov 2009 20:45:17 -0000 1.57 +++ modules/node/node.test 30 Nov 2009 15:20:40 -0000 @@ -24,10 +24,10 @@ class NodeLoadMultipleUnitTest extends D * Create four nodes and ensure they're loaded correctly. */ function testNodeMultipleLoad() { - $node1 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1)); - $node2 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1)); - $node3 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 0)); - $node4 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 0)); + $node1 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'language' => '')); + $node2 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'language' => '')); + $node3 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 0, 'language' => '')); + $node4 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 0, 'language' => '')); // Confirm that promoted nodes appear in the default node listing. $this->drupalGet('node'); @@ -496,8 +496,8 @@ class NodeTitleXSSTestCase extends Drupa $node = $this->drupalCreateNode($settings); $this->drupalGet('node/' . $node->nid); - // assertTitle() decodes HTML-entities inside the element. - $this->assertTitle($edit["title[$langcode][0][value]"] . ' | Drupal', t('Title is diplayed when viewing a node.')); + + $this->assertEqual(trim(current($this->xpath('//h1'))), $title, t('Title is diplayed when viewing a node.')); $this->assertNoRaw($xss, t('Harmful tags are escaped when viewing a node.')); $this->drupalGet('node/' . $node->nid . '/edit'); @@ -1113,7 +1113,7 @@ class NodeTitleTestCase extends DrupalWe function setUp() { parent::setUp(); - $this->admin_user = $this->drupalCreateUser(array('administer nodes', 'create article content', 'create page content')); + $this->admin_user = $this->drupalCreateUser(array('administer nodes', 'administer content types', 'create article content', 'create page content')); $this->drupalLogin($this->admin_user); } @@ -1126,20 +1126,25 @@ class NodeTitleTestCase extends DrupalWe 'title' => array(FIELD_LANGUAGE_NONE => array(array('value' => $this->randomName(8)))), ); $node = $this->drupalCreateNode($settings); + $build = node_build($node); + $title = drupal_render($build['title']); // Test <title> tag. $this->drupalGet("node/$node->nid"); $xpath = '//title'; - $this->assertEqual(current($this->xpath($xpath)), $node->title[FIELD_LANGUAGE_NONE][0]['value'] .' | Drupal', 'Page title is equal to node title.', 'Node'); + $this->assertEqual(current($this->xpath($xpath)), $title .' | Drupal', 'Page title is equal to node title.', 'Node'); // Test breadcrumb in comment preview. $this->drupalGet("comment/reply/$node->nid"); $xpath = '//div[@class="breadcrumb"]/a[last()]'; - $this->assertEqual(current($this->xpath($xpath)), $node->title[FIELD_LANGUAGE_NONE][0]['value'], 'Node breadcrumb is equal to node title.', 'Node'); + $this->assertEqual(current($this->xpath($xpath)), $title, 'Node breadcrumb is equal to node title.', 'Node'); + + //@todo: re-enable this test when issue #623314 (Fields displayed in a wrong + // way on comment preview) is fixed. // Test node title in comment preview. - $xpath = '//div[@id="node-'. $node->nid .'"]/h2/a'; - $this->assertEqual(current($this->xpath($xpath)), $node->title[FIELD_LANGUAGE_NONE][0]['value'], 'Node preview title is equal to node title.', 'Node'); + // $xpath = '//div[@id="node-'. $node->nid .'"]/h2/a'; + // $this->assertEqual(current($this->xpath($xpath)), $node->title[FIELD_LANGUAGE_NONE][0]['value'], 'Node preview title is equal to node title.', 'Node'); } } Index: modules/node/node.tokens.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.tokens.inc,v retrieving revision 1.6 diff -u -p -r1.6 node.tokens.inc --- modules/node/node.tokens.inc 5 Nov 2009 03:35:29 -0000 1.6 +++ modules/node/node.tokens.inc 30 Nov 2009 15:20:40 -0000 @@ -134,7 +134,7 @@ function node_tokens($type, $tokens, arr break; case 'title': - $replacements[$original] = $sanitize ? check_plain($node->title[FIELD_LANGUAGE_NONE][0]['value']) : $node->title[FIELD_LANGUAGE_NONE][0]['value']; + $replacements[$original] = $sanitize ? check_plain(node_title_get_raw($node)) : node_title_get_raw($node); break; case 'body': Index: modules/path/path.test =================================================================== RCS file: /cvs/drupal/drupal/modules/path/path.test,v retrieving revision 1.26 diff -u -p -r1.26 path.test --- modules/path/path.test 8 Nov 2009 11:19:02 -0000 1.26 +++ modules/path/path.test 30 Nov 2009 15:20:40 -0000 @@ -272,7 +272,6 @@ class PathLanguageTestCase extends Drupa $edit = array(); $langcode = 'fr'; $edit["body[$langcode][0][value]"] = $this->randomName(); - $langcode = FIELD_LANGUAGE_NONE; $edit["title[$langcode][0][value]"] = $this->randomName(); $edit['path[alias]'] = $this->randomName(); $this->drupalPost(NULL, $edit, t('Save')); @@ -286,7 +285,7 @@ class PathLanguageTestCase extends Drupa // Confirm that the alias works. $this->drupalGet('fr/' . $edit['path[alias]']); - $this->assertText($french_node->title[FIELD_LANGUAGE_NONE][0]['value'], 'Alias for French translation works.'); + $this->assertText($french_node->title[$langcode][0]['value'], 'Alias for French translation works.'); // Confirm that the alias is returned by url(). drupal_static_reset('language_list'); Index: modules/poll/poll.module =================================================================== RCS file: /cvs/drupal/drupal/modules/poll/poll.module,v retrieving revision 1.325 diff -u -p -r1.325 poll.module --- modules/poll/poll.module 26 Nov 2009 06:59:07 -0000 1.325 +++ modules/poll/poll.module 30 Nov 2009 15:20:40 -0000 @@ -716,7 +716,8 @@ function poll_vote($form, &$form_state) function template_preprocess_poll_vote(&$variables) { $form = $variables['form']; $variables['choice'] = drupal_render($form['choice']); - $variables['title'] = check_plain($form['#node']->title[FIELD_LANGUAGE_NONE][0]['value']); + $content = node_build($form['#node']); + $variables['title'] = drupal_render($content['title']); $variables['vote'] = drupal_render($form['vote']); $variables['rest'] = drupal_render_children($form); $variables['block'] = $form['#block']; @@ -747,8 +748,9 @@ function poll_view_results($node, $build $poll_results .= theme('poll_bar', array('title' => $choice['chtext'], 'votes' => $chvotes, 'total_votes' => $total_votes, 'vote' => isset($node->vote) && $node->vote == $i, 'block' => $block)); } } - - return theme('poll_results', array('raw_title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'], 'results' => $poll_results, 'votes' => $total_votes, 'raw_links' => isset($node->links) ? $node->links : array(), 'block' => $block, 'nid' => $node->nid, 'vote' => isset($node->vote) ? $node->vote : NULL)); + $build = field_attach_view('node', $node, 'full'); + $title = drupal_render($build['title']); + return theme('poll_results', array('raw_title' => $title, 'results' => $poll_results, 'votes' => $total_votes, 'raw_links' => isset($node->links) ? $node->links : array(), 'block' => $block, 'nid' => $node->nid, 'vote' => isset($node->vote) ? $node->vote : NULL)); } @@ -818,7 +820,7 @@ function template_preprocess_poll_result if (isset($variables['vote']) && $variables['vote'] > -1 && user_access('cancel own vote')) { $variables['cancel_form'] = drupal_render(drupal_get_form('poll_cancel_form', $variables['nid'])); } - $variables['title'] = check_plain($variables['raw_title']); + $variables['title'] = $variables['raw_title']; // If this is a block, allow a different tpl.php to be used. if ($variables['block']) { Index: modules/poll/poll.pages.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/poll/poll.pages.inc,v retrieving revision 1.25 diff -u -p -r1.25 poll.pages.inc --- modules/poll/poll.pages.inc 8 Nov 2009 10:02:41 -0000 1.25 +++ modules/poll/poll.pages.inc 30 Nov 2009 15:20:40 -0000 @@ -50,8 +50,9 @@ function poll_page() { * Callback for the 'votes' tab for polls you can see other votes on */ function poll_votes($node) { - $votes_per_page = 20; - drupal_set_title($node->title[FIELD_LANGUAGE_NONE][0]['value']); + $votes_per_page = 20; + $content = node_build($node); + drupal_set_title(drupal_render($content['title']), PASS_THROUGH); $header[] = array('data' => t('Visitor'), 'field' => 'u.name'); $header[] = array('data' => t('Vote'), 'field' => 'pc.chtext'); @@ -92,7 +93,8 @@ function poll_votes($node) { * Callback for the 'results' tab for polls you can vote on */ function poll_results($node) { - drupal_set_title($node->title[FIELD_LANGUAGE_NONE][0]['value']); $node->show_results = TRUE; - return node_show($node); + $return = node_show($node); + drupal_set_title(drupal_render($return['nodes'][$node->nid]['title']), PASS_THROUGH); + return $return; } Index: modules/search/search.pages.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/search/search.pages.inc,v retrieving revision 1.12 diff -u -p -r1.12 search.pages.inc --- modules/search/search.pages.inc 9 Oct 2009 01:00:03 -0000 1.12 +++ modules/search/search.pages.inc 30 Nov 2009 15:20:40 -0000 @@ -93,7 +93,7 @@ function template_preprocess_search_resu function template_preprocess_search_result(&$variables) { $result = $variables['result']; $variables['url'] = check_url($result['link']); - $variables['title'] = check_plain($result['title']); + $variables['title'] = $result['title']; $info = array(); if (!empty($result['type'])) { Index: modules/system/system.tokens.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.tokens.inc,v retrieving revision 1.4 diff -u -p -r1.4 system.tokens.inc --- modules/system/system.tokens.inc 11 Oct 2009 03:07:20 -0000 1.4 +++ modules/system/system.tokens.inc 30 Nov 2009 15:20:40 -0000 @@ -283,7 +283,7 @@ function system_tokens($type, $tokens, a case 'node': if ($nid = $file->nid) { $node = node_load($file->nid); - $replacements[$original] = $sanitize ? filter_xss($node->title[FIELD_LANGUAGE_NONE][0]['value']) : $node->title[FIELD_LANGUAGE_NONE][0]['value']; + $replacements[$original] = $sanitize ? filter_xss(node_title_get_raw($node)) : node_title_get_raw($node); } break; Index: modules/translation/translation.module =================================================================== RCS file: /cvs/drupal/drupal/modules/translation/translation.module,v retrieving revision 1.64 diff -u -p -r1.64 translation.module --- modules/translation/translation.module 8 Nov 2009 10:02:41 -0000 1.64 +++ modules/translation/translation.module 30 Nov 2009 15:20:40 -0000 @@ -202,7 +202,7 @@ function translation_node_prepare($node) $translations = translation_node_get_translations($source_node->tnid); if (isset($translations[$language])) { $languages = language_list(); - drupal_set_message(t('A translation of %title in %language already exists, a new %type will be created instead of a translation.', array('%title' => $source_node->title[FIELD_LANGUAGE_NONE][0]['value'], '%language' => $languages[$language]->name, '%type' => $node->type)), 'error'); + drupal_set_message(t('A translation of %title in %language already exists, a new %type will be created instead of a translation.', array('%title' => node_title_get_raw($source_node), '%language' => $languages[$language]->name, '%type' => $node->type)), 'error'); return; } } Index: modules/translation/translation.pages.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/translation/translation.pages.inc,v retrieving revision 1.12 diff -u -p -r1.12 translation.pages.inc --- modules/translation/translation.pages.inc 8 Nov 2009 10:02:41 -0000 1.12 +++ modules/translation/translation.pages.inc 30 Nov 2009 15:20:40 -0000 @@ -33,7 +33,7 @@ function translation_node_overview($node // Existing translation in the translation set: display status. // We load the full node to check whether the user can edit it. $translation_node = node_load($translations[$language->language]->nid); - $title = l($translation_node->title[FIELD_LANGUAGE_NONE][0]['value'], 'node/' . $translation_node->nid); + $title = l(node_title_get_raw($translation_node), 'node/' . $translation_node->nid); if (node_access('update', $translation_node)) { $options[] = l(t('edit'), "node/$translation_node->nid/edit"); } @@ -54,7 +54,7 @@ function translation_node_overview($node $rows[] = array($language_name, $title, $status, implode(" | ", $options)); } - drupal_set_title(t('Translations of %title', array('%title' => $node->title[FIELD_LANGUAGE_NONE][0]['value'])), PASS_THROUGH); + drupal_set_title(t('Translations of %title', array('%title' => node_title_get_raw($node))), PASS_THROUGH); $build['translation_node_overview'] = array( '#theme' => 'table', Index: modules/translation/translation.test =================================================================== RCS file: /cvs/drupal/drupal/modules/translation/translation.test,v retrieving revision 1.20 diff -u -p -r1.20 translation.test --- modules/translation/translation.test 16 Oct 2009 02:04:44 -0000 1.20 +++ modules/translation/translation.test 30 Nov 2009 15:20:40 -0000 @@ -154,8 +154,7 @@ class TranslationTestCase extends Drupal $this->drupalGet('node/add/page', array('query' => array('translation' => $nid, 'language' => $language))); $edit = array(); - $langcode = FIELD_LANGUAGE_NONE; - $edit["title[$langcode][0][value]"] = $title; + $edit["title[$language][0][value]"] = $title; $edit["body[$language][0][value]"] = $body; $this->drupalPost(NULL, $edit, t('Save')); $this->assertRaw(t('Page %title has been created.', array('%title' => $title)), t('Translation created.')); Index: modules/field/theme/field-text_raw.tpl.php =================================================================== RCS file: modules/field/theme/field-text_raw.tpl.php diff -N modules/field/theme/field-text_raw.tpl.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/field/theme/field-text_raw.tpl.php 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,49 @@ +<?php +// $Id$ + +/** + * @file field-text_raw.tpl.php + * Default theme implementation to display the raw value of the title field. + * + * Available variables: + * - $items: An array of field values. Use render() to output them. + * - $label: The item label. + * - $label_hidden: Whether the label display is set to 'hidden'. + * - $classes: String of classes that can be used to style contextually through + * CSS. It can be manipulated through the variable $classes_array from + * preprocess functions. The default values can be one or more of the + * following: + * - field-name-[field_name]: The current field name. For example, if the + * field name is "field_description" it would result in + * "field-name-field-description". + * - field-type-[field_type]: The current field type. For example, if the + * field type is "text" it would result in "field-type-text". + * - field-label-[label_display]: The current label position. For example, if the + * label position is "above" it would result in "field-label-above". + * + * Other variables: + * - $object: The object to which the field is attached. + * - $field: The field array. + * - $build_mode: Build mode, e.g. 'full', 'teaser'... + * - $field_name: The field name. + * - $field_type: The field type. + * - $field_name_css: The css-compatible field name. + * - $field_type_css: The css-compatible field type. + * - $field_language: The field language. + * - $field_translatable: Whether the field is translatable or not. + * - $label_display: Position of label display, inline, above, or hidden. + * - $classes_array: Array of html class attribute values. It is flattened + * into a string within the variable $classes. + * + */ +?> +<?php if ($items): ?> + <?php if ($label_display == 'above'): ?> + <div class="field-label"<?php print $title_attributes; ?>><?php print $label ?>:</div> + <?php elseif ($label_display == 'inline'): ?> + <?php print $label ?>: + <?php endif; ?> + <?php foreach ($items as $delta => $item) : ?> + <?php print render($item); ?> + <?php endforeach; ?> +<?php endif; ?>