cck_dummy_node_form) { global $_domain; $options = array(); $domains = domain_domains(); $show = FALSE; if (user_access('set domain access')) { $show = TRUE; foreach ($domains as $domain) { $options[$domain['domain_id']] = check_plain($domain['sitename']); } } // In the case of users with limited permissions, option 3 is the "show options" value. else if (user_access('view domain publishing') && variable_get('domain_options', 0) == 3) { global $user; // Get the user's allowed domains. foreach ($domains as $domain) { if ($user->domain_user[$domain['domain_id']] != 0 && $domain['domain_id'] == $user->domain_user[$domain['domain_id']]) { $options[$domain['domain_id']] = $domain['sitename']; } } // Is this node assigned to a source that the user can control? $source = $form['#node']->domain_source; if (isset($source)) { if ($user->domain_user[$source] == $source) { $show = TRUE; } else { $form['domain']['domain_source_notes'] = array( '#value' => '
'. t('This content is assigned to %domain and cannot be reassigned.', array('%domain' => $domains[$source]['sitename'])) .'
', ); } } } // Determine how to show the form element. if ($show) { $form['domain']['domain_source'] = array( '#type' => 'select', '#title' => t('Source domain'), '#options' => $options, '#default_value' => isset($form['#node']->domain_source) ? $form['#node']->domain_source : $_domain['domain_id'], '#description' => t('This affiliate will be used to write links to this content from other affiliates, as needed.') ); } // Non-privileged users just have the current domain assigned. else { $form['domain']['domain_source'] = array( '#type' => 'value', '#value' => (isset($form['#node']->domain_source)) ? $form['#node']->domain_source : $_domain['domain_id'], ); } } // Integration with Domain Content else if ($form_id == 'domain_content_form') { global $_domain; $options = array(); $domains = domain_domains(); $show = FALSE; if (user_access('set domain access')) { foreach ($domains as $domain) { $options[$domain['domain_id']] = $domain['sitename']; } $form['domain']['domain_source'] = array( '#type' => 'select', '#title' => t('Source domain'), '#options' => $options, '#default_value' => $_domain['domain_id'], '#description' => t('This affiliate will be linked to from other affiliates, as needed.') ); $form['#validate']['domain_source_validate'] = array(); $form['#submit']['domain_source_update_nodes'] = array(); } } } /** * Implement hook_nodeapi() */ function domain_source_nodeapi(&$node, $op, $a3, $a4) { switch ($op) { case 'validate': // If not set, we ignore. if (!isset($node->domain_source)) { return; } // Cast the key from zero to -1 to match the data coming from the input. ($node->domain_source == 0) ? $key = -1 : $key = $node->domain_source; // Check the domain and domains_raw variables to set up the allowed source list. $allowed = array(); if (!empty($node->domains) && is_array($node->domains)) { $allowed = $node->domains; } if (!empty($node->domains_raw) && is_array($node->domains_raw)) { $allowed = array_merge($allowed, $node->domains_raw); } if ($node->domain_site && $key == -1) { // This case is acceptable, so we let it pass. // I find this code easier to read than a compound IF statement. } // Here we account for both the 'domains_raw' and 'domains' options. else if (!in_array($key, $allowed)) { form_set_error('domain_source', t('The source affiliate must be selected as a publishing option.')); } break; case 'insert': case 'update': db_query("DELETE FROM {domain_source} WHERE nid = %d", $node->nid); db_query("INSERT INTO {domain_source} (nid, domain_id) VALUES (%d, %d)", $node->nid, $node->domain_source); break; case 'delete': db_query("DELETE FROM {domain_source} WHERE nid = %d", $node->nid); break; case 'load': if ($node->nid) { $source = array(); $source = db_fetch_array(db_query("SELECT domain_id FROM {domain_source} WHERE nid = %d", $node->nid)); } if (empty($source)) { $node->domain_source = variable_get('domain_default_source', 0); } else { $node->domain_source = $source['domain_id']; } break; case 'view': // Search module casts both $a3 and $a4 as FALSE, not NULL. // We check that to hide this data from search and other nodeapi // calls that are neither a teaser nor a page view. if ($a3 !== FALSE || $a4 !== FALSE) { if (variable_get('domain_debug', 0) && user_access('set domain access') && isset($node->domain_source)) { $source = domain_lookup($node->domain_source); $node->content['domain_source'] = array('#value' => '

'. t('Source domain: %source', array('%source' => $source['sitename'])) .'

', '#weight' => 25); } } break; } } /** * FormAPI function that lets us update access rules. */ function domain_source_update_nodes($form_id, $form_values) { // If our operation is flagged, then we have to manually change the // {node_access} table. The rest of the process will clear the cache, // so this should be a safe operation. if ($form_values['operation'] == 'domain') { $source = $form_values['domain_source']; foreach ($form_values['nodes'] as $key => $value) { if ($key == $value) { db_query("DELETE FROM {domain_source} WHERE nid = %d", $key); db_query("INSERT INTO {domain_source} (nid, domain_id) VALUES (%d, %d)", $key, $source); } } } } /** * Form validation step */ function domain_source_validate($form_id, $form_values) { if ($form_values['operation'] == 'domain') { ($form_values['domain_source'] == 0) ? $key = -1 : $key = $form_values['domain_source']; if ($form_values['domain_site'] && $key == -1) { // This case is acceptable, so we let it pass. // I find this code easier to read than a compound IF statement. } // Here we account for both the 'domains_raw' and 'domains' options. // If selected, these clauses will not be zero. else if (!$form_values['domains'][$key] && (!empty($form_values['domains_raw']) && !in_array($key, $form_values['domains_raw']))) { form_set_error('domain_source', t('The source affiliate must be selected as a publishing option.')); } } } /** * Implement hook_domainupdate() * * When deleting domain records, we remove all traces from the {domain_source} table. */ function domain_source_domainupdate($op, $domain = array(), $edit = array()) { if ($op == 'delete' && $domain['domain_id'] > 0) { db_query("DELETE FROM {domain_source} WHERE domain_id = %d", $domain['domain_id']); } }