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