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(); } // Wanted fallback on next case, replace: no terms + the new ones (no break; please) case TAXONOMY_ACTION_ADD: foreach ($context['fields'] as $field => $terms) { foreach ($terms as $value) { if (!is_array($node->{$field})) { $node->{$field} = array(); } // If the term ID is already in the array, it does not make sense to re-add foreach ($node->{$field} as $already) { if ($already['value'] == $value['value']) { // Continues at next new term 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]); } } // Reset numerical IDs to make it continous $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'], ); }