function page_manager_render_operations
Render an operations array.
This renders an array of operations into a series of nested UL statements, with ajax automatically on unless specified otherwise. Operations will automatically have the URLs generated nested.
Each operation should have a 'type', which tells the renderer how to deal with it:
- 'operation': An AJAX link to render. This is the default and is assumed if a type is not specified. Other fields for the operation:
- - 'title': The text to display. Can be an image. Must be pre-sanitized.
- - 'description': Text to place in the hover box over the link using the title attribute.
- - 'arguments': Anything optional to put at the end of the URL.
- - 'path': If set, overrides the default path.
- - 'no operations': If set, the path will not have operations appended.
- - 'no task': If set, the path will not have the task id.
- - 'no link': If set, this item will just be text, not a link.
- - 'ajax': If set to TRUE, ajax will be used. The default is TRUE.
- - 'class': An optional class to specify for the link.
- - 'form': The form to display for this operation, if using a single form.
- - 'forms': An array of forms that must be paired with 'order' of this operation uses multiple forms. See wizard tool for details.
- - 'order': The form order to use for multiple forms. See wizard tool for details.
- - 'form info': Form info overrides for the wizard. See the wizard tool for available settings
- 'group':
- - 'title': The title of the link. May be HTML.
- - 'title class': A class to apply to the title.
- - 'children': An array of more operations that this group represents. All operations within this group will have this group's ID as part of the AJAX url to make it easier to find.
- - 'class': A class to apply to the UL of the children.
- - 'collapsible': If TRUE the collapsible tool will be used.
3 calls to page_manager_render_operations()
- page_manager_edit_page in page_manager/
page_manager.admin.inc - Render the edit page for a a page, custom or system.
- page_manager_edit_page_operation in page_manager/
page_manager.admin.inc - Entry point to edit a single operation for a page.
- page_manager_http_response_admin_summary in page_manager/
plugins/ task_handlers/ http_response.inc
File
-
page_manager/
page_manager.admin.inc, line 1105
Code
function page_manager_render_operations(&$page, $operations, $active_trail, $attributes, $location, $parents = array()) {
drupal_add_library('system', 'drupal.ajax');
if (!isset($output[$location])) {
$output[$location] = '';
}
$keys = array_keys($operations);
$first = array_shift($keys);
$last = array_pop($keys);
// Make sure the 'first' and 'last' operations are part of THIS nav tree:
while ($keys && isset($operations[$first]['location']) && $operations[$first]['location'] != $location) {
$first = array_shift($keys);
}
while ($keys && isset($operations[$last]['location']) && $operations[$last]['location'] != $location) {
$last = array_pop($keys);
}
$active = reset($active_trail);
foreach ($operations as $id => $operation) {
$current_path = '';
if ($parents) {
$current_path .= implode('/', $parents) . '/';
}
$current_path .= $id;
if (empty($operation['type'])) {
$operation['type'] = 'operation';
}
// We only render an li for things in the same nav tree.
if (empty($operation['location']) || $operation['location'] == $location) {
if (!is_array($attributes['class'])) {
$attributes['class'] = array(
$attributes['class'],
);
}
$class = empty($attributes['class']) || !is_array($attributes['class']) ? array() : $attributes['class'];
if ($id == $first) {
$class[] = 'operation-first';
}
elseif ($id == $last) {
$class[] = 'operation-last';
}
if (empty($operation['silent']) && !empty($page->changes[$current_path])) {
$class[] = $operation['type'] == 'group' ? 'changed-group' : 'changed';
}
else {
$class[] = 'not-changed';
}
if ($active == $id) {
$class[] = $operation['type'] == 'group' ? 'active-group' : 'active';
}
else {
$class[] = 'not-active';
}
$output[$location] .= '<li class="' . implode(' ', $class) . '">';
}
switch ($operation['type']) {
case 'text':
$output[$location] .= $operation['title'];
break;
case 'operation':
$path = isset($operation['path']) ? $operation['path'] : 'admin/structure/pages/nojs/operation';
if (!isset($operation['no task'])) {
$path .= '/' . $page->task_name;
}
if (!isset($operation['no operations'])) {
$path .= '/' . $current_path;
if (isset($operation['arguments'])) {
$path .= '/' . $arguments;
}
}
$class = array(
'page-manager-operation',
);
if (!isset($operation['ajax']) || !empty($operation['ajax'])) {
$class[] = 'use-ajax';
}
if (!empty($operation['class'])) {
$class[] = $operation['class'];
}
$description = isset($operation['description']) ? $operation['description'] : '';
if (empty($operation['silent']) && !empty($page->changes[$current_path])) {
$description .= ' ' . t('This setting contains unsaved changes.');
}
$output[$location] .= l($operation['title'], $path, array(
'attributes' => array(
'id' => 'page-manager-operation-' . $id,
'class' => $class,
'title' => $description,
),
'html' => TRUE,
));
break;
case 'group':
if ($active == $id) {
$trail = $active_trail;
array_shift($trail);
}
else {
$trail = array();
}
$group_location = isset($operation['location']) ? $operation['location'] : $location;
$temp = page_manager_render_operations($page, $operation['children'], $trail, $operation, $group_location, array_merge($parents, array(
$id,
)));
if ($temp) {
foreach ($temp as $id => $text) {
if (empty($output[$id])) {
$output[$id] = '';
}
$output[$id] .= $text;
}
}
break;
}
if (empty($operation['location']) || $operation['location'] == $location) {
$output[$location] .= '</li>';
}
}
if ($output[$location]) {
$classes = isset($attributes['class']) && is_array($attributes['class']) ? $attributes['class'] : array();
$classes[] = 'page-manager-operations';
$output[$location] = '<ul class="' . implode(' ', $classes) . '">' . $output[$location] . '</ul>';
if (!empty($attributes['title'])) {
$class = '';
if (isset($attributes['title class'])) {
$class = $attributes['title class'];
}
$title = '<div class="page-manager-group-title' . $class . '">' . $attributes['title'] . '</div>';
if (!empty($attributes['collapsible'])) {
$output[$location] = theme('ctools_collapsible', array(
'handle' => $title,
'content' => $output[$location],
'collapsed' => empty($active_trail),
));
}
else {
$output[$location] = $title . $output[$location];
}
}
return $output;
}
}