? page_title_meets_views.patch
? page_title_meets_views_again.patch
Index: page_title.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/page_title/page_title.install,v
retrieving revision 1.9
diff -u -p -r1.9 page_title.install
--- page_title.install	3 Aug 2007 05:22:19 -0000	1.9
+++ page_title.install	18 Feb 2008 17:45:54 -0000
@@ -68,3 +68,16 @@ function page_title_update_1() {
   }
   return $items;
 }
+
+function page_title_update_2() {
+  $items = array();
+  switch ($GLOBALS['db_type']) {
+    case 'mysqli':
+    case 'mysql':
+      $items[] = update_sql('ALTER TABLE {page_title} CHANGE nid pid INT;');
+      $items[] = update_sql('ALTER TABLE {page_title} ADD COLUMN type VARCHAR(32) NOT NULL DEFAULT "node" FIRST;');
+      $items[] = update_sql('ALTER TABLE {page_title} DROP PRIMARY KEY;');
+      $items[] = update_sql('ALTER TABLE {page_title} ADD PRIMARY KEY (type,pid);');
+  }
+  return $items;  
+}
\ No newline at end of file
Index: page_title.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/page_title/page_title.module,v
retrieving revision 1.12.2.12
diff -u -p -r1.12.2.12 page_title.module
--- page_title.module	18 Feb 2008 13:49:48 -0000	1.12.2.12
+++ page_title.module	18 Feb 2008 17:45:55 -0000
@@ -202,6 +202,51 @@ function page_title_form_alter($form_id,
       '#weight' => -4,
     );
   }
+  
+  elseif ($form_id == 'views_edit_view') {
+    $page = $form['page-info'];
+    $newPage = array();
+    
+    if ($form['vid']['#value']) {
+      $default_title = page_title_get_title($form['vid']['#value'], 'view');
+    }
+    else {
+      $default_title = '';
+    }
+    
+    while (list($key, $val) = each($page)) {
+      $newPage[$key] = $val;
+      unset ($page[$key]);
+      if ($key == 'page_title') {
+        $newPage['head_title'] = array(
+          '#type' => 'textfield',
+          '#title' => t('Head Title'),
+          '#description' => t('The title which appears in the &lt;head&gt; section, provided by Page Title module.'),
+          '#size' => 60,
+          '#maxlength' => 255,
+          '#default_value' => $default_title,
+        );
+        break;
+      }
+    }
+    $newPage = array_merge($newPage, $page);
+    
+    $form['page-info'] = $newPage;
+    $form['#submit']['page_title_view_edit_view_submit'] = array();
+  }
+  
+}
+
+/**
+ * Submit callback used by the form_alter on view edit/add pages.
+ *
+ * @param string $form_id
+ * @param array $form_values
+ */
+function page_title_view_edit_view_submit($form_id, $form_values) {
+  $vid = $form_values['vid'];
+  db_query('DELETE FROM {page_title} WHERE type="view" AND pid=%d', $vid);
+  db_query('INSERT INTO {page_title} VALUES ("view", %d, "%s")', $vid, $form_values['head_title']);
 }
 
 /**
@@ -210,38 +255,58 @@ function page_title_form_alter($form_id,
 function page_title_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
   switch ($op) {
     case 'update':
-      db_query("DELETE FROM {page_title} WHERE nid = %d", $node->nid);
+      db_query('DELETE FROM {page_title} WHERE type = "node" nid = %d', $node->nid);
       // fallthrough to insert intentional!
     case 'insert':
       if (isset($node->page_title) && strlen(trim($node->page_title)) > 0) {
-        db_query("INSERT INTO {page_title} VALUES (%d, '%s')", $node->nid, $node->page_title);
+        db_query('INSERT INTO {page_title} VALUES ("node", %d, "%s")', $node->nid, $node->page_title);
       }
       break;
 
     case 'delete':
-      db_query('DELETE FROM {page_title} WHERE nid = %d', $node->nid);
+      db_query('DELETE FROM {page_title} WHERE type = "node" nid = %d', $node->nid);
       break;
 
     case 'load':
-      return array('page_title' => page_title_node_get_title($node->nid));
-    
+      return array('page_title' => page_title_get_title($node->nid));
+      
     //Load the page title for the node-edit forms
     case 'prepare' :
-      if ($node) {
-        page_title_set_node($node);
-      }
+      page_title_cache_info(array(
+        'type' => 'node',
+        'node_type' => $node->type,
+        'page_title' => $node->page_title,
+      ));
       break;
     
     //Load the page title for a node view, but ONLY if node is full page and not a teaser.  
     case 'view':
       if ($page && !$teaser) {
-        page_title_set_node($node);
+        page_title_cache_info(array(
+          'type' => 'node',
+          'node_type' => $node->type,
+          'page_title' => $node->page_title,
+        ));
       }
       break;
   }
 }
 
 /**
+ * Implementation of hook_views_pre_view (from views.module)
+ */
+
+function page_title_views_pre_view($view, $items) {
+  $page_title = page_title_get_title($view->vid, 'view');
+
+  page_title_cache_info(array(
+    'type' => 'view',
+    'page_title' => $page_title,
+  ));
+}
+
+
+/**
  * Sets or retrieves the page title of the current page.
  *
  * @param $settings
@@ -249,13 +314,13 @@ function page_title_nodeapi(&$node, $op,
  * @return
  *   string The settings array.
  */
