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