array( 'render element' => 'form', ), ); } /** * Select view mode according to node type and user roles. * * @param $node * A node object. * @return * A view mode. */ function _view_mode_per_role_get_view_mode($node) { global $user; $settings = variable_get('view_mode_per_role_' . $node->type, array()); $view_mode = 'full'; while ($view_mode == 'full' && $setting = current($settings)) { if (!empty($user->roles[$setting['role']])) { $view_mode = $setting['view_mode']; } next($settings); } return $view_mode; } /** * Implements hook_form_alter() for node_type_form. */ function view_mode_per_role_form_node_type_form_alter(&$form, $form_state) { // Node type edit form. if (isset($form['type'])) { drupal_add_js(drupal_get_path('module', 'view_mode_per_role') . '/view_mode_per_role.js'); // Load old settings $settings = variable_get('view_mode_per_role_' . $form['#node_type']->type, array()); $settings[] = array('role' => NULL, 'view_mode' => NULL); // Prepare roles $roles = user_roles(); $roles = array('_none' => t('Select')) + $roles; // Prepare view modes $infos = entity_get_info('node'); $views_modes = array(); $views_modes['_none'] = t('Select'); foreach ($infos['view modes'] as $id => $data) { $views_modes[$id] = $data['label']; } // Build fieldset $form['view_mode_per_role'] = array( '#title' => t('View mode per role'), '#type' => 'fieldset', '#group' => 'additional_settings', '#tree' => FALSE, ); $form['view_mode_per_role']['vmpr_settings'] = array( '#tree' => TRUE, '#theme' => 'view_mode_per_role_settings', ); $form['view_mode_per_role']['add_more'] = array( '#type' => 'submit', '#name' => 'view_mode_per_role_settings_add_more', '#value' => t('Add another item'), '#attributes' => array('class' => array('field-add-more-submit')), '#submit' => array('field_add_more_submit'), ); $form['view_mode_per_role']['help'] = array( '#markup' => '
' . t('This table will allow you to choose which view mode will replace the "@full" for the corresponding roles when viewing a node of this type.', array('@full' => t('Full content'))) . '
' . t('For a line to be valid, you have to select the role and the view mode.') . '
', ); $order = 0; foreach ($settings as $setting) { $form['view_mode_per_role']['vmpr_settings'][$order] = array(); $form['view_mode_per_role']['vmpr_settings'][$order]['#weight'] = $order; $form['view_mode_per_role']['vmpr_settings'][$order]['weight'] = array( '#type' => 'textfield', '#title' => t('Weight for @title', array('@title' => !empty($setting['role']) ? $roles[$setting['role']] : '')), '#title_display' => 'invisible', '#size' => 4, '#default_value' => $order, '#attributes' => array('class' => array('setting-weight')), ); $form['view_mode_per_role']['vmpr_settings'][$order]['role'] = array( '#type' => 'select', '#title' => t('Role'), '#options' => $roles, '#default_value' => $setting['role'], ); $form['view_mode_per_role']['vmpr_settings'][$order]['view_mode'] = array( '#type' => 'select', '#title' => t('View mode'), '#options' => $views_modes, '#default_value' => $setting['view_mode'], ); $form['view_mode_per_role']['vmpr_settings'][$order]['deleted'] = array( '#type' => 'hidden', '#default_value' => 0, '#attributes' => array('class' => array('setting-deleted')), ); $form['view_mode_per_role']['vmpr_settings'][$order]['delete'] = array( '#type' => 'submit', '#name' => 'view_mode_per_role_settings_delete_line', '#value' => t('Delete'), '#attributes' => array('class' => array('field-delete-submit')), '#submit' => array('field_delete_submit'), ); $order++; } // Add custom submit function array_unshift($form['#submit'], 'view_mode_per_role_form_node_type_form_submit'); } } /** * Node type form custom submit. */ function view_mode_per_role_form_node_type_form_submit($form, &$form_state) { $values = $form_state['values']; // Delete old settings variable_del('view_mode_per_role_' . $values['old_type']); // Save new settings $settings = array(); foreach ($values['vmpr_settings'] as $data) { if ($data['deleted'] == 0 && $data['role'] != '_none' && $data['view_mode'] != '_none') { $settings[] = array('role' => $data['role'], 'view_mode' => $data['view_mode']); } } variable_set('view_mode_per_role_' . $values['type'], $settings); // Remove settings to avoid core function to process it unset($form_state['values']['vmpr_settings']); } /** * Returns HTML for the role order and new role form. * * @param $variables * An associative array containing: * - form: A render element representing the form. * * @ingroup themeable */ function theme_view_mode_per_role_settings($variables) { $form = $variables['form']; $header = array(t('Roles'), t('Weight'), t('View modes'), t('Operations')); $rows = array(); foreach (element_children($form) as $order) { $row = array(); $row[] = drupal_render($form[$order]['role']); $row[] = drupal_render($form[$order]['weight']); $row[] = drupal_render($form[$order]['view_mode']); $row[] = drupal_render($form[$order]['delete']) . drupal_render($form[$order]['deleted']); $rows[] = array('data' => $row, 'class' => array('draggable'), 'id' => 'setting-' . $order); } drupal_add_tabledrag('view-mode-per-role-settings', 'order', 'sibling', 'setting-weight'); $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'view-mode-per-role-settings'))); $output .= drupal_render_children($form); return $output; }