-function page_title_set_node($node = NULL) {
-  static $stored_node = NULL;
+function page_title_cache_info($data = NULL) {
+  static $cache = NULL;
 
-  if (isset($node)) {
-    $stored_node = $node;
+  if (isset($data)) {
+    $cache = $data;
   }
-  return $stored_node;
+  return $cache;
 }
 
 /**
@@ -263,12 +328,15 @@ function page_title_set_node($node = NUL
  *
  * @return unknown
  */
-function page_title_get_title() {
+function _page_title_get_title() {
   $display_options = variable_get('page_title_display', array());
-  $node = page_title_set_node();
+  $data = page_title_cache_info();
   
-  if ($display_options[$node->type] && !empty($node->page_title)) {
-    return check_plain(strip_tags($node->page_title));
+  if ($data['type'] == 'node' && $display_options[$data['node_type']] && !empty($data['page_title'])) {
+    return check_plain(strip_tags($data['page_title']));
+  }
+  elseif ($data['type'] == 'view' && !empty($data['page_title'])) {
+    return check_plain(strip_tags($data['page_title']));
   }
   else {
     return strip_tags(drupal_get_title());
@@ -286,8 +354,8 @@ function page_title_get_title() {
  * @return
  *   string The node's page title.
  */
-function page_title_node_get_title($nid) {
-  return db_result(db_query('SELECT page_title FROM {page_title} WHERE nid = %d', $nid));
+function page_title_get_title($nid, $type = 'node') {
+  return db_result(db_query('SELECT page_title FROM {page_title} WHERE type = "%s" AND pid = %d', $type, $nid));
 }
 
 /**
@@ -310,11 +378,18 @@ function page_title_page_get_title() {
     }
     //Otherwise this is a non-frontpage page title.
     else {
-      //Get the node for this page
-      $node = page_title_set_node();
+      //Get cached data
+      $data = page_title_cache_info();
 
-      //Get the pattern for the node type. If no node type available, assume blank
-      $page_title_pattern = variable_get('page_title_type_' . (isset($node->type) ? $node->type : ''), '');
+      //Do the specific page type patterns
+      if ($data['type'] == 'node') {
+        //Get the pattern for this type
+        $page_title_pattern = variable_get('page_title_type_' . $data['node_type'], '');
+        
+      }
+      elseif ($node['type'] == 'view') {
+        //No patterns for views yet... TODO
+      }
       
       //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)) {
@@ -347,7 +422,7 @@ function page_title_token_values($type) 
   $values = array();
   
   if ($type == 'global') {
-    $values['page-title'] = page_title_get_title();
+    $values['page-title'] = _page_title_get_title();
   }
   
   return $values;
