views:

37

answers:

2

Is there a clean way to remove the draggable option on multiple-value CCK fields? I assume I could style it out with CSS but that doesn't seem like the "right" way to do it.

Ideally, the draggable option wouldn't be available for any users except admins.

Thanks!

+1  A: 

It looks like the tabledrag stuff is being built in the cck theme functions - eg theme_content_multiple_values it's adding a 'draggable' class to the table rows, and calling drupal_add_tabledrag on the table.

You should be able to override this in your theme/module(?) and add a fairly simple switch to test for users with an appropriate permission before adding the drag.

Andrew
A: 

Thanks for the tip @Andrew. Here's what I ended up coming up with:

function stannes_content_multiple_values($element) {
  global $user;
  $field_name = $element['#field_name'];
  $field = content_fields($field_name);
  $output = '';

  if ($field['multiple'] >= 1) {
$table_id = $element['#field_name'] .'_values';
$order_class = $element['#field_name'] .'-delta-order';
$required = !empty($element['#required']) ? '<span class="form-required" title="'. t('This field is required.') .'">*</span>' : '';

$header = array(
  array(
    'data' => t('!title: !required', array('!title' => $element['#title'], '!required' => $required)),
    'colspan' => 2
  )
);

if ($user->uid == 1) {
    $header[] = t('Order');
}

$rows = array();

// Sort items according to '_weight' (needed when the form comes back after
// preview or failed validation)
$items = array();
foreach (element_children($element) as $key) {
  if ($key !== $element['#field_name'] .'_add_more') {
    $items[] = &$element[$key];
  }
}
usort($items, '_content_sort_items_value_helper');

// Add the items as table rows.
foreach ($items as $key => $item) {
  $item['_weight']['#attributes']['class'] = $order_class;
  $delta_element = drupal_render($item['_weight']);
  if ($user->uid == 1) {
    $cells = array(
      array('data' => '', 'class' => 'content-multiple-drag'),
      drupal_render($item),
      array('data' => $delta_element, 'class' => 'delta-order'),
    );
  } else {
    $cells = array(
      drupal_render($item)
    );
  }
  $rows[] = array(
    'data' => $cells,
    'class' => 'draggable',
  );
}

$output .= theme('table', $header, $rows, array('id' => $table_id, 'class' => 'content-multiple-table'));
$output .= $element['#description'] ? '<div class="description">'. $element['#description'] .'</div>' : '';
$output .= drupal_render($element[$element['#field_name'] .'_add_more']);

if ($user->uid == 1) {
    drupal_add_tabledrag($table_id, 'order', 'sibling', $order_class);
}

} else { foreach (element_children($element) as $key) { $output .= drupal_render($element[$key]); } }

return $output; }

Ian Silber

related questions