View source
<?php
function views_bulk_operations_content_taxonomy_action_info() {
if (!module_exists('content_taxonomy')) {
return array();
}
return array(
'views_bulk_operations_content_taxonomy_action' => array(
'type' => 'node',
'description' => t('Modify content taxonomy terms'),
'configurable' => TRUE,
'behavior' => array(
'changes_node_property',
),
),
);
}
function views_bulk_operations_content_taxonomy_action(&$node, $context) {
switch ($context['do']) {
case TAXONOMY_ACTION_REPLACE:
foreach ($context['fields'] as $field => $terms) {
$node->{$field} = array();
}
case TAXONOMY_ACTION_ADD:
foreach ($context['fields'] as $field => $terms) {
foreach ($terms as $value) {
if (!is_array($node->{$field})) {
$node->{$field} = array();
}
foreach ($node->{$field} as $already) {
if ($already['value'] == $value['value']) {
continue 2;
}
}
$node->{$field}[] = $value;
}
}
break;
case TAXONOMY_ACTION_DELETE:
foreach ($context['fields'] as $field => $terms) {
if (!is_array($node->{$field})) {
continue;
}
if (empty($node->{$field})) {
continue;
}
foreach ($terms as $term) {
foreach ($node->{$field} as $k => $already) {
if ($already['value'] == $term['value']) {
unset($node->{$field}[$k]);
}
}
$node->{$field} = array_values($node->{$field});
}
}
break;
}
}
function views_bulk_operations_content_taxonomy_action_form($context) {
module_load_include('inc', 'content', 'includes/content.node_form');
if (isset($context['selection']) && isset($context['view'])) {
$fields = array();
$nids = array_map('_views_bulk_operations_get_oid', $context['selection'], array_fill(0, count($context['selection']), $context['view']->base_field));
$placeholders = db_placeholders($nids);
$result = db_query("SELECT field_name, label, type FROM {node} n LEFT JOIN {content_node_field_instance} ci ON n.type=ci.type_name WHERE nid IN ({$placeholders}) AND widget_module LIKE 'content_taxonomy_%' GROUP BY field_name", $nids);
while ($f = db_fetch_object($result)) {
$fields[$f->field_name] = array(
'label' => $f->label,
'type' => $f->type,
);
}
}
if (empty($fields)) {
drupal_set_message(t('The selected nodes do not have any Content Taxonomy fields. Please select other nodes and try again.'), 'error');
return array();
}
$form['fields'] = array(
'#type' => 'fieldset',
'#title' => t('Content Taxonomy fields'),
'#tree' => TRUE,
);
$form_state = array();
foreach ($fields as $field => $details) {
$info = content_types($details['type']);
$form['#node'] = new stdClass();
$form['#node']->type = $details['type'];
$form['#node']->{$field} = NULL;
$form['#field_info'][$field] = $info['fields'][$field];
$form['fields'] += (array) content_field_form($form, $form_state, $info['fields'][$field]);
$form['fields'][$field]['#required'] = FALSE;
}
$form['do'] = array(
'#type' => 'radios',
'#title' => t('Action to take'),
'#default_value' => isset($context['do']) ? $context['do'] : TAXONOMY_ACTION_ADD,
'#options' => array(
TAXONOMY_ACTION_ADD => t('Add the selected terms'),
TAXONOMY_ACTION_REPLACE => t('Replace existing terms with selected ones'),
TAXONOMY_ACTION_DELETE => t('Delete selected terms'),
),
'#required' => TRUE,
'#weight' => -2,
);
return $form;
}
function views_bulk_operations_content_taxonomy_action_submit($form, $form_state) {
return array(
'do' => $form_state['values']['do'],
'fields' => $form_state['values']['fields'],
);
}