diff --git a/modules/comment.page_title.inc b/modules/comment.page_title.inc index 91e83d9..03385a9 100644 --- a/modules/comment.page_title.inc +++ b/modules/comment.page_title.inc @@ -33,6 +33,13 @@ function comment_page_title_alter(&$title) { function comment_page_title_pattern_alter(&$pattern, &$types) { // Comment reply page if (arg(0) == 'comment' && arg(1) == 'reply' && is_numeric(arg(2))) { + + global $language; + + // Keys + $default_comment_child_reply_pattern_key = 'page_title_comment_child_reply'; + $default_comment_reply_pattern_key = 'page_title_comment_reply'; + // The node ID position is in arg 2... $types['node'] = menu_get_object('node', 2); @@ -44,13 +51,28 @@ function comment_page_title_pattern_alter(&$pattern, &$types) { // Is this a root comment or a child comment (top level or nested)... if (($pid = arg(3)) && $comment = _comment_load($pid)) { + // Reply to comment... $types['comment'] = $comment; - $pattern = variable_get('page_title_comment_child_reply', ''); + + $lang_pattern_key = !empty($language) ? $default_comment_child_reply_pattern_key. '_' .$language->language : $default_comment_child_reply_pattern_key; + $pattern = variable_get($lang_pattern_key, ''); + + // Fallback for child reply + if (empty($pattern)) { + $pattern = variable_get($default_comment_child_reply_pattern_key, '[page-title] | [site-name]'); + } } else { // Reply to node... - $pattern = variable_get('page_title_comment_reply', ''); + + $lang_pattern_key = !empty($language) ? $default_comment_reply_pattern_key. '_' .$language->language : $default_comment_reply_pattern_key; + $pattern = variable_get($lang_pattern_key, ''); + + // Fallback for child reply + if (empty($pattern)) { + $pattern = variable_get($default_comment_reply_pattern_key, '[page-title] | [site-name]'); + } } } } diff --git a/modules/forum.page_title.inc b/modules/forum.page_title.inc index ca4658c..bd8d097 100644 --- a/modules/forum.page_title.inc +++ b/modules/forum.page_title.inc @@ -25,17 +25,37 @@ function forum_page_title_alter(&$title) { * Implementation of hook_page_title_pattern_alter(). */ function forum_page_title_pattern_alter(&$pattern, &$types) { + global $language; + + // Setting up keys + $default_forum_vocab_pattern_key = 'page_title_vocab'; + $default_forum_root_pattern_key = 'page_title_forum_root_title'; + // Forums Page title Patterns if (arg(0) == 'forum') { // If there is a numeric argument, then we're viewing a container or forum if (is_numeric(arg(1))) { $types['taxonomy'] = taxonomy_get_term(arg(1)); $forum_vid = variable_get('forum_nav_vocabulary', ''); - $pattern = variable_get('page_title_vocab_'. $forum_vid, ''); + $lang_pattern_key = !empty($language) ? $default_forum_vocab_pattern_key. '_' .$forum_vid . '_' . $language->language : $default_forum_vocab_pattern_key; + + $pattern = variable_get($lang_pattern_key, ''); + + // Fallback for forum vocab + if (empty($pattern)) { + $pattern = variable_get($default_forum_vocab_pattern_key, '[page-title] | [site-name]'); + } } // Otherwise its the root - lets grab the root pattern. else { - $pattern = variable_get('page_title_forum_root_title', ''); + $lang_pattern_key = !empty($language) ? $default_forum_root_pattern_key. '_' .$language->language : $default_forum_root_pattern_key; + + $pattern = variable_get($lang_pattern_key, ''); + + // Fallback for forum vocab + if (empty($pattern)) { + $pattern = variable_get($default_forum_root_pattern_key, '[page-title] | [site-name]'); + } } } } diff --git a/modules/node.page_title.inc b/modules/node.page_title.inc index e67a572..90d7b53 100644 --- a/modules/node.page_title.inc +++ b/modules/node.page_title.inc @@ -15,7 +15,8 @@ function node_page_title_alter(&$title) { // Get the node $node = menu_get_object('node'); - // If the node has a custom page title and the node type is configured to have a custom page title (ie, it's not a leftover from a previous setting), then use it. + // If the node has a custom page title and the node type is configured to have a custom page title + // (ie, it's not a leftover from a previous setting), then use it. if (!empty($node->page_title) && variable_get('page_title_type_'. $node->type .'_showfield', 0)) { $title = $node->page_title; } @@ -29,13 +30,33 @@ function node_page_title_alter(&$title) { function node_page_title_pattern_alter(&$pattern, &$types) { if ((arg(0) == 'node' && is_numeric(arg(1)))) { $types['node'] = menu_get_object(); + + // if a page title has been set for the viewed node and showfield is enabled, then get it + // else get the right pattern + if( !empty($types['node']->page_title) && variable_get('page_title_type_'. $types['node']->type .'_showfield', 0)) { + $pattern = $types['node']->page_title; + } + else { + global $language; + // If a language exists for this node, we try to use page title pattern related to that language + // If the title pattern for that language is empty, we use the default one + // Setting up keys + $default_pattern_key = 'page_title_type_'. $types['node']->type; + $lang_pattern_key = !empty($language) ? $default_pattern_key . '_' . $language->language : $default_pattern_key; + + // Get the right pattern in function of the determined key above + $pattern = variable_get($lang_pattern_key, ''); + + // Fallback for node + if (empty($pattern)) { + $pattern = variable_get($default_pattern_key, '[page-title] | [site-name]'); + } + } // If the node has any taxonomy, grab the first time and pass it over to be passed as a token. // TODO: Handle multiple terms? Only pass specific terms per content type? if (!empty($types['node']->taxonomy)) { $types['taxonomy'] = current($types['node']->taxonomy); } - - $pattern = variable_get('page_title_type_'. $types['node']->type, ''); } } diff --git a/modules/page_title.page_title.inc b/modules/page_title.page_title.inc index cd03e37..800821a 100644 --- a/modules/page_title.page_title.inc +++ b/modules/page_title.page_title.inc @@ -29,7 +29,18 @@ function page_title_page_title_alter(&$title) { function page_title_page_title_pattern_alter(&$pattern, &$data = array()) { // If frontpage, then use the frontpage pattern and set the title. if (drupal_is_front_page()) { - // Get the frontpage pattern - $pattern = variable_get('page_title_front', '[site-name] | [site-slogan]'); + global $language; + + // Setting up keys + $default_pattern_key = 'page_title_front'; + $lang_pattern_key = 'page_title_front'. '_' . $language->language; + + // Get pattern + $pattern = variable_get($lang_pattern_key, ''); + + // Fallback for frontpage + if (empty($pattern)) { + $pattern = variable_get($default_pattern_key, '[page-title] | [site-name]'); + } } } diff --git a/modules/taxonomy.page_title.inc b/modules/taxonomy.page_title.inc index ae86426..3263db5 100644 --- a/modules/taxonomy.page_title.inc +++ b/modules/taxonomy.page_title.inc @@ -27,7 +27,17 @@ function taxonomy_page_title_alter(&$title) { function taxonomy_page_title_pattern_alter(&$pattern, &$types) { // Taxonomy Term Page if (arg(0) == 'taxonomy' && arg(1) == 'term' && is_numeric(arg(2)) && module_exists('taxonomy')) { + global $language; + // Setting up keys $types['taxonomy'] = taxonomy_get_term(arg(2)); - $pattern = variable_get('page_title_vocab_'. $types['taxonomy']->vid, ''); + $default_taxonomy_pattern_key = 'page_title_vocab' . '_' . $types['taxonomy']->vid; + + $lang_key = $default_taxonomy_pattern_key . '_' . $language->language; + $pattern = variable_get($lang_key, ''); + + // Fallback for taxonomy + if (empty($pattern)) { + $pattern = variable_get($default_taxonomy_pattern_key, '[page-title] | [site-name]'); + } } } diff --git a/modules/user.page_title.inc b/modules/user.page_title.inc index 1b96364..02d73a1 100644 --- a/modules/user.page_title.inc +++ b/modules/user.page_title.inc @@ -24,14 +24,33 @@ function user_page_title_alter(&$title) { * Implementation of hook_page_title_pattern_alter(). */ function user_page_title_pattern_alter(&$pattern, &$types) { + global $language; + + // Setting up keys + $default_user_pattern_key = 'page_title_user'; + $default_blog_pattern_key = 'page_title_blog'; + $lang_pattern_user_key = !empty($language) ? $default_user_pattern_key . '_' . $language->language : $default_user_pattern_key; + $lang_pattern_blog_key = !empty($language) ? $default_blog_pattern_key . '_' . $language->language : $default_blog_pattern_key; + // User if (arg(0) == 'user' && is_numeric(arg(1))) { $types['user'] = user_load(array('uid' => arg(1))); - $pattern = variable_get('page_title_user', ''); + $pattern = variable_get($lang_pattern_user_key, ''); + + // Fallback for user + if (empty($pattern)) { + $pattern = variable_get($default_user_pattern_key, '[page-title] | [site-name]'); + } } + // Blog elseif (arg(0) == 'blog' && is_numeric(arg(1))) { $types['user'] = user_load(array('uid' => arg(1))); - $pattern = variable_get('page_title_blog', ''); + $pattern = variable_get($lang_pattern_blog_key, ''); + + // Fallback for blog + if (empty($pattern)) { + $pattern = variable_get($default_blog_pattern_key, '[page-title] | [site-name]'); + } } } diff --git a/modules/views.page_title.inc b/modules/views.page_title.inc index 23b560d..07a4222 100644 --- a/modules/views.page_title.inc +++ b/modules/views.page_title.inc @@ -1,5 +1,5 @@ $form['pattern'][$key]['#required'], ); unset($form['pattern'][$key]['#title']); - + $row = array( array('data' => drupal_render($title), 'class' => 'page-type'), + array('data' => drupal_render($form['language'][$key]), 'class' => 'language'), array('data' => drupal_render($form['scope'][$key]), 'class' => 'scope'), ); if (isset($form['showfield'][$key .'_showfield'])) { @@ -28,17 +29,17 @@ foreach (element_children($form['pattern']) as $key) { $row[] = array('data' => drupal_render($form['pattern'][$key]), 'colspan' => 2, 'class' => 'pattern'); } - $rows[] = $row; +$rows[] = $row; } $headers = array( array('data' => t('Page Type'), 'class' => 'page-type'), + array('data' => t('Language'), 'class' => 'language'), array('data' => t('Token Scope'), 'class' => 'scope'), array('data' => t('Pattern'), 'class' => 'pattern'), - array('data' => t('Show Field'), 'class' => 'showfie;d'), + array('data' => t('Show Field'), 'class' => 'showfield'), ); - drupal_add_css(drupal_get_path('module', 'page_title') .'/page_title.admin.css', 'module', 'all', FALSE); print theme('table', $headers, $rows, array('id' => 'page-title-settings')); diff --git a/page_title.admin.css b/page_title.admin.css index fd73b35..73d727f 100644 --- a/page_title.admin.css +++ b/page_title.admin.css @@ -1,10 +1,15 @@ +table#page-title-settings thead th { text-align:center; } + table#page-title-settings th.showfield { text-align:center; } table#page-title-settings th.scope { text-align:center; } -table#page-title-settings th.page-type { text-align:right; } +table#page-title-settings th.page-type { text-align:left; } table#page-title-settings td.showfield { width:10%; text-align:center; } table#page-title-settings td.scope { text-align:center; } -table#page-title-settings td.page-type { text-align:right; } +table#page-title-settings td.language { text-align:center; } +table#page-title-settings td.page-type { text-align:left; } + +table#page-title-settings td input { width: 95%; } div.view-list-page-titles th.views-field-nid { width:5%; } div.view-list-page-titles th.views-field-edit-node { width:20%; } diff --git a/page_title.admin.inc b/page_title.admin.inc index 5ef7c95..35e834b 100644 --- a/page_title.admin.inc +++ b/page_title.admin.inc @@ -13,10 +13,10 @@ * array A structured array for use with Forms API. */ function page_title_admin_settings() { + // Define a default looking 'form element' for setting. $showfield_form_element = array('#type' => 'checkbox', ); - // Define a default looking 'form element' for setting. $pattern_form_element = array( '#type' => 'textfield', @@ -24,147 +24,287 @@ function page_title_admin_settings() { '#maxlength' => 256, ); - - // Set the theme callback for the patterns section - $form['patterns'] = array( + // Set the theme callback for the general patterns + $form['patterns']['general'] = array( + '#type' => 'fieldset', + '#title' => t('General Title Patterns'), + '#collapsible' => FALSE, + '#theme' => 'page_title_admin_settings' + ); + + // Set the theme callback for the content type patterns section + $form['patterns']['content_type'] = array( '#type' => 'fieldset', - '#title' => t('Page Title Patterns'), + '#title' => t('Content Types Patterns'), '#collapsible' => TRUE, + '#collapsed' => TRUE, '#theme' => 'page_title_admin_settings' ); - - - // Define the basic scope column values - $form['patterns']['scope'] = array( - 'page_title_default' => array('#type' => 'markup', '#value' => t('Global'), ), - 'page_title_front' => array('#type' => 'markup', '#value' => t('Global'), ), - 'page_title_comment_reply' => array('#type' => 'markup', '#value' => t('Node'), ), - 'page_title_comment_child_reply' => array('#type' => 'markup', '#value' => t('Node') .'
'. t('Comment'), ), - 'page_title_pager_pattern' => array('#type' => 'markup', '#value' => t('Global'), ), - 'page_title_user' => array('#type' => 'markup', '#value' => t('User'), ), + + // Set the theme callback for the taxonomy section + $form['patterns']['taxonomy'] = array( + '#type' => 'fieldset', + '#title' => t('Taxonomy Title Patterns'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#theme' => 'page_title_admin_settings' ); + + // Set the theme callback for the specific section + $form['patterns']['specific'] = array( + '#type' => 'fieldset', + '#title' => t('More Title Patterns'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#theme' => 'page_title_admin_settings' + ); + + // List of all enabled languages + if (module_exists('locale')) { + $langs = locale_language_list(); + } else { + $langs = array(); + } - - // Define the 'default' token patterns - $form['patterns']['pattern'] = array( - //Define the default pattern - this is a "fallback" pattern. - 'page_title_default' => array( + // FALLBACKS - NO LOCALIZATION + $form['patterns']['general']['pattern']['page_title_default'] = array( '#title' => t('Default'), '#default_value' => variable_get('page_title_default', '[page-title] | [site-name]'), '#required' => TRUE, - '#description' => t('This pattern will be used as a fallback (ie, when no other pattern is defined)'), - ) + $pattern_form_element, - + '#description' => t('Pattern used as a fallback (ie, when no other pattern is defined)'), + ) + $pattern_form_element; + $form['patterns']['general']['scope']['page_title_default'] = array('#type' => 'markup', '#value' => t('Global'), ); + $form['patterns']['general']['language']['page_title_default'] = array('#type' => 'markup', '#value' => t('Independant'), ); + + $key = 'page_title_front'; + $form['patterns']['general']['scope'][$key] = array('#type' => 'markup', '#value' => t('Global'), ); + $form['patterns']['general']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), ); + $form['patterns']['general']['pattern'][$key] = array( + '#title' => t('Frontpage'), + '#default_value' => variable_get($key, ''), + '#description' => t('Pattern used as a fallback for the frontpage
(ie, when no other pattern is defined for the frontpage)'), + ) + $pattern_form_element; + + $key = 'page_title_user'; + $form['patterns']['general']['scope'][$key] = array('#type' => 'markup', '#value' => t('User'), ); + $form['patterns']['general']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), ); + $form['patterns']['general']['pattern'][$key] = array( + '#title' => t('User Profile'), + '#default_value' => variable_get($key, ''), + '#description' => t('Pattern used as a fallback for the user profile
(ie, when no other pattern is defined for the user profile page)'), + ) + $pattern_form_element; + $form['patterns']['general']['showfield'][$key .'_showfield'] = array( + '#default_value' => variable_get($key .'_showfield', 0), + ) + $showfield_form_element; + + $key = 'page_title_blog'; + $form['patterns']['general']['scope'][$key] = array('#type' => 'markup', '#value' => t('User'), ); + $form['patterns']['general']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), ); + $form['patterns']['general']['pattern'][$key] = array( + '#title' => t('Blog Homepage'), + '#default_value' => variable_get($key, ''), + '#description' => t('Pattern used as a fallback for the blog homepages
(ie, when no other pattern is defined for the blog homepage)'), + ) + $pattern_form_element; + + $key = 'page_title_forum_root_title'; + $form['patterns']['general']['scope'][$key] = array('#type' => 'markup', '#value' => t('User'), ); + $form['patterns']['general']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), ); + $form['patterns']['general']['pattern'][$key] = array( + '#title' => t('Forum Root'), + '#default_value' => variable_get($key, ''), + '#description' => t('Pattern used as a fallback for forum roots
(ie, when no other pattern is defined for forum roots)'), + ) + $pattern_form_element; + + $key = 'page_title_pager_pattern'; + $form['patterns']['specific']['scope'][$key] = array('#type' => 'markup', '#value' => t('Global'), ); + $form['patterns']['specific']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), ); + $form['patterns']['specific']['pattern'][$key] = array( + '#title' => t('Pager Suffix'), + '#default_value' => variable_get($key, ''), + '#description' => t('Pattern used as a fallback for pager suffixes
(ie, when no other pattern is defined for pager suffixes)'), + ) + $pattern_form_element; + + $key = 'page_title_comment_reply'; + $form['patterns']['specific']['scope'][$key] = array('#type' => 'markup', '#value' => t('Node'), ); + $form['patterns']['specific']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), ); + $form['patterns']['specific']['pattern'][$key] = array( + '#title' => t('Comment Reply'), + '#default_value' => variable_get($key, ''), + '#description' => t('Pattern used as a fallback for comment replies
(ie, when no other pattern is defined for comment replies)'), + ) + $pattern_form_element; + + $key = 'page_title_comment_child_reply'; + $form['patterns']['specific']['scope'][$key] = array('#type' => 'markup', '#value' => t('Node Comment'), ); + $form['patterns']['specific']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), ); + $form['patterns']['specific']['pattern'][$key] = array( + '#title' => t('Comment Child Reply'), + '#default_value' => variable_get($key, ''), + '#description' => t('Pattern used as a fallback for child comment replies
(ie, when no other pattern is defined for child comment replies)'), + ) + $pattern_form_element; + + // PATTERNS THAT NEED LOCALISATION + foreach ($langs as $langcode => $langname){ + + //////////////////////////////////////////////////////// + // GENERAL PATTERNS + // Define the frontpage pattern. This is use on - 'page_title_front' => array( - '#title' => t('Frontpage'), - '#default_value' => variable_get('page_title_front', '[site-name] | [site-slogan]'), - '#description' => t('This pattern will be used for the site frontpage'), - ) + $pattern_form_element, - + $lang_key = 'page_title_front' . '_' . $langcode; + $form['patterns']['general']['pattern'][$lang_key] = array( + '#default_value' => variable_get($lang_key, '[site-name] | [site-slogan]'), + '#description' => t('Pattern used for the site frontpage'), + ) + $pattern_form_element; + $form['patterns']['general']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Global'), ); + $form['patterns']['general']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), ); + + // Define the user profile page pattern. This is used on any 'user/[0-9]' pages + if (module_exists('profile')) { + $lang_key = 'page_title_user' . '_' . $langcode; + $form['patterns']['general']['pattern'][$lang_key] = array( + '#default_value' => variable_get($lang_key, ''), + '#description' => t('Pattern used for any user profile pages'), + ) + $pattern_form_element; + $form['patterns']['general']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('User'), ); + $form['patterns']['general']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), ); + } + + // Add the blog homepage pattern field + if (module_exists('blog')) { + $lang_key = 'page_title_blog' . '_' . $langcode; + $form['patterns']['general']['pattern'][$lang_key] = array( + '#default_value' => variable_get($lang_key, ''), + '#description' => t('Pattern used for a users blog page (ie /blog/1)'), + ) + $pattern_form_element; + $form['patterns']['general']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('User'), ); + $form['patterns']['general']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), ); + } + + // Add the forum root pattern field + if (module_exists('forum')) { + $lang_key = 'page_title_forum_root_title' . '_' . $langcode; + $form['patterns']['general']['pattern'][$lang_key] = array( + '#default_value' => variable_get($lang_key, ''), + '#description' => t('Pattern used on the forum root page (ie, /forum)'), + ) + $pattern_form_element; + $form['patterns']['general']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Global')); + $form['patterns']['general']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), ); + } + + ///////////////////////////////////////////////////// + // SPECIFIC PATTERNS + // Define the pager pattern. This is appended to any page requests containing 'page=[0-9]+' in the query string - 'page_title_pager_pattern' => array( - '#title' => t('Pager Suffix'), - '#default_value' => variable_get('page_title_pager_pattern', ''), - '#description' => t('This pattern will be appended to a page title for any given page with a pager on it'), - ) + $pattern_form_element, - + $lang_key = 'page_title_pager_pattern' . '_' . $langcode; + $form['patterns']['specific']['pattern'][$lang_key] = array( + '#default_value' => variable_get($lang_key, ''), + '#description' => t('Pattern appended to a page title for any given page with a pager on it'), + ) + $pattern_form_element; + $form['patterns']['specific']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Global'), ); + $form['patterns']['specific']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), ); + // Define the comment reply pattern. This is used for a root comment reply (ie comment/[0-9]+). - 'page_title_comment_reply' => array( - '#title' => t('Comment Reply'), - '#default_value' => variable_get('page_title_comment_reply', ''), - '#description' => t('This pattern will be used for comment reply pages, where the reply is directly to a "node"'), - ) + $pattern_form_element, - + $lang_key = 'page_title_comment_reply' . '_' . $langcode; + $form['patterns']['specific']['pattern'][$lang_key] = array( + '#default_value' => variable_get($lang_key, ''), + '#description' => t('Pattern used for comment reply pages, where the reply is directly to a "node"'), + ) + $pattern_form_element; + $form['patterns']['specific']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Node'), ); + $form['patterns']['specific']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), ); + // Define the comment reply to comment pattern. This is used for a reply to a comment (ie comment/[0-9]+/[0-9]+). - 'page_title_comment_child_reply' => array( - '#title' => t('Comment Child Reply'), - '#default_value' => variable_get('page_title_comment_child_reply', ''), - '#description' => t('This pattern with be used for comment reply pages where the reply is to an existing "comment" (eg a comment thread)'), - ) + $pattern_form_element, - - // Define the user profile page pattern. This is used on any 'user/[0-9]' pages - 'page_title_user' => array( - '#title' => t('User Profile'), - '#default_value' => variable_get('page_title_user', ''), - '#description' => t('This pattern will be used for any user profile pages'), - ) + $pattern_form_element, - ); - - - // Define the "showfield" checkbox for the user profile page - $form['patterns']['showfield']['page_title_user_showfield'] = array( - '#default_value' => variable_get('page_title_user_showfield', 0), - ) + $showfield_form_element; - - - // Definate the patterns per-node-type - $types = node_get_types(); - foreach ($types as $type) { - // Define the node-type key - $key = 'page_title_type_'. $type->type; - - // Pattern entry - $form['patterns']['pattern'][$key] = array( - '#title' => t('Content Type - %type', array('%type' => $type->name)), - '#default_value' => variable_get($key, ''), - '#description' => t('This pattern will be used for all %type node-type pages', array('%type' => $type->name)), + $lang_key = 'page_title_comment_child_reply' . '_' . $langcode; + $form['patterns']['specific']['pattern'][$lang_key] = array( + '#default_value' => variable_get($lang_key, ''), + '#description' => t('Pattern used for comment reply pages where the reply is to an existing "comment"
(eg a comment thread)'), ) + $pattern_form_element; - - $form['patterns']['showfield'][$key .'_showfield'] = array( - '#default_value' => variable_get($key .'_showfield', 0), - ) + $showfield_form_element; - - $form['patterns']['scope'][$key] = array('#type' => 'markup', '#value' => t('Node'), ); - } - - - // Definate the patterns per-vocab-type - if Taxonomy Module is enabled + $form['patterns']['specific']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Node Comment'), ); + $form['patterns']['specific']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), ); + + }; // end foreach $langs + + + ///////////////////////////////////////////////////// + // TAXONOMY PATTERNS + // Define the patterns per-vocab-type - if Taxonomy Module is enabled if (module_exists('taxonomy')) { + $vocabs = taxonomy_get_vocabularies(); foreach ($vocabs as $vocab) { + // Define the vocab key - $key = 'page_title_vocab_'. $vocab->vid; - - // Pattern entry - $form['patterns']['pattern'][$key] = array( + $key = 'page_title_vocab'. '_' . $vocab->vid; + + // Fallback + $form['patterns']['taxonomy']['scope'][$key] = array('#type' => 'markup', '#value' => t('Taxonomy'), ); + $form['patterns']['taxonomy']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), ); + $form['patterns']['taxonomy']['pattern'][$key] = array( '#title' => t('Vocabulary - %vocab_name', array('%vocab_name' => $vocab->name)), - '#default_value' => variable_get($key, ''), - '#description' => t('This pattern will be used for all %title term pages', array('%title' => $vocab->name)), - ) + $pattern_form_element; - - $form['patterns']['showfield'][$key .'_showfield'] = array( - '#default_value' => variable_get($key .'_showfield', 0), + '#default_value' => t('No pattern possible'), + ) + $pattern_form_element;; + $form['patterns']['taxonomy']['showfield'][$key .'_showfield'] = array( + '#default_value' => variable_get($key .'_showfield', 0), ) + $showfield_form_element; - - $form['patterns']['scope'][$key] = array('#type' => 'markup', '#value' => t('Taxonomy'), ); + + // We define patterns for all the languages available in Drupal + foreach ($langs as $langcode => $langname){ + // Key language dependant variables : pattern + $lang_key = $key . '_' . $langcode; + + // Pattern entry + $form['patterns']['taxonomy']['pattern'][$lang_key] = array( + '#default_value' => variable_get($lang_key, ''), + '#description' => t('Pattern used for all %title term pages', array('%title' => $vocab->name)), + ) + $pattern_form_element; + $form['patterns']['taxonomy']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), ); + $form['patterns']['taxonomy']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Taxonomy'), ); + } + } } + + ///////////////////////////////////////////////////// + // CONTENT TYPES PATTERNS + // Define the patterns per-node-type + $types = node_get_types(); + foreach ($types as $type) { + + // Define the node-type key + $key = 'page_title_type_'. $type->type; - - // Add the blog homepage pattern field - if (module_exists('blog')) { - $key = 'page_title_blog'; - $form['patterns']['pattern'][$key] = array( - '#title' => t('Blog Homepage'), + // Pattern entry + $form['patterns']['content_type']['scope'][$key] = array('#type' => 'markup', '#value' => t('Node'), ); + $form['patterns']['content_type']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), ); + $form['patterns']['content_type']['pattern'][$key] = array( + '#title' => t('%type', array('%type' => $type->name)), '#default_value' => variable_get($key, ''), - '#description' => t('This pattern will be used for a users blog page (ie /blog/1)'), + '#description' => t('Pattern used as a fallback for all %type pages
(ie, when no other pattern is defined for that content type)', array('%type' => $type->name)), ) + $pattern_form_element; - $form['patterns']['scope'][$key] = array('#type' => 'markup', '#value' => t('User'), ); - } - - - // Add the forum root pattern field - if (module_exists('forum')) { - $form['patterns']['pattern']['page_title_forum_root_title'] = array( - '#title' => t('Forum Root'), - '#default_value' => variable_get('page_title_forum_root_title', ''), - '#description' => t('This pattern will be used on the forum root page (ie, /forum)'), - ) + $pattern_form_element; - $form['patterns']['scope']['page_title_forum_root_title'] = array('#type' => 'markup', '#value' => t('Global')); - } - + $form['patterns']['content_type']['showfield'][$key .'_showfield'] = array( + '#default_value' => variable_get($key .'_showfield', 0), + ) + $showfield_form_element; + + // We define patterns for all the languages available in Drupal + foreach ($langs as $langcode => $langname){ + // Key language dependant variables : pattern + $lang_key = $key . '_' . $langcode; + + // Content Type Entry for language : pattern + $form['patterns']['content_type']['pattern'][$lang_key] = array( + '#default_value' => variable_get($lang_key, ''), + ) + $pattern_form_element; + + $form['patterns']['content_type']['language'][$lang_key] = array( + '#type' => 'markup', + '#value' => t('%lang', array('%lang' => $langname)) + ); + } // end foreach $langs + } // end foreach $types + + // We want to sort the pattern of the arrays alphabetically + // @TODO We should use weight instead to sort out rows + ksort($form['patterns']['general']['pattern']); + ksort($form['patterns']['specific']['pattern']); // Add the token help to a collapsed fieldset at the end of the configuration page. $form['token_help'] = array( diff --git a/page_title.info b/page_title.info index ba2d419..dd70989 100644 --- a/page_title.info +++ b/page_title.info @@ -3,9 +3,9 @@ name = Page Title description = "Enhanced control over the page title (in the <head> tag)." dependencies[] = token core = 6.x -; Information added by drupal.org packaging script on 2010-11-01 +; Information added by drupal.org packaging script on 2010-08-26 version = "6.x-2.x-dev" core = "6.x" project = "page_title" -datestamp = "1288570516" +datestamp = "1282781730" diff --git a/page_title.module b/page_title.module index dc2ef96..3ded073 100644 --- a/page_title.module +++ b/page_title.module @@ -1,5 +1,5 @@ old_type; + $newkey_prefix = 'page_title_type_'. $info->type; + // Handle a content type rename if ($op == 'update' && !empty($info->old_type) && $info->type != $info->old_type) { - // Load the old node type settings. - $temp = variable_get('page_title_type_'. $info->old_type, ''); - - // If the settings aren't empty, then save them into the new type - if (!empty($temp)) { - variable_set('page_title_type_'. $info->type, $temp); - } - - // Delete the old setting - variable_del('page_title_type_'. $info->old_type); - - // Essentially, do the same as above but with the _showfield suffix for the node type - $temp = variable_get('page_title_type_'. $info->old_type .'_showfield', 0); + + // 1. Save showfield setting from old node type + $temp = variable_get($oldkey_prefix .'_showfield', 0); if ($temp) { - variable_set('page_title_type_'. $info->type .'_showfield', $temp); + variable_set($newkey_prefix .'_showfield', $temp); } - variable_del('page_title_type_'. $info->old_type .'_showfield'); - + variable_del($oldkey_prefix .'_showfield'); + + // 2. Save patterns of old node type for each languages available on the system + foreach ($langs as $langcode => $langname) { + + // Key for the old and new node type per language + $oldkey_lang = $oldkey_prefix . '_' . $langcode; + $newkey_lang = $newkey_prefix . '_' . $langcode; + + // Load the old node type setting + $temp = variable_get($oldkey_lang, ''); + + // If the setting is not empty, then save it with the new type + if (!empty($temp)) { + variable_set($newkey_lang, $temp); + } + + // Delete the old setting + variable_del($oldkey_lang); + + } // end foreach $alllangs + } - // If deleted, remove the variables + // Handle a content type deletion if ($op == 'delete') { - variable_del('page_title_type_'. $info->type); - variable_del('page_title_type_'. $info->type .'_showfield'); + + // Removing default pattern and showfield + variable_del($newkey_prefix); + variable_del($newkey_prefix .'_showfield'); + + // Removing patterns associated to a language + foreach ($langs as $langcode => $langname) { + $newkey_lang = $newkey_prefix . '_' . $langcode; + variable_del($newkey_lang); + } + } } @@ -145,15 +176,23 @@ function page_title_node_type($op, $info) { * Implementation of hook_form_alter(). */ function page_title_form_alter(&$form, $form_state, $form_id) { + // If we dont have permission to set the title then we need to abort this alter now! if (!user_access('set page title')) return; // Check we're editing a node and also check that the node type's 'show field' is enabled if ($form['#id'] == 'node-form') { - $key = 'page_title_type_'. $form['type']['#value'] .'_showfield'; - if (variable_get($key, 0)) { - $page_title = isset($form['#node']->page_title) ? $form['#node']->page_title : NULL; - + + $showfield_key = 'page_title_type_'. $form['type']['#value'] .'_showfield'; + + if (variable_get($showfield_key, 0)) { + + $default_pattern_key = 'page_title_type_'. $form['type']['#value']; + // If a language exists for this node, we use the language related page title pattern, else we use the default pattern + $pattern_key = empty($form['#node']->language) ? $default_pattern_key : $default_pattern_key . '_' . $form['#node']->language; + + $page_title = isset($form['#node']->page_title) ? $form['#node']->page_title : variable_get($pattern_key, NULL); + // If we have vertical tabs installed, we need to render the form element slightly differently $show_vertical_tabs = FALSE; if (module_exists('vertical_tabs')) { @@ -207,7 +246,6 @@ function page_title_form_alter(&$form, $form_state, $form_id) { } } - /** * Implementation of hook_form_FORM_ID_alter(). */ @@ -249,6 +287,43 @@ function page_title_form_forum_form_forum_alter(&$form, &$form_state) { } } +/** + * Implementation of hook_form_FORM_ID_alter(). + * Case when we're deleting a vocabulary, we need to remove variables from variable table + */ +function page_title_form_taxonomy_vocabulary_confirm_delete_alter(&$form, &$form_state) { + $form['#submit'][] = 'page_title_taxonomy_vocabulary_confirm_delete_submit'; +} + +/** + * Submit handler for the taxonomy_vocabulary_confirm_delete_submit element added in the hook_form_alter() above. + */ +function page_title_taxonomy_vocabulary_confirm_delete_submit($form, $form_state) { + // Remove all variables from {variable} table associated with the vocabulary deleted + // ie: begins with 'page_title_vocab_' and ends with '$lang' + $regexp = "^page_title_vocab(.)*_{1}$"; + $query = "DELETE FROM {variable} WHERE name REGEXP '%s'"; + db_query($query, $regexp); +} + +/** + * Implementation of hook_form_FORM_ID_alter(). + * Case when we're deleting a language, we need to remove variables from variable table + */ +function page_title_form_locale_languages_delete_form_alter(&$form, &$form_state) { + $form['#submit'][] = 'page_title_locale_languages_delete_form_submit'; +} + +/** + * Submit handler for the locale_languages_delete_form element added in the hook_form_alter() above. + */ +function page_title_locale_languages_delete_form_submit($form, $form_state) { + // Remove all variables from variable table associated to the language deleted + // ie: begins with 'page_title_' and ends with '$lang' + $regexp = "^page_title_(.)*_" . $form['langcode']['#value'] . "{1}$"; + $query = "DELETE FROM {variable} WHERE name REGEXP '%s'"; + db_query($query, $regexp); +} /** * Implementation of hook_form_FORM_ID_alter(). @@ -283,6 +358,10 @@ function page_title_form_user_profile_form_alter(&$form, &$form_state) { * Implementation of hook_form_FORM_ID_alter(). */ function page_title_form_node_type_form_alter(&$form, &$form_state) { + + // key by content type + $key = 'page_title_type_'. $form['#node_type']->type; + // Alter the node type form - allows easy access to the per-content type page title settings $form['page_title'] = array( '#type' => 'fieldset', @@ -299,13 +378,13 @@ function page_title_form_node_type_form_alter(&$form, &$form_state) { '#options' => array( 'show_field' => t('Show field'), ), - '#default_value' => variable_get('page_title_type_'. $form['#node_type']->type .'_showfield', 0) ? array('show_field') : array(), + '#default_value' => variable_get( $key .'_showfield', 0) ? array('show_field') : array(), ); $form['page_title']['pattern'] = array( '#type' => 'textfield', '#title' => t('Page Title Pattern'), - '#default_value' => variable_get('page_title_type_'. $form['#node_type']->type, ''), + '#default_value' => variable_get( $key , ''), '#description' => t('Enter the Page Title pattern you want to use for this node type. For more information, please use the !link settings page', array('!link' => l('Page Title', 'admin/content/page_title'))), ); @@ -317,9 +396,13 @@ function page_title_form_node_type_form_alter(&$form, &$form_state) { * Submit handler for the node_type_form element added in the hook_form_alter() above. */ function page_title_node_type_form_submit($form, &$form_state) { + + $key_type = 'page_title_type_'. $form_state['values']['type']; + $show_field = $form_state['values']['page_title']['show_field']['show_field'] ? 1 : 0; - variable_set('page_title_type_'. $form_state['values']['type'] .'_showfield', $show_field); - variable_set('page_title_type_'. $form_state['values']['type'], $form_state['values']['page_title']['pattern']); + + variable_set($key_type .'_showfield', $show_field); + variable_set($key_type, $form_state['values']['page_title']['pattern']); // For some reason the node module adds the fieldset as a separate entry in the variables table... we dont want this! variable_del('page_title_'. $form_state['values']['type']); @@ -441,7 +524,7 @@ function page_title_load_title($id, $type) { /** * Wrapper for old function... - * NOTE: This has been depricated in favor of page_title_load_title(). + * @deprecated Use page_title_load_title() instead. */ function page_title_node_get_title($nid) { return page_title_load_title($nid, 'node'); @@ -450,7 +533,7 @@ function page_title_node_get_title($nid) { /** * Legacy page title setting function... - * NOTE: This has been deprecated in favour of hook_page_title_alter(). + * @deprecated Use hook_page_title_alter() instead. */ function page_title_set_title($title = NULL) { static $stored_title; @@ -490,20 +573,28 @@ function page_title_page_get_title($raw = FALSE) { call_user_func_array($function, $data); } - // If pattern is emtpy (either if the type is not overridable or simply not set) fallback to the default pattern) - if (empty($page_title_pattern)) { - $page_title_pattern = variable_get('page_title_default', '[page-title] | [site-name]'); + if (empty($page_title_pattern)){ + // pattern is still not set -> fallback to default global pattern + $page_title_pattern = empty($page_title_pattern) ? variable_get('page_title_default', '[page-title] | [site-name]') : ''; } // Append the pattern for pages with a pager on them - $page_title_pattern .= isset($_REQUEST['page']) ? variable_get('page_title_pager_pattern', '') : ''; + global $language; + $default_key = 'page_title_pager_pattern'; + $lang_key = $default_key . '_' . $language->language; + $pager_pattern = variable_get($lang_key, ''); + // Fallback for pager + if(empty($pager_pattern)){ + $pager_pattern = variable_get($default_key, '[page-title] | [site-name]'); + } + $page_title_pattern .= isset($_REQUEST['page']) ? $pager_pattern : ''; // Apply token patterns by resetting the token cache first and then using token_replace_multiple to insert token values token_get_values('global', NULL, TRUE); $title = token_replace_multiple($page_title_pattern, $types); } - // Trim trailing whitespace from the title + // Trimi trailing whitespace from the title $title = trim($title); // Use filter_xss to remove any tags and to entity encode content. @@ -589,7 +680,6 @@ function _page_title_build_views_keys($view_name, $display_id) { return 'page_title-'. implode('-', array_filter(array($view_name, $display_id))); } - /** * Form Alter handler for the views ui config form (used for filters and args) */ diff --git a/tests/page_title.test b/tests/page_title.test index 1c79ae8..26ce11b 100644 --- a/tests/page_title.test +++ b/tests/page_title.test @@ -1,5 +1,5 @@ drupalPost('admin/settings/page-title', $settings, t('Save configuration')); + $this->drupalPost('admin/content/page-title', $settings, t('Save configuration')); $this->assertText(t('The configuration options have been saved.'), t('The configuration saved message was found'), 'Page Title'); @@ -92,7 +92,7 @@ class PageTitleTestCase extends DrupalWebTestCase { /** * Lets check a "default" page, such a the page title admin form */ - $this->drupalGet('admin/settings/page-title'); + $this->drupalGet('admin/content/page-title'); $title = ''. $settings['page_title_default'] .''; $this->pass(check_plain($title)); $title = str_replace('[page-title]', 'Page title', $title); diff --git a/tests/page_title_views_test.info b/tests/page_title_views_test.info index 14fc2e7..186837b 100644 --- a/tests/page_title_views_test.info +++ b/tests/page_title_views_test.info @@ -5,9 +5,9 @@ package = Development dependencies[] = page_title dependencies[] = views -; Information added by drupal.org packaging script on 2010-11-01 +; Information added by drupal.org packaging script on 2010-08-26 version = "6.x-2.x-dev" core = "6.x" project = "page_title" -datestamp = "1288570516" +datestamp = "1282781730"