field_weight.module in Field display weights (per node) 7
Same filename and directory in other branches
Field display weight module.
Allows site administrators to modify the order that fields are displayed on a per node basis.
File
field_weight.moduleView source
<?php
/**
* @file
* Field display weight module.
*
* Allows site administrators to modify the order that fields
* are displayed on a per node basis.
*/
/**
* Implements hook_permission().
*/
function field_weight_permission() {
return array(
'administer field weight settings' => array(
'title' => t("Administer field weight settings"),
),
'administer field weights' => array(
'title' => t("Administer field weights"),
'description' => t("Administer field weights on nodes using the \\'Manage display weights\\' tab."),
),
);
}
/**
* Implements hook_menu().
*/
function field_weight_menu() {
$items['admin/config/field_weight'] = array(
'title' => "Field display weights",
'description' => "Settings for Field display weights.",
'page callback' => 'drupal_get_form',
'page arguments' => array(
'field_weight_settings_form',
),
'access arguments' => array(
'administer field weight settings',
),
'file' => 'field_weight.admin.inc',
);
$items['node/%node/field_weight'] = array(
'title' => "Field display weights",
'description' => "Manage field display weights for this node.",
'page callback' => 'drupal_get_form',
'page arguments' => array(
'field_weight_display_overview_form',
1,
),
'access callback' => '_field_weight_node_type_check',
'access arguments' => array(
1,
),
'type' => MENU_LOCAL_TASK,
);
return $items;
}
/**
* Implements hook_admin_paths().
*/
function field_weight_admin_paths() {
return array(
'node/*/field_weight' => TRUE,
);
}
/**
* Admin form displayed at node/%/display.
*/
function field_weight_display_overview_form($form, &$form_state, $node) {
$form = array();
$form_state['#node'] = $node;
// Tree set to get weights in nested array under field keys in form state.
$form['#tree'] = TRUE;
// Get all field instances for this bundle type
$instances = field_info_instances('node', $node->type);
$weights = _field_weight_get_node_weight($node->nid);
// Create new array of instances
$weight_instances = array();
// $weights will only be present if field weights have been saved
// for that node.
if ($weights) {
foreach (array_keys($instances) as $key) {
// Default to 0 if weight not found. i.e field added
// after weights have last been saved.
$weight_instances[$key] = array_key_exists($key, $weights) ? $weights[$key] : array(
'weight' => 0,
'hidden' => 0,
);
}
}
else {
// If no weight entry found in db, use default field order from bundle.
$weight_instances = $instances;
drupal_set_message(t("Field weights for this node have not been overridden yet."), 'warning');
}
uasort($weight_instances, 'drupal_sort_weight');
$form['field_weight'] = array(
'#type' => 'fieldset',
'#title' => t("Manage %node_type field display", array(
'%node_type' => $node->type,
)),
// Put table/tabledrag theming of form into theme template.
'#theme' => 'field_weight_display_overview',
);
$form['field_weight']['markup'] = array(
'#markup' => '<p>' . t("Use the below table to arrange the order that fields will be displayed when this node is viewed. Saving your changes will override the default \n field display order set in admin/structure/types/[node-type]/display. If you change one value, all of the weights will change accordingly. To return to the default display order, use the reset button.") . '</p>',
);
// Create sensible weights based on amount of fields.
// Copied from block.admin.inc.
$weight_delta = round(count($instances) / 2);
// Pass hidden value to form submit so we can use instances
// already stored there.
$form['field_weight']['instances'] = array(
'#type' => 'value',
'#value' => $weight_instances,
);
// Include so we can use field_ui_formatter_options().
module_load_include('inc', 'field_ui', 'field_ui.admin');
foreach ($weight_instances as $field => $values) {
$field_info = field_info_field($field);
$formatter_options = field_ui_formatter_options($field_info['type']);
$form['field_weight'][$field]['field'] = array(
'#markup' => check_plain($instances[$field]['label']),
);
$form['field_weight'][$field]['weight'] = array(
'#type' => 'weight',
'#delta' => $weight_delta,
'#default_value' => isset($values['weight']) ? $values['weight'] : 0,
'#attributes' => array(
'class' => array(
'field-weight',
),
),
);
$form['field_weight'][$field]['hidden'] = array(
'#type' => 'checkbox',
'#default_value' => isset($values['hidden']) ? $values['hidden'] : 0,
);
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t("Save"),
);
$form['reset'] = array(
'#type' => 'submit',
'#value' => t("Reset"),
'#submit' => array(
'_field_weight_remove_weights',
),
);
return $form;
}
function field_weight_display_overview_form_submit($form, &$form_state) {
$node = $form_state['#node'];
$values = $form_state['values']['field_weight'];
$form_state['redirect'] = 'node/' . $node->nid;
$instances = field_info_instances('node', $node->type);
$weights = array();
foreach ($instances as $field => $instance) {
$weights[$field] = array(
'weight' => $values[$field]['weight'],
'hidden' => $values[$field]['hidden'],
);
}
// If all weights are 0 (unchanged) will return empty.
$empty_check = array_filter($weights);
if (!empty($empty_check)) {
db_merge('field_weight')
->key(array(
'nid' => $node->nid,
))
->fields(array(
'nid' => $node->nid,
'type' => $node->type,
'field_weights' => serialize($weights),
))
->execute();
}
elseif (empty($empty_check)) {
// Remove entry if user manually sets all weights to 0.
_field_weight_remove_weights($form, $form_state);
}
}
/**
* Implements hook_node_delete().
*
* Clean up field_weight table so we don't get any orphaned entries.
*
*/
function field_weight_node_delete($node) {
db_delete('field_weight')
->condition('nid', $node->nid)
->execute();
}
/**
* Implements hook_entity_view_alter().
*/
function field_weight_entity_view_alter(&$build, $type) {
if ($type == 'node') {
// May be replaced with option variables, if this expands to all entities.
$enabled_node_types = variable_get('field_weight_node_types', array());
// Check if the bundle type is enabled.
if (in_array($build['#bundle'], $enabled_node_types, TRUE)) {
// See if any field weights have been set.
$node_weights = _field_weight_get_node_weight($build['#node']->nid);
if ($node_weights) {
// Amend weights for entity fields,
// if there is a db entry the weights will be changed for all fields stored.
foreach ($node_weights as $key => $values) {
$build[$key]['#weight'] = $values['weight'];
if ($values['hidden'] == TRUE) {
// If field has been hidden set this to FALSE, therefore won't be displayed.
$build[$key]['#access'] = FALSE;
}
}
}
}
}
}
/**
* Helper function to check if current node type is enabled in settings.
*/
function _field_weight_node_type_check($node) {
$enabled_node_types = variable_get('field_weight_node_types', array());
if (in_array($node->type, $enabled_node_types, TRUE) && _field_weight_access()) {
return TRUE;
}
else {
return FALSE;
}
}
/**
* Access check for both field_weight permissions.
*/
function _field_weight_access() {
if (user_access('administer field weights') || user_access('administer field weight settings')) {
return TRUE;
}
else {
return FALSE;
}
}
/**
* Helper function to get weights from field_weight table for nids passed in.
*/
function _field_weight_get_node_weight($nid) {
$result = db_select('field_weight', 'fw')
->fields('fw', array(
'field_weights',
))
->condition('nid', $nid)
->execute()
->fetchField();
return unserialize($result);
}
/**
* Helper function to remove entry from field_weight table for current node.
*/
function _field_weight_remove_weights($form, $form_state) {
$node = $form_state['#node'];
db_delete('field_weight')
->condition('nid', $node->nid)
->execute();
}
/**
* Implements hook_theme().
*/
function field_weight_theme() {
return array(
'field_weight_display_overview' => array(
'render element' => 'form',
'template' => 'field_weight_display_overview',
),
);
}
/**
* Implements hook_preprocess_hook().
*/
function field_weight_preprocess_field_weight_display_overview(&$variables) {
$variables['instances'] = $variables['form']['instances']['#value'];
}
Functions
Name![]() |
Description |
---|---|
field_weight_admin_paths | Implements hook_admin_paths(). |
field_weight_display_overview_form | Admin form displayed at node/%/display. |
field_weight_display_overview_form_submit | |
field_weight_entity_view_alter | Implements hook_entity_view_alter(). |
field_weight_menu | Implements hook_menu(). |
field_weight_node_delete | Implements hook_node_delete(). |
field_weight_permission | Implements hook_permission(). |
field_weight_preprocess_field_weight_display_overview | Implements hook_preprocess_hook(). |
field_weight_theme | Implements hook_theme(). |
_field_weight_access | Access check for both field_weight permissions. |
_field_weight_get_node_weight | Helper function to get weights from field_weight table for nids passed in. |
_field_weight_node_type_check | Helper function to check if current node type is enabled in settings. |
_field_weight_remove_weights | Helper function to remove entry from field_weight table for current node. |