domain_user)) { return drupal_access_denied(); } // Cast the -1 as 0. if (isset($user->domain_user[-1])) { unset($user->domain_user[-1]); $user->domain_user[0] = 0; } $query = "SELECT domain_id, subdomain, sitename, scheme FROM {domain} WHERE domain_id IN (". db_placeholders($user->domain_user, 'int') .")"; } // Table information $header = array( array('data' => t('Id'), 'field' => 'domain_id'), array('data' => t('Site content'), 'field' => 'sitename'), array('data' => t('Content count')), array('data' => t('Site'), 'field' => 'subdomain'), ); $query .= tablesort_sql($header); $result = pager_query($query, variable_get('domain_list_size', DOMAIN_LIST_SIZE), 0, NULL, $user->domain_user); $rows = array(); while ($domain = db_fetch_array($result)) { $path = trim(domain_get_path($domain), '/'); $rows[] = array( $domain['domain_id'], l(t('@sitename content', array('@sitename' => $domain['sitename'])), 'admin/domain/content/'. $domain['domain_id']), (int) db_result(db_query("SELECT COUNT(*) FROM {domain_access} WHERE gid = %d AND realm = 'domain_id'", $domain['domain_id'])), l(t('view site'), $path), ); } $all = array( '-', l(t('Content assigned to all affiliates'), 'admin/domain/content/all'), (int) db_result(db_query("SELECT COUNT(*) FROM {domain_access} WHERE gid = 0 AND realm = 'domain_site'")), '', ); array_unshift($rows, $all); if (!empty($rows)) { $output = '
'. t('The table below shows all the affiliates sites whose content you may edit. Click on the site name link to see all content assigned to that affiliate.') .'
'; $output .= theme_table($header, $rows); $output .= theme('pager', NULL, variable_get('domain_list_size', DOMAIN_LIST_SIZE), 0); return $output; } else { return t('You do not have editing access to any domains. Please contact your site administrator.'); } } /** * Content administration for a specific domain. * This callback puts the user on the current domain and then * fetches the appropirate content for batch editing. * * @param $domain_id * The unique identifier for the currently active domain. * @param $all_affiliates * A boolean flag that indicates whether to grant the domain_site node access * realm for this content view. * * @return * A link group for each domain the user can access. */ function domain_content_view($domain_id = NULL, $all_affiliates = FALSE) { global $_domain; // Load the active domain, which is not necessarily the current domain. if (!is_null($domain_id) && $domain_id != $_domain['domain_id']) { domain_set_domain($domain_id); } $output = ''; // Override the $_domain global so we can see the appropriate content if (!is_null($domain_id)) { $_domain['site_grant'] = FALSE; drupal_set_title(t('Content for @domain', array('@domain' => $_domain['sitename']))); } else if ($all_affiliates) { $_domain['site_grant'] = TRUE; drupal_set_title(t('Content for all affiliate sites')); } // KILLSWITCH CASE: returns an error else { drupal_set_message(t('Invalid request'), 'error'); $output .= t('The specified domain does not exist.
'); return $output; } $output .= domain_content_admin(); return $output; } /** * Content admin page callback. * * @return * A themed HTML batch content editing form. */ function domain_content_admin() { // Load the form basics for administering nodes. include_once drupal_get_path('module', 'node') .'/node.admin.inc'; $output = drupal_get_form('node_filter_form'); if (isset($_POST['nodes']) && $_POST['operation'] == 'delete') { return drupal_get_form('node_multiple_delete_confirm', $_POST['nodes']); } // Call the form first, to allow for the form_values array to be populated. $output .= drupal_get_form('domain_content_form'); return $output; } /** * Rewrites node_admin_nodes() to use db_rewrite_sql(). * * @return * A form array according to the FormsAPI. */ function domain_content_form($form_state) { global $_domain; $filter = node_build_filter_query(); // Bypass the superuser permissions by forcing an AND on {domain_access}. $filter['join'] .= " INNER JOIN {domain_access} dac ON dac.nid = n.nid "; $arg = arg(3); if ($arg != 'all') { // In this case, we must check the domain_id grant. // We use intval() here for security, since we are not filtering the query parameter otherwise. if (empty($filter['where'])) { $filter['where'] = " WHERE dac.realm = 'domain_id' AND dac.gid = ". intval($_domain['domain_id']) ." "; } else { $filter['where'] .= " AND dac.realm = 'domain_id' AND dac.gid = ". intval($_domain['domain_id']) ." "; } } else { // Or check the domain_site grant. if (empty($filter['where'])) { $filter['where'] = " WHERE dac.realm = 'domain_site' AND dac.gid = 0 "; } else { $filter['where'] .= " AND dac.realm = 'domain_site' AND dac.gid = 0 "; } } $result = pager_query(db_rewrite_sql('SELECT n.nid, n.changed FROM {node} n '. $filter['join'] . $filter['where'] .' ORDER BY n.changed DESC'), 50, 0, NULL, $filter['args']); // Reset the active domain. domain_reset_domain(); $nodes = array(); // Loop through the nodes to build the form while ($nid = db_fetch_object($result)) { $node = node_load($nid->nid); $form['title'][$node->nid] = array('#value' => l($node->title, 'node/'. $node->nid) .' '. theme('mark', node_mark($node->nid, $node->changed))); $form['name'][$node->nid] = array('#value' => check_plain(node_get_types('name', $node))); $form['username'][$node->nid] = array('#value' => theme('username', $node)); $form['status'][$node->nid] = array('#value' => ($node->status ? t('published') : t('not published'))); $node_domains = array(); if (!empty($node->domains)) { foreach ($node->domains as $domain) { // The root domain is stored as -1, but cast as zero in the global variable. $key = ($domain == -1) ? 0 : $domain; // Convert the domain ids to data so we can print them. $node_domains[] = domain_lookup($key); } } // If we have multiple domains, print them. $items = array(); if ($node->domain_site) { $items[-1] = t('All affiliates'); } if (!empty($node_domains)) { foreach ($node_domains as $item) { $items[$item['domain_id']] = check_plain($item['sitename']); } } if (module_exists('domain_source')) { $source = NULL; $source = db_fetch_object(db_query("SELECT domain_id FROM {domain_source} WHERE nid = %d", $node->nid)); if (!empty($source) && isset($items[$source->domain_id])) { $items[$source->domain_id] .= '*'; } } $form['domains'][$node->nid] = array('#value' => theme('item_list', $items)); if (node_access('update', $node)) { $form['operations'][$node->nid] = array('#value' => l(t('edit'), 'node/'. $node->nid .'/edit', array('query' => drupal_get_destination()))); $nodes[$node->nid] = ''; } } // Privileged users can make global changes to Domain Access permissions. if (user_access('set domain access')) { domain_content_add_form_widget($form); } // Users must have passed at least one access check to have batch options. if ((user_access('administer nodes') || user_access('set domain access')) && !empty($nodes)) { $form['options'] = array('#type' => 'fieldset', '#title' => t('Update options'), '#prefix' => '