Question

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.

Was it helpful?

Solution 2

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;
}

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top