View source
<?php
include_once 'oa_clone.features.inc';
define('OA_CLONE_ACTION_PATH', 'node/%node/clone/%clone_token');
define('OA_CLONE_CREATE_SPACE_PATH', 'node/add/oa-space/%');
function oa_clone_menu() {
$items = array();
$items['node/%node/oa_clone_create_space_type'] = array(
'title' => 'Create Blueprint from this Space',
'page callback' => 'oa_clone_create_space_type_page_callback',
'page arguments' => array(
1,
),
'access callback' => 'oa_clone_create_space_type_access_callback',
'access arguments' => array(
1,
),
'type' => MENU_LOCAL_TASK,
);
return $items;
}
function oa_clone_create_space_type_access_callback($node) {
$vid = oa_core_taxonomy_vocabulary('space_type')->vid;
return $node->type == 'oa_space' && user_access("edit terms in {$vid}") && node_access('view', $node);
}
function oa_clone_create_space_type_page_callback($node) {
drupal_goto('admin/structure/taxonomy/space_type/add', array(
'query' => array(
'oa_clone_space' => $node->nid,
'destination' => "node/{$node->nid}",
),
));
}
function oa_clone_menu_alter(&$items) {
if (isset($items[OA_CLONE_ACTION_PATH])) {
$items[OA_CLONE_ACTION_PATH]['type'] = MENU_LOCAL_TASK;
$items[OA_CLONE_ACTION_PATH]['page callback'] = 'oa_clone_node_check';
}
if (isset($items[OA_CLONE_CREATE_SPACE_PATH])) {
$items[OA_CLONE_CREATE_SPACE_PATH]['page callback'] = 'oa_clone_create_space_page_callback';
}
}
function oa_clone_node_check($node) {
$method = variable_get('clone_method', 'prepopulate');
switch ($method) {
case 'save-edit':
if (variable_get('clone_nodes_without_confirm', FALSE)) {
$new_nid = clone_node_save($node->nid);
$options = array();
if (!empty($_GET['node-clone-destination'])) {
$options['query']['destination'] = $_GET['node-clone-destination'];
}
drupal_goto('node/' . $new_nid . '/edit', $options);
}
else {
return drupal_get_form('clone_node_confirm', $node);
}
break;
case 'prepopulate':
default:
return oa_clone_node_prepopulate($node);
break;
}
}
function oa_clone_node_prepopulate($original_node, $set_title = TRUE) {
if (isset($original_node->nid)) {
if (clone_is_permitted($original_node->type)) {
module_load_include('inc', 'clone', 'clone.pages');
$node = _clone_node_prepare($original_node, TRUE);
if ($set_title) {
drupal_set_title($node->title);
}
else {
$node->title = '';
}
$context = array(
'method' => 'prepopulate',
'original_node' => $original_node,
);
drupal_alter('clone_node', $node, $context);
$form_state = array();
$form_state['build_info']['args'] = array(
$node,
);
form_load_include($form_state, 'inc', 'page_manager', 'plugins/tasks/node_edit');
return page_manager_node_edit($node);
}
}
}
function oa_clone_create_space_page_callback($type, $space_tid) {
if ($space_type = taxonomy_term_load($space_tid)) {
$wrapper = entity_metadata_wrapper('taxonomy_term', $space_type);
if ($wrapper->field_oa_clone_enabled
->value() && ($node = $wrapper->field_oa_clone_space
->value())) {
drupal_set_title(t('Create @name Space', array(
'@name' => $space_type->name,
)));
$node->oa_clone_bypass_access_check = TRUE;
return oa_clone_node_prepopulate($node, FALSE);
}
return oa_core_create_space_page_callback($type, $space_tid);
}
return MENU_NOT_FOUND;
}
function oa_clone_permission() {
return array(
'clone node in any group' => array(
'title' => t('Clone any node in any group'),
'description' => t('The <em>Clone any node</em> permission only affects nodes that are not in an Organic Group - this permission affects nodes in Organic Groups.'),
),
'clone own nodes in any group' => array(
'title' => t('Clone own content in any group'),
'description' => t('The <em>Clone own nodes</em> permission only affects nodes that are not in an Organic Group - this permission affects nodes in Organic Groups.'),
),
);
}
function oa_clone_og_permission() {
return array(
'clone node' => array(
'title' => t('Clone any content in this Space'),
'default role' => array(
OG_ADMINISTRATOR_ROLE,
),
),
'clone own nodes' => array(
'title' => t('Clone own content in this Space'),
'default role' => array(
OG_ADMINISTRATOR_ROLE,
),
),
);
}
function oa_clone_clone_access_alter(&$access, $node) {
global $user;
if ($user->uid == 0) {
$access = FALSE;
return;
}
if (og_is_group_content_type('node', $node->type) && clone_is_permitted($node->type)) {
if (!empty($node->oa_clone_bypass_access_check)) {
$access = TRUE;
return;
}
if (!node_access('view', $node) || !node_access('create', $node->type)) {
$access = FALSE;
return;
}
$own_node = $user->uid && $node->uid == $user->uid;
if (user_access('clone node in any group') || $own_node && user_access('clone own nodes in any group')) {
$access = TRUE;
return;
}
$gid = oa_core_get_group_from_node($node->nid);
$access = og_user_access('node', $gid, 'clone node') || $own_node && og_user_access('node', $gid, 'clone own nodes');
}
}
function oa_clone_form_taxonomy_form_term_alter(&$form, &$form_state, $form_id) {
$vocabulary = $form['#vocabulary'];
if ($vocabulary->machine_name == 'space_type' && !empty($_GET['oa_clone_space']) && ($space = node_load($_GET['oa_clone_space']))) {
$form['name']['#default_value'] = $space->title . ' ' . t('Space');
$form['description']['#default_value'] = t('A new Space that is just like @title.', array(
'@title' => $space->title,
));
$form['field_oa_clone_enabled'][LANGUAGE_NONE]['#default_value'] = TRUE;
$form['field_oa_clone_space'][LANGUAGE_NONE][0]['target_id']['#default_value'] = $space->title . " ({$space->nid})";
}
}
function oa_clone_form_oa_space_node_form_alter(&$form, &$form_state) {
$node = $form['#node'];
$form['field_oa_space_type'][LANGUAGE_NONE]['#description'] = t('Changing the <em>Space Blueprint</em> after the Space has already been created, will only affect the default dashboard layout and available types - not content or configuration.');
if (empty($node->nid)) {
$form['oa_clone_bypass_access_check'] = array(
'#type' => 'value',
'#value' => !empty($node->oa_clone_bypass_access_check) ? '1' : '0',
);
}
if (!empty($node->clone_from_original_nid) && module_exists('oa_subspaces')) {
if (isset($form[OA_PARENT_SPACE][LANGUAGE_NONE][0]['admin'])) {
$form[OA_PARENT_SPACE][LANGUAGE_NONE][0]['admin']['#default_value'] = '';
$form[OA_PARENT_SPACE][LANGUAGE_NONE][0]['admin']['#init'] = array();
foreach ($node->{OA_PARENT_SPACE}[LANGUAGE_NONE] as $delta => $target) {
$form[OA_PARENT_SPACE][LANGUAGE_NONE][0]['admin'][$delta]['target_id']['#default_value'] = '';
$form[OA_PARENT_SPACE][LANGUAGE_NONE][0]['admin'][$delta]['target_id']['#init'] = array();
}
}
if (isset($form[OA_PARENT_SPACE][LANGUAGE_NONE][0]['default'])) {
$form[OA_PARENT_SPACE][LANGUAGE_NONE][0]['default']['#default_value'] = '';
$form[OA_PARENT_SPACE][LANGUAGE_NONE][0]['default']['#init'] = array();
$form[OA_PARENT_SPACE][LANGUAGE_NONE][0]['#other_groups_ids'] = array();
}
}
}
function oa_clone_form_node_form_alter(&$form, &$form_state) {
$node = $form['#node'];
if (!empty($node->clone_from_original_nid) && isset($form[OA_SPACE_FIELD][LANGUAGE_NONE][0]['admin'])) {
$form[OA_SPACE_FIELD][LANGUAGE_NONE][0]['admin'][0]['target_id']['#default_value'] = '';
}
}
function oa_clone_clone_node_alter(&$node, $context) {
$original_node = $context['original_node'];
if (!empty($original_node->oa_clone_skip)) {
$node->oa_clone_skip = TRUE;
}
}
function oa_clone_prepare($original_node, $space_nid = NULL, $section_nid = NULL, $bypass_access_check = FALSE) {
if (!is_object($original_node)) {
$original_node = node_load($original_node);
$original_node->oa_clone_skip = TRUE;
}
$original_node->oa_clone_bypass_access_check = $bypass_access_check;
if (clone_access_cloning($original_node)) {
module_load_include('inc', 'clone', 'clone.pages');
$node = _clone_node_prepare($original_node, FALSE);
if ($space_nid) {
if ($node->type == 'oa_space') {
if (module_exists('oa_subspaces')) {
$node->{OA_PARENT_SPACE}[LANGUAGE_NONE][0]['target_id'] = $space_nid;
}
}
else {
$node->{OA_SPACE_FIELD}[LANGUAGE_NONE][0]['target_id'] = $space_nid;
}
}
if ($section_nid) {
$node->{OA_SECTION_FIELD}[LANGUAGE_NONE][0]['target_id'] = $section_nid;
}
$context = array(
'method' => 'save-edit',
'original_node' => $original_node,
);
drupal_alter('clone_node', $node, $context);
return $node;
}
}
function oa_clone_save($node, $original_node = NULL) {
$original_node = is_object($original_node) ? $original_node : node_load($original_node);
node_save($node);
if ($original_node) {
$_SESSION['oa_clone_map'][$node->nid] = $original_node->nid;
}
if (module_exists('rules') && !empty($original_node)) {
rules_invoke_event('clone_node', $node, $original_node);
}
}
function oa_clone($original_node, $space_nid = NULL, $section_nid = NULL, $bypass_access_check = FALSE) {
$node = oa_clone_prepare($original_node, $space_nid, $section_nid, $bypass_access_check);
if ($node) {
oa_clone_save($node, $original_node);
}
return $node;
}
function oa_clone_get_section_content($nid, $bypass_access_check = FALSE) {
$query = new EntityFieldQuery();
$query
->entityCondition('entity_type', 'node')
->fieldCondition('oa_section_ref', 'target_id', $nid);
if ($bypass_access_check) {
$query
->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT');
}
else {
$query
->propertyCondition('status', 1);
}
$result = $query
->execute();
if (isset($result['node'])) {
return array_keys($result['node']);
}
return array();
}
function oa_clone_get_group_memberships($nid) {
$query = new EntityFieldQuery();
$query
->entityCondition('entity_type', 'og_membership')
->propertyCondition('group_type', 'node')
->propertyCondition('gid', $nid)
->propertyCondition('entity_type', 'user');
$result = $query
->execute();
if (isset($result['og_membership'])) {
return array_keys($result['og_membership']);
}
return array();
}
function oa_clone_node_presave($node) {
if (empty($node->nid) && ($items = field_get_items('node', $node, 'field_oa_space_type')) && ($space_type = taxonomy_term_load($items[0]['tid'])) && !empty($node->oa_wizard_name) && ($steps = oa_wizard_get_steps($node->oa_wizard_name)) && ($wrapper = entity_metadata_wrapper('taxonomy_term', $space_type)) && $wrapper->field_oa_clone_enabled
->value() && ($clone_node = $wrapper->field_oa_clone_space
->value())) {
module_load_include('inc', 'clone', 'clone.pages');
$clone_node_prepared = _clone_node_prepare($clone_node, TRUE);
$context = array(
'method' => 'prepopulate',
'original_node' => $clone_node,
);
drupal_alter('clone_node', $clone_node_prepared, $context);
$fields_transfer = array_merge(array(
'title',
'panelizer',
'clone_from_original_nid',
), array_keys(field_info_instances('node', $node->type)));
foreach ($steps as $step) {
foreach ($step['fields'] as $field_name) {
$pos = array_search($field_name, $fields_transfer);
if ($pos !== FALSE) {
unset($fields_transfer[$pos]);
}
}
}
$fields_transfer = array_diff($fields_transfer, array(
'oa_parent_space',
));
foreach ($fields_transfer as $field_name) {
if (isset($clone_node_prepared->{$field_name})) {
$node->{$field_name} = $clone_node_prepared->{$field_name};
}
}
$node->oa_clone_bypass_access_check = TRUE;
$node->oa_clone_alter_batch = TRUE;
}
}
function oa_clone_node_delete($node) {
foreach (oa_clone_get_space_type_terms($node) as $term) {
taxonomy_term_delete($term->tid);
}
}
function oa_clone_node_insert($node) {
if (in_array($node->type, array(
'oa_section',
'oa_space',
'oa_group',
)) && !empty($node->clone_from_original_nid) && empty($node->oa_clone_skip)) {
$original_nid = $node->clone_from_original_nid;
$batch = array(
'title' => t('Cloning content...'),
'operations' => array(),
'finished' => 'oa_clone_batch_finished',
);
switch ($node->type) {
case 'oa_section':
$batch['operations'][] = array(
'oa_clone_batch_clone_section_content',
array(
$node,
$original_nid,
),
);
break;
case 'oa_space':
_oa_clone_batch_space($batch, $node, $original_nid);
break;
case 'oa_group':
$batch['operations'][] = array(
'oa_clone_batch_clone_group_memberships',
array(
$node,
$original_nid,
),
);
$batch['operations'][] = array(
'oa_clone_batch_clone_group_metadata',
array(
$node,
$original_nid,
),
);
break;
}
batch_set($batch);
if (!empty($node->oa_clone_alter_batch)) {
$batch =& batch_get();
$batch['redirect_callback'] = 'oa_clone_save_batch_info';
$batch['source_url'] = (!empty($_GET['sitemap']) ? 'sitemap/' : 'node/') . $node->nid;
}
}
}
function oa_clone_save_batch_info($url, $options) {
if (!empty($options['query']['op']) && $options['query']['op'] == 'finish') {
drupal_goto($url);
}
else {
$redirect =& drupal_static('oa_wizard_redirect');
$redirect = url($url, $options);
}
}
function _oa_clone_batch_space(&$batch, $space, $original_space_nid) {
$bypass_access_check = !empty($space->oa_clone_bypass_access_check);
$batch['operations'][] = array(
'oa_clone_batch_clone_group_metadata',
array(
$space,
$original_space_nid,
),
);
$not_orphan = array();
foreach (array_keys(oa_core_space_sections($original_space_nid, 1, $bypass_access_check, array(), TRUE)) as $original_section_nid) {
$not_orphan[$original_section_nid] = $original_section_nid;
if ($clone_section = oa_clone($original_section_nid, $space->nid, NULL, $bypass_access_check)) {
$not_orphan = array_merge($not_orphan, oa_clone_get_section_content($original_section_nid, $bypass_access_check));
$batch['operations'][] = array(
'oa_clone_batch_clone_section_content',
array(
$clone_section,
$original_section_nid,
),
);
}
}
if (module_exists('oa_subspaces')) {
$associated_entities = oa_core_get_groups_by_parent($original_space_nid);
if (!empty($associated_entities)) {
foreach ($associated_entities as $original_subspace_nid) {
$not_orphan[$original_subspace_nid] = $original_subspace_nid;
if ($original_subspace_nid != $space->nid && ($clone_subspace = oa_clone($original_subspace_nid, $space->nid, NULL, $bypass_access_check))) {
_oa_clone_batch_space($batch, $clone_subspace, $original_subspace_nid);
}
}
}
}
if (module_exists('og_vocab') && ($vocabs = og_vocab_relation_get_by_group('node', $original_space_nid))) {
foreach ($vocabs as $vocab) {
$batch['operations'][] = array(
'oa_clone_batch_og_vocab',
array(
$space,
$vocab->vid,
$original_space_nid,
),
);
}
}
if ($nids = array_diff(oa_clone_get_orphan_content($original_space_nid, $bypass_access_check), $not_orphan)) {
$batch['operations'][] = array(
'oa_clone_batch_clone_orphan_content',
array(
$space,
$nids,
),
);
}
$batch['operations'][] = array(
'oa_clone_batch_og_menu_clone',
array(
$space,
$original_space_nid,
),
);
}
function oa_clone_batch_og_vocab($space, $vocab_vid, $original_space_nid) {
if (($vocab = taxonomy_vocabulary_load($vocab_vid)) && ($relations = og_vocab_relation_get($vocab_vid))) {
$first_relation = reset($relations);
if (variable_get('og_vocab_allow_shared_vocabularies', FALSE) && !empty($first_relation->settings['shared'])) {
og_vocab_relation_save($vocab->vid, 'node', $space->nid, $first_relation->settings);
}
else {
$new_vocab = clone $vocab;
unset($new_vocab->vid);
$new_vocab->machine_name = $new_vocab->machine_name . '_' . $space->nid;
taxonomy_vocabulary_save($new_vocab);
if (!empty($new_vocab->vid)) {
og_vocab_relation_save($new_vocab->vid, 'node', $space->nid, $first_relation->settings);
db_query('INSERT into {og_vocab} (vid, entity_type, bundle, settings, field_name) SELECT :vid, entity_type, bundle, settings, field_name FROM {og_vocab} WHERE vid = :old_vid', array(
':vid' => $new_vocab->vid,
':old_vid' => $vocab_vid,
));
if ($tree = taxonomy_get_tree($vocab_vid)) {
$saved = array();
foreach ($tree as $term) {
$loaded_term = taxonomy_term_load($term->tid);
$new_term = clone $loaded_term;
unset($new_term->tid);
$new_term->vid = $new_vocab->vid;
if (!empty($term->parents)) {
foreach ($term->parents as $parent_id) {
if (!empty($saved[$parent_id])) {
$new_term->parent[] = $saved[$parent_id];
}
}
}
taxonomy_term_save($new_term);
if (!empty($new_term->tid)) {
$saved[$term->tid] = $new_term->tid;
}
}
}
}
}
}
}
function oa_clone_get_orphan_content($space_nid, $bypass_access_check = FALSE) {
$query = db_select('node', 'n');
$query
->fields('n', array(
'nid',
));
$query
->addJoin('LEFT', 'field_data_oa_section_ref', 'f', 'f.entity_id = n.nid');
$query
->addJoin('INNER', 'og_membership', 'om', "om.group_type = 'node' AND om.entity_type = 'node' AND om.etid = n.nid");
$query
->isNull('f.oa_section_ref_target_id');
$query
->condition('gid', $space_nid);
$query
->condition('n.type', array(
'oa_group',
'oa_space',
'oa_section',
), 'NOT IN');
$query
->condition('om.state', OG_STATE_ACTIVE);
if (!$bypass_access_check) {
$query
->addTag('node_access');
$query
->condition('n.status', 1);
}
$result = $query
->execute();
return $result
->fetchCol();
}
function oa_clone_batch_clone_orphan_content($space, $nids, &$context) {
if (empty($context['sandbox']['max'])) {
$context['sandbox']['content_ids'] = $nids;
$context['sandbox']['max'] = count($context['sandbox']['content_ids']);
$context['sandbox']['progress'] = 0;
$context['results']['total'] = (!empty($context['results']['total']) ? $context['results']['total'] : 0) + $context['sandbox']['max'];
}
$next_id = array_shift($context['sandbox']['content_ids']);
if (!$next_id) {
$context['sandbox']['finished'] = TRUE;
return;
}
$original_node = node_load($next_id);
$original_node->oa_clone_skip = TRUE;
$bypass_access_check = !empty($space->oa_clone_bypass_access_check);
$clone = oa_clone($original_node, $space->nid, NULL, $bypass_access_check);
$context['sandbox']['progress']++;
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
function oa_clone_batch_og_menu_clone($space, $original_space_nid, &$context) {
$new_mlid = og_menu_single_get_link_mlid_or_create('node', $space->nid);
if ($mlid = og_menu_single_get_link_mlid('node', $original_space_nid)) {
$link = menu_link_load($mlid);
$tree = _menu_build_tree(OG_MENU_SINGLE_MENU_NAME, array(
'expanded' => array(
$mlid,
),
'min_depth' => $link['depth'] + 1,
));
if (!empty($tree['tree'])) {
$_SESSION['oa_clone_map'][$space->nid] = $original_space_nid;
_oa_clone_og_menu_traverse_tree($tree, $new_mlid, $_SESSION['oa_clone_map']);
}
}
unset($_SESSION['oa_clone_map']);
}
function _oa_clone_og_menu_traverse_tree(&$tree, $plid, $map) {
if (!empty($tree['node_links'])) {
foreach ($tree['node_links'] as $nid => $links) {
foreach ($links as $mlid => $link) {
if ($new_nid = array_search($nid, $map)) {
$new_link = _oa_clone_clone_menu_link($link, $plid, $new_nid);
$tree['tree'][$mlid]['new_link'] = $new_link;
}
}
}
}
if (!empty($tree['tree'])) {
foreach ($tree['tree'] as $tree_mlid => $info) {
if (empty($info['new_link']['mlid'])) {
$new_link = _oa_clone_clone_menu_link($info['link'], $plid);
$tree['tree'][$tree_mlid]['new_link'] = $new_link;
}
if (!empty($info['new_link']['mlid']) && ($child_tree = _menu_build_tree(OG_MENU_SINGLE_MENU_NAME, array(
'expanded' => array(
$tree_mlid,
),
'min_depth' => $info['link']['depth'] + 1,
)))) {
$tree['tree'][$tree_mlid]['below'] = $child_tree;
_oa_clone_og_menu_traverse_tree($tree['tree'][$tree_mlid]['below'], $info['new_link']['mlid'], $map);
}
}
}
}
function _oa_clone_clone_menu_link($old_link, $new_plid, $new_nid = NULL) {
$new_link = array();
$keep = array(
'link_title',
'menu_name',
'module',
'hidden',
'external',
'expanded',
'weight',
'customized',
);
foreach ($keep as $key) {
if (isset($old_link[$key])) {
$new_link[$key] = $old_link[$key];
}
}
$new_link['plid'] = $new_plid;
if (!empty($new_nid)) {
$new_link['link_path'] = 'node/' . $new_nid;
}
else {
$new_link['link_path'] = $old_link['link_path'];
}
menu_link_save($new_link);
return $new_link;
}
function oa_clone_batch_clone_section_content($node, $original_nid, &$context) {
$bypass_access_check = !empty($node->oa_clone_bypass_access_check);
if (empty($context['sandbox']['max'])) {
$context['sandbox']['content_ids'] = oa_clone_get_section_content($original_nid, $bypass_access_check);
$context['sandbox']['max'] = count($context['sandbox']['content_ids']);
$context['sandbox']['nid'] = $node->nid;
$context['sandbox']['progress'] = 0;
$context['results']['total'] = (!empty($context['results']['total']) ? $context['results']['total'] : 0) + $context['sandbox']['max'];
}
$next_id = array_shift($context['sandbox']['content_ids']);
if (!$next_id) {
$context['sandbox']['finished'] = TRUE;
return;
}
$original_node = node_load($next_id);
$original_node->oa_clone_skip = TRUE;
$clone = oa_clone($original_node, $node->{OA_SPACE_FIELD}[LANGUAGE_NONE][0]['target_id'], $node->nid, $bypass_access_check);
$context['sandbox']['progress']++;
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
function oa_clone_batch_clone_group_memberships($node, $original_nid, &$context) {
if (empty($context['sandbox']['max'])) {
$context['sandbox']['membership_ids'] = oa_clone_get_group_memberships($original_nid);
$context['sandbox']['max'] = count($context['sandbox']['membership_ids']);
$context['sandbox']['gid'] = $node->nid;
$context['sandbox']['progress'] = 0;
}
$next_id = array_shift($context['sandbox']['membership_ids']);
if (!$next_id) {
$context['sandbox']['finished'] = TRUE;
return;
}
$original_membership = og_membership_load($next_id);
$membership = clone $original_membership;
$membership->id = NULL;
$membership->gid = $node->nid;
og_membership_save($membership);
$context['sandbox']['progress']++;
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
function oa_clone_batch_clone_group_metadata($node, $original_nid, &$context) {
foreach (variable_store_list_all('og', 'node_' . $original_nid) as $name) {
variable_realm_set('og', 'node_' . $node->nid, $name, variable_realm_get('og', 'node_' . $original_nid, $name));
}
$original_role_map = array();
$original_roles = og_roles('node', $node->type, $original_nid);
foreach ($original_roles as $original_rid => $original_name) {
$original_role_map[$original_name] = $original_rid;
if (!in_array($original_name, array(
OG_ANONYMOUS_ROLE,
OG_AUTHENTICATED_ROLE,
OG_ADMINISTRATOR_ROLE,
))) {
$role = og_role_create($original_name, 'node', $node->nid, $node->type);
og_role_save($role);
}
}
$permissions = og_role_permissions($original_roles);
foreach (og_roles('node', $node->type, $node->nid) as $rid => $name) {
if ($rid != $original_role_map[$name]) {
og_role_change_permissions($rid, $permissions[$original_role_map[$name]]);
}
}
module_invoke_all('oa_clone_group_metadata', $node, $original_nid);
}
function oa_clone_batch_finished($success, $results, $operations) {
if ($success) {
$total = !empty($results['total']) ? $results['total'] : 0;
drupal_set_message(t('Finished cloning @num_ids pieces of content successfully.', array(
'@num_ids' => $total + 1,
)));
}
else {
drupal_set_message(t('Error cloning content.'), 'error');
}
}
function oa_clone_get_space_type_terms($node) {
$query = new EntityFieldQuery();
$query
->entityCondition('entity_type', 'taxonomy_term')
->fieldCondition('field_oa_clone_space', 'target_id', $node->nid)
->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT');
$result = $query
->execute();
return !empty($result['taxonomy_term']) ? $result['taxonomy_term'] : array();
}