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 Option field to specify how to match the supplied name.'), - ) - ); - return $args; + ), + '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. */