Chris@76: $_REQUEST[$request_var_sort], Chris@76: 'desc' => isset($_REQUEST[$request_var_desc]) && isset($listOptions['columns'][$_REQUEST[$request_var_sort]]['sort']['reverse']), Chris@76: ); Chris@76: else Chris@76: $list_context['sort'] = array( Chris@76: 'id' => $listOptions['default_sort_col'], Chris@76: 'desc' => (!empty($listOptions['default_sort_dir']) && $listOptions['default_sort_dir'] == 'desc') || (!empty($listOptions['columns'][$listOptions['default_sort_col']]['sort']['default']) && substr($listOptions['columns'][$listOptions['default_sort_col']]['sort']['default'], -4, 4) == 'desc') ? true : false, Chris@76: ); Chris@76: Chris@76: // Set the database column sort. Chris@76: $sort = $listOptions['columns'][$list_context['sort']['id']]['sort'][$list_context['sort']['desc'] ? 'reverse' : 'default']; Chris@76: } Chris@76: Chris@76: $list_context['start_var_name'] = isset($listOptions['start_var_name']) ? $listOptions['start_var_name'] : 'start'; Chris@76: // In some cases the full list must be shown, regardless of the amount of items. Chris@76: if (empty($listOptions['items_per_page'])) Chris@76: { Chris@76: $list_context['start'] = 0; Chris@76: $list_context['items_per_page'] = 0; Chris@76: } Chris@76: // With items per page set, calculate total number of items and page index. Chris@76: else Chris@76: { Chris@76: // First get an impression of how many items to expect. Chris@76: if (isset($listOptions['get_count']['file'])) Chris@76: require_once($listOptions['get_count']['file']); Chris@76: $list_context['total_num_items'] = call_user_func_array($listOptions['get_count']['function'], empty($listOptions['get_count']['params']) ? array() : $listOptions['get_count']['params']); Chris@76: Chris@76: // Default the start to the beginning...sounds logical. Chris@76: $list_context['start'] = isset($_REQUEST[$list_context['start_var_name']]) ? (int) $_REQUEST[$list_context['start_var_name']] : 0; Chris@76: $list_context['items_per_page'] = $listOptions['items_per_page']; Chris@76: Chris@76: // Then create a page index. Chris@76: $list_context['page_index'] = constructPageIndex($listOptions['base_href'] . (empty($list_context['sort']) ? '' : ';' . $request_var_sort . '=' . $list_context['sort']['id'] . ($list_context['sort']['desc'] ? ';' . $request_var_desc : '')) . ($list_context['start_var_name'] != 'start' ? ';' . $list_context['start_var_name'] . '=%1$d' : ''), $list_context['start'], $list_context['total_num_items'], $list_context['items_per_page'], $list_context['start_var_name'] != 'start'); Chris@76: } Chris@76: Chris@76: // Prepare the headers of the table. Chris@76: $list_context['headers'] = array(); Chris@76: foreach ($listOptions['columns'] as $column_id => $column) Chris@76: $list_context['headers'][] = array( Chris@76: 'id' => $column_id, Chris@76: 'label' => isset($column['header']['eval']) ? eval($column['header']['eval']) : (isset($column['header']['value']) ? $column['header']['value'] : ''), Chris@76: 'href' => empty($listOptions['default_sort_col']) || empty($column['sort']) ? '' : $listOptions['base_href'] . ';' . $request_var_sort . '=' . $column_id . ($column_id === $list_context['sort']['id'] && !$list_context['sort']['desc'] && isset($column['sort']['reverse']) ? ';' . $request_var_desc : '') . (empty($list_context['start']) ? '' : ';' . $list_context['start_var_name'] . '=' . $list_context['start']), Chris@76: 'sort_image' => empty($listOptions['default_sort_col']) || empty($column['sort']) || $column_id !== $list_context['sort']['id'] ? null : ($list_context['sort']['desc'] ? 'down' : 'up'), Chris@76: 'class' => isset($column['header']['class']) ? $column['header']['class'] : '', Chris@76: 'style' => isset($column['header']['style']) ? $column['header']['style'] : '', Chris@76: 'colspan' => isset($column['header']['colspan']) ? $column['header']['colspan'] : '', Chris@76: ); Chris@76: Chris@76: // We know the amount of columns, might be useful for the template. Chris@76: $list_context['num_columns'] = count($listOptions['columns']); Chris@76: $list_context['width'] = isset($listOptions['width']) ? $listOptions['width'] : '0'; Chris@76: Chris@76: // Get the file with the function for the item list. Chris@76: if (isset($listOptions['get_items']['file'])) Chris@76: require_once($listOptions['get_items']['file']); Chris@76: Chris@76: // Call the function and include which items we want and in what order. Chris@76: $list_items = call_user_func_array($listOptions['get_items']['function'], array_merge(array($list_context['start'], $list_context['items_per_page'], $sort), empty($listOptions['get_items']['params']) ? array() : $listOptions['get_items']['params'])); Chris@76: Chris@76: // Loop through the list items to be shown and construct the data values. Chris@76: $list_context['rows'] = array(); Chris@76: foreach ($list_items as $item_id => $list_item) Chris@76: { Chris@76: $cur_row = array(); Chris@76: foreach ($listOptions['columns'] as $column_id => $column) Chris@76: { Chris@76: $cur_data = array(); Chris@76: Chris@76: // A value straight from the database? Chris@76: if (isset($column['data']['db'])) Chris@76: $cur_data['value'] = $list_item[$column['data']['db']]; Chris@76: Chris@76: // Take the value from the database and make it HTML safe. Chris@76: elseif (isset($column['data']['db_htmlsafe'])) Chris@76: $cur_data['value'] = htmlspecialchars($list_item[$column['data']['db_htmlsafe']]); Chris@76: Chris@76: // Using sprintf is probably the most readable way of injecting data. Chris@76: elseif (isset($column['data']['sprintf'])) Chris@76: { Chris@76: $params = array(); Chris@76: foreach ($column['data']['sprintf']['params'] as $sprintf_param => $htmlsafe) Chris@76: $params[] = $htmlsafe ? htmlspecialchars($list_item[$sprintf_param]) : $list_item[$sprintf_param]; Chris@76: $cur_data['value'] = vsprintf($column['data']['sprintf']['format'], $params); Chris@76: } Chris@76: Chris@76: // The most flexible way probably is applying a custom function. Chris@76: elseif (isset($column['data']['function'])) Chris@76: $cur_data['value'] = $column['data']['function']($list_item); Chris@76: Chris@76: // A modified value (inject the database values). Chris@76: elseif (isset($column['data']['eval'])) Chris@76: $cur_data['value'] = eval(preg_replace('~%([a-zA-Z0-9\-_]+)%~', '$list_item[\'$1\']', $column['data']['eval'])); Chris@76: Chris@76: // A literal value. Chris@76: elseif (isset($column['data']['value'])) Chris@76: $cur_data['value'] = $column['data']['value']; Chris@76: Chris@76: // Empty value. Chris@76: else Chris@76: $cur_data['value'] = ''; Chris@76: Chris@76: // Allow for basic formatting. Chris@76: if (!empty($column['data']['comma_format'])) Chris@76: $cur_data['value'] = comma_format($cur_data['value']); Chris@76: elseif (!empty($column['data']['timeformat'])) Chris@76: $cur_data['value'] = timeformat($cur_data['value']); Chris@76: Chris@76: // Set a style class for this column? Chris@76: if (isset($column['data']['class'])) Chris@76: $cur_data['class'] = $column['data']['class']; Chris@76: Chris@76: // Fully customized styling for the cells in this column only. Chris@76: if (isset($column['data']['style'])) Chris@76: $cur_data['style'] = $column['data']['style']; Chris@76: Chris@76: // Add the data cell properties to the current row. Chris@76: $cur_row[$column_id] = $cur_data; Chris@76: } Chris@76: Chris@76: // Insert the row into the list. Chris@76: $list_context['rows'][$item_id] = $cur_row; Chris@76: } Chris@76: Chris@76: // The title is currently optional. Chris@76: if (isset($listOptions['title'])) Chris@76: $list_context['title'] = $listOptions['title']; Chris@76: Chris@76: // In case there's a form, share it with the template context. Chris@76: if (isset($listOptions['form'])) Chris@76: { Chris@76: $list_context['form'] = $listOptions['form']; Chris@76: Chris@76: if (!isset($list_context['form']['hidden_fields'])) Chris@76: $list_context['form']['hidden_fields'] = array(); Chris@76: Chris@76: // Always add a session check field. Chris@76: $list_context['form']['hidden_fields'][$context['session_var']] = $context['session_id']; Chris@76: Chris@76: // Include the starting page as hidden field? Chris@76: if (!empty($list_context['form']['include_start']) && !empty($list_context['start'])) Chris@76: $list_context['form']['hidden_fields'][$list_context['start_var_name']] = $list_context['start']; Chris@76: Chris@76: // If sorting needs to be the same after submitting, add the parameter. Chris@76: if (!empty($list_context['form']['include_sort']) && !empty($list_context['sort'])) Chris@76: { Chris@76: $list_context['form']['hidden_fields']['sort'] = $list_context['sort']['id']; Chris@76: if ($list_context['sort']['desc']) Chris@76: $list_context['form']['hidden_fields']['desc'] = 1; Chris@76: } Chris@76: } Chris@76: Chris@76: // Wanna say something nice in case there are no items? Chris@76: if (isset($listOptions['no_items_label'])) Chris@76: { Chris@76: $list_context['no_items_label'] = $listOptions['no_items_label']; Chris@76: $list_context['no_items_align'] = isset($listOptions['no_items_align']) ? $listOptions['no_items_align'] : ''; Chris@76: } Chris@76: Chris@76: // A list can sometimes need a few extra rows above and below. Chris@76: if (isset($listOptions['additional_rows'])) Chris@76: { Chris@76: $list_context['additional_rows'] = array(); Chris@76: foreach ($listOptions['additional_rows'] as $row) Chris@76: { Chris@76: if (empty($row)) Chris@76: continue; Chris@76: Chris@76: // Supported row positions: top_of_list, after_title, Chris@76: // above_column_headers, below_table_data, bottom_of_list. Chris@76: if (!isset($list_context['additional_rows'][$row['position']])) Chris@76: $list_context['additional_rows'][$row['position']] = array(); Chris@76: $list_context['additional_rows'][$row['position']][] = $row; Chris@76: } Chris@76: } Chris@76: Chris@76: // Add an option for inline JavaScript. Chris@76: if (isset($listOptions['javascript'])) Chris@76: $list_context['javascript'] = $listOptions['javascript']; Chris@76: Chris@76: // We want a menu. Chris@76: if (isset($listOptions['list_menu'])) Chris@76: $list_context['list_menu'] = $listOptions['list_menu']; Chris@76: Chris@76: // Make sure the template is loaded. Chris@76: loadTemplate('GenericList'); Chris@76: } Chris@76: Chris@76: ?>