diff --git a/og_announce.module b/og_announce.module index 051b557..52e1070 100644 --- a/og_announce.module +++ b/og_announce.module @@ -9,68 +9,35 @@ function og_announce_form_alter(&$form, $form_state, $form_id) { if (og_is_group_type($node->type)) { $form['og_announce'] = array( '#type' => 'checkbox', - '#title' => t('Announcement-only'), + '#title' => t('Announcement only'), '#default_value' => (isset($node->og_announce) ? $node->og_announce : 0), '#weight' => 0, '#description' => t('Only group administrators may post to this group.'), ); } - elseif (og_is_group_post_type($node->type)) { - if (isset($form['og_nodeapi']['visible']['og_groups']['#options'][t('My groups')])) { - $invisible_groups = array_merge( - _og_announce_filter_groups($form['og_nodeapi']['visible']['og_groups']['#options'][t('My groups')]), - _og_announce_filter_groups($form['og_nodeapi']['visible']['og_groups']['#options'][t('Other groups')]) - ); - if (empty($form['og_nodeapi']['visible']['og_groups']['#options'][t('Other groups')])) { - $form['og_nodeapi']['visible']['og_groups']['#options'] = $form['og_nodeapi']['visible']['og_groups']['#options'][t('My groups')]; - $form['og_nodeapi']['visible']['og_groups']['#type'] = count($form['og_nodeapi']['visible']['og_groups']['#options']) < 20 ? 'checkboxes' : 'select'; + // Remove announcement groups from form when user is not a group admin. + else if (og_is_group_post_type($node->type) && !user_access('administer organic groups')) { + $form['#validate'][] = 'og_announce_groups_validate'; + $groups = $form['og_nodeapi']['visible']['og_groups']['#options']; + if (!empty($groups)) + foreach ($groups as $group => $value) { + if (_og_announce_is_announce($group) && !og_is_group_admin($group)) { + unset($form['og_nodeapi']['visible']['og_groups']['#options'][$group]); } } - else { - $invisible_groups = _og_announce_filter_groups($form['og_nodeapi']['visible']['og_groups']['#options']); - } - $form['og_nodeapi']['visible']['og_groups']['#default_value'] = array_diff($form['og_nodeapi']['visible']['og_groups']['#default_value'], $invisible_groups); - - // Filter out $_GET['gids'] - $group_ids = drupal_map_assoc($_GET['gids']); - _og_announce_filter_groups($group_ids); - if (!empty($form['og_invisible']['og_groups_inaccessible']['#value'])) { - $form['og_invisible']['og_groups_inaccessible']['#value'] = array_diff($form['og_invisible']['og_groups_inaccessible']['#value'], $group_ids); - } - - // Only retain groups that this post is a part of. - $invisible_groups = array_intersect($form['og_nodeapi']['visible']['og_groups']['#default_value'], $invisible_groups, $group_ids); - if (!empty($invisible_groups)) { - if (!isset($form['og_invisible']['og_groups_inaccessible'])) { - $form['og_invisible']['og_groups_inaccessible'] = array('#type' => 'value', '#value' => array()); - } - $form['og_invisible']['og_groups_inaccessible']['#value'] = array_merge($invisible_groups, $form['og_invisible']['og_groups_inaccessible']['#value']); - }dsm($form); } } } /** - * Filter out groups that are announcement-only. + * Validate posts to announcement groups. */ -function _og_announce_filter_groups(&$groups) { - if (empty($groups)) { - return array(); - } - $invisible = array(); - global $user; - $query = db_query('SELECT a.*, u.is_admin FROM og_announce a LEFT JOIN og_uid u ON a.nid = u.nid AND (u.uid IS NULL OR u.uid = %d) WHERE a.nid IN (' . db_placeholders($groups) . ')', array_merge(array($user->uid), array_keys($groups))); - $announce_groups = array(); - while ($result = db_fetch_array($query)) { - $announce_groups[$result['nid']] = $result; - } - foreach ($groups as $key => $group) { - if (isset($announce_groups[$key]) && $announce_groups[$key]['announce'] && !$announce_groups[$key]['is_admin']) { - unset($groups[$key]); - $invisible[$key] = $key; +function og_announce_groups_validate(&$form, &$form_state) { + foreach ($form_state['values']['og_groups'] as $key => $group) { + if (_og_announce_is_announce($group) && !og_is_group_admin($group)) { + form_set_error('og_groups', t('Only group administrators may post to this group.')); } } - return $invisible; } /** @@ -96,8 +63,9 @@ function og_announce_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { break; case 'load': if (og_is_group_type($node->type)) { - $node->og_announce = (int) db_result(db_query('SELECT announce FROM {og_announce} WHERE nid = %d', $node->nid)); + $node->og_announce = _og_announce_is_announce($nid); } + break; } } @@ -105,12 +73,19 @@ function og_announce_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { * Implementation of hook_og_links_alter(). */ function og_announce_og_links_alter(&$links, $node) { - global $user; - if ($node->og_announce && empty($user->og_groups[$node->nid]['is_admin'])) { + if ($node->og_announce && !og_is_group_admin($node)) { foreach ($links as $key => $link) { if (strpos($key, 'create_') === 0) { unset($links[$key]); } } } -} \ No newline at end of file +} + +/** + * Check if group is announcement only. + * @param: $nid; Group node id. + */ +function _og_announce_is_announce($nid) { + return (int) db_result(db_query('SELECT announce FROM {og_announce} WHERE nid = %d', $nid)); +}