$status) {
$rows[] = array(
array(
'data' => isset($modules[$dependency]->info['name']) ? $modules[$dependency]->info['name'] : $dependency,
'class' => 'component'
),
theme('features_module_status', array('status' => $status)),
);
}
$vars['dependencies'] = theme('table', array('header' => array(t('Dependency'), t('Status')), 'rows' => $rows));
// Components
$rows = array();
$components = features_get_components();
// Display key for conflicting elements.
if (!empty($form['#conflicts'])) {
$vars['key'][] = array(
'title' => theme('features_storage_link', array('storage' => FEATURES_CONFLICT, 'text' => t('Conflicts with another feature'))),
'html' => TRUE,
);
}
if (!empty($form['#info']['features'])) {
foreach ($form['#info']['features'] as $component => $items) {
if (!empty($items)) {
$conflicts = array_key_exists($component, $form['#conflicts'])
? $form['#conflicts'][$component]
: NULL;
$header = $data = array();
if (element_children($form['revert'])) {
$header[] = array(
'data' => isset($form['revert'][$component]) ? drupal_render($form['revert'][$component]) : '',
'header' => TRUE
);
}
$header[] = array(
'data' => isset($components[$component]['name']) ? $components[$component]['name'] : $component,
'header' => TRUE
);
$header[] = array(
'data' => drupal_render($form['components'][$component]),
'header' => TRUE
);
$rows[] = $header;
if (element_children($form['revert'])) {
$data[] = '';
}
$data[] = array(
'data' => theme('features_component_list', array('components' => $items, 'source' => $items, 'conflicts' => $conflicts)),
'colspan' => 2,
'class' => 'component'
);
$rows[] = $data;
}
}
}
$vars['components'] = theme('table', array('header' => array(), 'rows' => $rows));
// Other elements
$vars['buttons'] = drupal_render($form['buttons']);
$vars['form'] = $form;
}
/**
* Themes a module status display.
*/
function theme_features_module_status($vars) {
switch ($vars['status']) {
case FEATURES_MODULE_ENABLED:
$text_status = t('Enabled');
$class = 'admin-enabled';
break;
case FEATURES_MODULE_DISABLED:
$text_status = t('Disabled');
$class = 'admin-disabled';
break;
case FEATURES_MODULE_MISSING:
$text_status = t('Missing');
$class = 'admin-missing';
break;
case FEATURES_MODULE_CONFLICT:
$text_status = t('Enabled');
$class = 'admin-conflict';
break;
}
$text = !empty($vars['module']) ? $vars['module'] . ' (' . $text_status . ')' : $text_status;
return "$text";
}
/**
* Themes a module status display.
*/
function theme_features_storage_link($vars) {
$classes = array(
FEATURES_OVERRIDDEN => 'admin-overridden',
FEATURES_DEFAULT => 'admin-default',
FEATURES_NEEDS_REVIEW => 'admin-needs-review',
FEATURES_REBUILDING => 'admin-rebuilding',
FEATURES_REBUILDABLE => 'admin-rebuilding',
FEATURES_CONFLICT => 'admin-conflict',
FEATURES_DISABLED => 'admin-disabled',
FEATURES_CHECKING => 'admin-loading',
);
$default_text = array(
FEATURES_OVERRIDDEN => t('Overridden'),
FEATURES_DEFAULT => t('Default'),
FEATURES_NEEDS_REVIEW => t('Needs review'),
FEATURES_REBUILDING => t('Rebuilding'),
FEATURES_REBUILDABLE => t('Rebuilding'),
FEATURES_CONFLICT => t('Conflict'),
FEATURES_DISABLED => t('Disabled'),
FEATURES_CHECKING => t('Checking...'),
);
$text = isset($vars['text']) ? $vars['text'] : $default_text[$vars['storage']];
if ($vars['path']) {
$vars['options']['attributes']['class'][] = $classes[$vars['storage']];
$vars['options']['attributes']['class'][] = 'features-storage';
return l($text, $vars['path'], $vars['options']);
}
else {
return "{$text}";
}
}
/**
* Theme function for displaying form buttons
*/
function theme_features_form_buttons(&$vars) {
drupal_add_css(drupal_get_path('module', 'features') . '/features.css');
$output = drupal_render_children($vars['element']);
return !empty($output) ? "
{$output}
" : '';
}
/**
* Theme for features management form.
*/
function theme_features_form_package(&$vars) {
drupal_add_css(drupal_get_path('module', 'features') . '/features.css');
drupal_add_js(drupal_get_path('module', 'features') . '/features.js');
$output = '';
$header = array('', t('Feature'), t('Signature'));
if (isset($vars['form']['state'])) {
$header[] = t('State');
}
if (isset($vars['form']['actions'])) {
$header[] = t('Actions');
}
$rows = array();
foreach (element_children($vars['form']['status']) as $element) {
// Yank title & description fields off the form element for
// rendering in their own cells.
$name = "";
$name .= "
{$vars['form']['status'][$element]['#title']}";
$name .= "
{$vars['form']['status'][$element]['#description']}
";
$name .= "
";
unset($vars['form']['status'][$element]['#title']);
unset($vars['form']['status'][$element]['#description']);
// Determine row & cell classes
$class = $vars['form']['status'][$element]['#default_value'] ? 'enabled' : 'disabled';
$row = array();
$row['status'] = array('data' => drupal_render($vars['form']['status'][$element]), 'class' => array('status'));
$row['name'] = array('data' => $name, 'class' => 'name');
$row['sign'] = array('data' => drupal_render($vars['form']['sign'][$element]), 'class' => array('sign'));
if (isset($vars['form']['state'])) {
$row['state'] = array('data' => drupal_render($vars['form']['state'][$element]), 'class' => array('state'));
}
if (isset($vars['form']['actions'])) {
$row['actions'] = array('data' => drupal_render($vars['form']['actions'][$element]), 'class' => array('actions'));
}
$rows[] = array('data' => $row, 'class' => array($class));
}
if (empty($rows)) {
$rows[] = array('', array('data' => t('No features available.'), 'colspan' => count($header)));
}
$class = count($header) > 3 ? 'features features-admin' : 'features features-manage';
$output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'features-form-table', 'class' => array($class))));
// Prevent section from being rendered by drupal_render().
$output .= drupal_render($vars['form']['buttons']);
$output .= drupal_render_children($vars['form']);
return $output;
}
/**
* Theme functions ====================================================
*/
/**
* Export selection / display for features export form.
*/
function theme_features_form_export(&$vars) {
drupal_add_css(drupal_get_path('module', 'features') . '/features.css');
drupal_add_js(drupal_get_path('module', 'features') . '/features.js');
$output = '';
$output .= "";
$output .= "
" . drupal_render($vars['form']['components']) . drupal_render($vars['form']['sources']) . "
";
$output .= "
" . drupal_render($vars['form']['preview']) . drupal_render($vars['form']['features']) . "
";
$output .= "
";
$output .= drupal_render_children($vars['form']);
return $output;
}
/**
* Theme a set of features export components.
*/
function theme_features_form_components(&$vars) {
$output = '';
foreach (element_children($vars['form']) as $key) {
unset($vars['form'][$key]['#title']);
$output .= "" . drupal_render($vars['form'][$key]) . "
";
}
$output .= drupal_render_children($vars['form']);
return $output;
}
/**
* Theme a set of features export components.
*/
function theme_features_components($vars) {
$info = $vars['info'];
$sources = $vars['sources'];
$output = '';
$rows = array();
$components = features_get_components();
if (!empty($info['features']) || !empty($info['dependencies']) || !empty($sources)) {
$export = array_unique(array_merge(
array_keys($info['features']),
array_keys($sources),
array('dependencies')
));
foreach ($export as $component) {
if ($component === 'dependencies') {
$feature_items = isset($info[$component]) ? $info[$component] : array();
}
else {
$feature_items = isset($info['features'][$component]) ? $info['features'][$component] : array();
}
$source_items = isset($sources[$component]) ? $sources[$component] : array();
if (!empty($feature_items) || !empty($source_items)) {
$rows[] = array(array(
'data' => isset($components[$component]['name']) ? $components[$component]['name'] : $component,
'header' => TRUE
));
$rows[] = array(array(
'data' => theme('features_component_list', array('components' => $feature_items, 'source' => $source_items)),
'class' => 'component'
));
}
}
$output .= theme('table', array('header' => array(), 'rows' => $rows));
$output .= theme('features_component_key', array());
}
return $output;
}
/**
* Theme individual components in a component list.
*/
function theme_features_component_list($vars) {
$components = $vars['components'];
$source = $vars['source'];
$conflicts = $vars['conflicts'];
$list = array();
foreach ($components as $component) {
// If component is not in source list, it was autodetected
if (!in_array($component, $source)) {
$list[] = "". check_plain($component) ."";
}
elseif (is_array($conflicts) && in_array($component, $conflicts)) {
$list[] = "". check_plain($component) ."";
}
else {
$list[] = "". check_plain($component) ."";
}
}
foreach ($source as $component) {
// If a source component is no longer in the items, it was removed because
// it is provided by a dependency.
if (!in_array($component, $components)) {
$list[] = "". check_plain($component) ."";
}
}
return "". implode(' ', $list) ."";
}
/**
* Provide a themed key for a component list.
*/
function theme_features_component_key($vars) {
$list = array();
$list[] = "" . t('Normal') . "";
$list[] = "" . t('Auto-detected') . "";
$list[] = "" . t('Provided by dependency') . "";
return "" . implode(' ', $list) . "";
}