function theme_language_hierarchy_form in Language Hierarchy 7
Theme callback for the language hierarchy form.
The theme callback will format the $form data structure into a table and add our tabledrag functionality. (Note that drupal_add_tabledrag should be called from the theme layer, and not from a form declaration. This helps keep template files clean and readable, and prevents tabledrag.js from being added twice accidently.
File
- ./
language_hierarchy_form.inc, line 158
Code
function theme_language_hierarchy_form($variables) {
$form = $variables['form'];
// Initialize the variable which will store our table rows.
$rows = array();
// Iterate over each element in our $form['language_items'] array.
foreach (element_children($form['language_items']) as $id) {
// Before we add our 'weight' column to the row, we need to give the
// element a custom class so that it can be identified in the
// drupal_add_tabledrag call.
//
// This could also have been done during the form declaration by adding
// @code
// '#attributes' => array('class' => 'language-item-weight'),
// @endcode
// directly to the 'weight' element in tabledrag_example_simple_form().
$form['language_items'][$id]['weight']['#attributes']['class'] = array(
'language-item-weight',
);
// In the parent/child example, we must also set this same custom class on
// our id and parent_id columns (which could also have been done within
// the form declaration, as above).
$form['language_items'][$id]['id']['#attributes']['class'] = array(
'language-item-id',
);
$form['language_items'][$id]['pid']['#attributes']['class'] = array(
'language-item-pid',
);
// To support the tabledrag behaviour, we need to assign each row of the
// table a class attribute of 'draggable'. This will add the 'draggable'
// class to the <tr> element for that row when the final table is
// rendered.
$class = array(
'draggable',
);
// If this is a child element, we need to add some indentation to the row,
// so that it appears nested under its parent. Our $depth parameter was
// calculated while building the language data.
$indent = theme('indentation', array(
'size' => $form['language_items'][$id]['depth']['#value'],
));
unset($form['language_items'][$id]['depth']);
// Disable checkbox for the default language, because it cannot be disabled.
if ($id == language_default()->language) {
$form['enabled'][$id]['#attributes']['disabled'] = 'disabled';
}
// We are now ready to add each element of our $form data to the $rows
// array, so that they end up as individual table cells when rendered
// in the final table. We run each element through the drupal_render()
// function to generate the final html markup for that element.
// Create operations links.
$operations_links = l(t('edit'), 'admin/config/regional/language/edit/' . $id) . ($id != 'en' && $id != language_default()->language ? ' ' . l(t('delete'), 'admin/config/regional/language/delete/' . $id) : '');
// Add our hidden 'id' column into the operations links column.
$operations_links .= drupal_render($form['language_items'][$id]['id']);
$rows[] = array(
'data' => array(
// Add our 'name' column, being sure to include our indentation.
$indent . drupal_render($form['language_items'][$id]['name']),
// Add our 'native' column.
drupal_render($form['language_items'][$id]['native']),
// Add 'code' column.
drupal_render($form['language_items'][$id]['code']),
// Add 'direction' column.
drupal_render($form['language_items'][$id]['direction']),
// Add 'enabled' checkboxes.
array(
'data' => drupal_render($form['enabled'][$id]),
'align' => 'center',
),
// Add our 'site_default' column.
drupal_render($form['site_default'][$id]),
// Add operations links column with hidden IDs form elements.
$operations_links,
// Add our 'weight' column.
drupal_render($form['language_items'][$id]['weight']),
// Add our hidden 'parent id' column.
drupal_render($form['language_items'][$id]['pid']),
),
// To support the tabledrag behaviour, we need to assign each row of the
// table a class attribute of 'draggable'. This will add the 'draggable'
// class to the <tr> element for that row when the final table is
// rendered.
'class' => $class,
);
}
// We now define the table header values. Ensure that the 'header' count
// matches the final column count for your table.
//
// Normally, we would hide the headers on our hidden columns, but we are
// leaving them visible in this example.
// $header = array(t('Name'), t('Description'), '', '', '');
$header = array(
t('Name'),
t('Native name'),
t('Code'),
t('Direction'),
t('Enabled'),
t('Default'),
t('Operations'),
t('Weight'),
t('PID'),
);
// We also need to pass the drupal_add_tabledrag() function an id which will
// be used to identify the <table> element containing our tabledrag form.
// Because an element's 'id' should be unique on a page, make sure the value
// you select is NOT the same as the form ID used in your form declaration.
$table_id = 'language-items-table';
// We can render our tabledrag table for output.
$output = theme('table', array(
'header' => $header,
'rows' => $rows,
'attributes' => array(
'id' => $table_id,
),
));
// And then render any remaining form elements (such as our submit button).
$output .= drupal_render_children($form);
// We now call the drupal_add_tabledrag() function in order to add the
// tabledrag.js goodness onto our page.
//
// For our parent/child tree table, we need to pass it:
// - the $table_id of our <table> element (language-items-table),
// - the $action to be performed on our form items ('match'),
// - a string describing where $action should be applied ('parent'),
// - the $group value (pid column) class name ('language-item-pid'),
// - the $subgroup value (pid column) class name ('language-item-pid'),
// - the $source value (id column) class name ('language-item-id'),
// - an optional $hidden flag identifying if the columns should be hidden,
// - an optional $limit parameter to control the max parenting depth.
drupal_add_tabledrag($table_id, 'match', 'parent', 'language-item-pid', 'language-item-pid', 'language-item-id', TRUE);
// Because we also want to sort in addition to providing parenting, we call
// the drupal_add_tabledrag function again, instructing it to update the
// weight field as items at the same level are re-ordered.
drupal_add_tabledrag($table_id, 'order', 'sibling', 'language-item-weight', NULL, NULL, TRUE);
return $output;
}