Index: og_views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/og/og_views.inc,v
retrieving revision 1.12.2.42
diff -u -p -r1.12.2.42 og_views.inc
--- og_views.inc	2 Dec 2007 02:00:05 -0000	1.12.2.42
+++ og_views.inc	24 Dec 2007 01:56:12 -0000
@@ -233,13 +233,20 @@ function og_views_tables() {
       'filters' => array(
         'currentuidsimple' => array(
           'field' => 'uid',
-          'name' => t('OG: Group in User Subbed Groups'),
+          'name' => t('OG: Current user is subscribed to group'),
           'operator' => 'views_handler_operator_eqneq',
           'list' => 'views_handler_filter_usercurrent',
           'list-type' => 'select',
-          'help' => t('Groups are filtered to where current user is a member .'),
+          'help' => t("Groups are filtered by current user's membership."),
         ),
       ),            
+      'sorts' => array(
+        'count' => array(
+          'name' => t('Og: Group: Subscriber Count'),
+          'handler' => 'og_handler_sort_field_count',
+          'help' => t('Sort by the number of OG subscribers'),
+        ),
+      ),
     ),
     'og_uid_node' => array(
       'name' => 'og_uid',
@@ -258,11 +265,11 @@ function og_views_tables() {
       'filters' => array(
         'currentuid' => array(
           'field' => 'uid',
-          'name' => t('OG: Post in User Subbed Groups'),
+          'name' => t('OG: Node in group that user is subscribed to'),
           'operator' => 'views_handler_operator_eqneq',
           'list' => 'views_handler_filter_usercurrent',
           'list-type' => 'select',
-          'help' => t('Posts are filtered to groups that current user is a member of.'),
+          'help' => t("Nodes are filtered by current user's membership."),
         ),
       ),            
     ),
@@ -304,32 +311,36 @@ function og_views_tables() {
 }
 
 function og_views_arguments() {
-  $args = array(
+  return array(
     'gid' => array(
-      'name' => t("OG: Group nid(s)"), 
-      'handler' => 'og_handler_argument_gid',
+      'name' => t('OG: Group nid(s)'), 
+      'handler' => 'og_views_handler_argument_gid',
       'help' => t('Filter for the one or more organic groups. Groups should be specified as a comma or plus delimited list of node ids, like taxonomy URLs. '),
     ),
     'name' => array(
-      'name' => t("OG: Group name"), 
-      'handler' => 'og_handler_argument_group_name_like',
+      'name' => t('OG: Group name'), 
+      'handler' => 'og_views_handler_argument_group_name_like',
       'option' => array(
         '#type' => 'select',
         '#options' => 'views_handler_operator_like',
       ),
       'help' => t('Filter for the one or more organic groups. Groups should be specified by name, or part of a name. Use the <em>Option</e> field to specify how to match the supplied name.'),
-      )
-    );
-  return $args;
+    ),
+    'og_uid' => array(
+      'name' => t('OG: User is subscribed to group'), 
+      'handler' => 'og_views_handler_argument_uid',
+      'help' => t('Filter for groups that user is subscribed to.  User is specified by user ID (integer)'),
+    ),
+  );
 }
 
 /*
  * Custom argument for filtering by one or more group nids.
  */
-function og_handler_argument_gid($op, &$query, $argtype, $arg = '') {
+function og_views_handler_argument_gid($op, &$query, $argtype, $arg = '') {
   switch ($op) {
     case 'summary':
-      og_handler_summary($fieldinfo, $query);
+      og_views_handler_summary($fieldinfo, $query);
       return $fieldinfo;
     case 'link':
       if ($name = $query->title) {
@@ -348,17 +359,17 @@ function og_handler_argument_gid($op, &$
       og_views_break_phrase($arg, $query);
       break;
     case 'title':
-      return db_result(db_query_range('SELECT title FROM {node} WHERE nid = %d', $query, 0, 1));;
+      return db_result(db_query_range('SELECT title FROM {node} WHERE nid = %d', $query, 0, 1));
   }
 }
 
 /*
  * Custom argument for filtering by group name. Delegates much work to views_handler_filter_like()
  */
-function og_handler_argument_group_name_like($op, &$query, $argtype, $arg = '') {
+function og_views_handler_argument_group_name_like($op, &$query, $argtype, $arg = '') {
   switch ($op) {
     case 'summary':
-      og_handler_summary($fieldinfo, $query); 
+      og_views_handler_summary($fieldinfo, $query); 
       return $fieldinfo;
     case 'link':
       if ($name = $query->title) {
@@ -385,6 +396,21 @@ function og_handler_argument_group_name_
   }
 }
 
+/**
+ * Custom argument for filtering by groups that a user is subscribed to
+ */
+function og_views_handler_argument_uid($op, &$query, $a1, $a2 = null) {
+  switch ($op) {
+    case 'filter':
+      $query->ensure_table('og_uid');
+      $query->add_where("og_uid.uid = %d", $a2);
+      break;
+    case 'title':
+      // This returns the title for this node in the title, breadcrumb, etc.
+      return db_result(db_query_range('SELECT name FROM {users} WHERE uid = %d', $query, 0, 1));
+  }
+}
+
 // not currently in use. should work though.
 // helper function. restrict to unaffiliated posts.
 // function og_handler_unaffiliated(&$query) {
@@ -396,7 +422,7 @@ function og_handler_argument_group_name_
 // }
 
 // helper function.
-function og_handler_summary(&$fieldinfo, &$query) {
+function og_views_handler_summary(&$fieldinfo, &$query) {
   $query->ensure_table('og_ancestry');
   $query->ensure_table('og_node_data');
   $query->add_field('title', 'og_node_data');
@@ -1287,6 +1313,21 @@ function og_handler_filter_picg($op, $fi
   $query->add_where("og_ancestry.group_nid = ***CURRENT_GID***");
 }
 
+/**
+ * Views handler to sort by the number subscriptions
+ */
+function og_handler_sort_field_count($op, &$query, $sortinfo, $sort) {
+  if (method_exists($query, 'add_subquery')) {
+    $sql = "SELECT ou.nid, COUNT(*) as num FROM {og_uid} ou INNER JOIN {users} u ON ou.uid = u.uid WHERE u.status > 0 GROUP BY ou.nid";
+    $join = array(
+      'left' => array('table' => 'node', 'field' => 'nid'),
+      'right' => array('field' => 'nid'),
+    );
+    $query->add_subquery($sql, array(), $join, 'og_count');
+    $query->orderby[] = 'og_count.num '. $sort['sortorder'];
+  }
+}
+
 /*
  * Simple array for current group.
  */
