$info) {
$info['value'] = $value;
$merged[] = $info;
}
}
$rows = array();
for ($i = $page * $limit; $i < ($page+1) * $limit && $i < count($merged); $i++) {
$rows[] = array(
$providers[$merged[$i]['provider']]['name'],
$merged[$i]['value'],
$merged[$i]['id'],
$methods[variable_get('purl_method_'. $merged[$i]['provider'], 'path')],
);
}
// We calculate the total of pages as ceil(items / limit).
$pager_total_items[$element] = count($merged);
$pager_total[$element] = ceil($pager_total_items[$element] / $limit);
$pager_page_array[$element] = max(0, min((int)$pager_page_array[$element], ((int)$pager_total[$element]) - 1));
if ($rows) {
$output = theme('table', array(t('Provider'), t('Modifier'), t('ID'), t('Method')), $rows);
$output .= theme('pager');
}
else {
$output = "
". t('No persistent urls have been registered.') ."
";
}
return $output;
}
/**
* Settings form for choosing the operating mode of purl
*/
function purl_settings_form() {
$form = array();
$options = _purl_options();
foreach (purl_providers() as $id => $provider) {
// Check to see whether provider has limited the available valueing methods
if (isset($provider['methods']) && count($provider['methods'])) {
$provider_options = array();
foreach ($provider['methods'] as $method) {
$provider_options[$method] = $options[$method];
}
}
else {
$provider_options = $options;
}
$form[$id] = array(
'#fieldset' => true,
'#provider' => true,
'#title' => $provider['name'],
'#description' => $provider['description'],
);
$form[$id]['purl_method_'. $id] = array(
'#title' => t('Method'),
'#type' => 'select',
'#options' => $provider_options,
'#default_value' => variable_get('purl_method_'. $id, 'path'),
);
// Allow processors to alter the form.
foreach ($provider_options as $k => $v) {
purl_get_processor($k)->admin_form($form, $id);
}
}
$form = system_settings_form($form);
$form['#theme'] = 'purl_settings_form';
return $form;
}
/**
* Validate a key element and move its value to the correct key if validated.
*/
function purl_admin_form_key_validate(&$element, &$form_state) {
// Check for string identifier sanity
if (!empty($element['#value'])) {
if (!preg_match('!^[A-Za-z0-9_-]+$!', $element['#value'])) {
form_set_error($element['#name'], t('The key may only consist of letters, numbers, dashes and underscores.'));
}
else {
$form_state['values']["purl_method_{$element['#provider_id']}_key"] = $element['#value'];
}
}
unset($form_state['values'][$element['#name']]);
}
/**
* Theme function for purl_settings_form()
*/
function theme_purl_settings_form($form) {
$output = '';
$rows = array();
foreach (element_children($form) as $id) {
$row = array();
if (isset($form[$id]['#provider'])) {
$name = $form[$id]['#title'];
$description = $form[$id]['#description'];
unset($form[$id]['#title']);
unset($form[$id]['#description']);
$row[] = "$name$description
";
$cell = $extra = '';
foreach (element_children($form[$id]) as $item) {
unset($form[$id][$item]['#title']);
if ($item == 'extra') {
$extra = drupal_render($form[$id][$item]);
}
$cell .= drupal_render($form[$id][$item]);
}
$row[] = $cell;
$row[] = $extra;
}
$rows[] = $row;
}
$output .= theme('table', array(t('Provider'), t('Modifier type')), $rows);
$output .= drupal_render($form);
drupal_add_js(drupal_get_path("module", "purl") ."/purl.admin.js");
return $output;
}
/**
* Allow administrators to enable purl methods.
*/
function purl_types_form() {
$form = array();
$form['purl_types'] = array(
'#type' => 'checkboxes',
'#title' => t('Types'),
'#options' => _purl_options(false),
'#default_value' => variable_get('purl_types', array()),
'#description' => t('Enabled URL modification types.'),
);
return system_settings_form($form);
}
/**
* Private implementation of hook_form_alter()
*/
function _purl_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'menu_edit_menu') {
if (isset($form['menu_name']['#value'])) {
$form['purl'] = array(
'#tree' => true,
'#type' => 'fieldset',
'#title' => t('Persistant URL behavior'),
'#description' => t('All links are normally rewritten to contain the active persistant url elements. You may set all items in this menu to maintain existing modifications (the default), or to discard them.'),
);
$form['purl']['rewrite'] = array(
'#type' => 'select',
'#options' => array('enabled' => t("Maintain"), 'disabled' => ("Discard")),
'#title' => t('Behavior'),
'#default_value' => variable_get('purl_menu_behavior_'. $form['menu_name']['#value'], 'enabled'),
);
$form['purl']['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
'#submit' => array('purl_menu_edit_submit'),
);
}
}
elseif ($form_id == 'menu_edit_item') {
$options = $form['menu']['options']['#value'];
$form['purl'] = array(
'#tree' => true,
'#type' => 'fieldset',
'#title' => t('Persistant URL behavior'),
'#description' => t('All links are normally rewritten to contain the active persistant url elements. You may set this item to maintain existing modifications (the default), or to discard them.'),
'#weight' => -1,
);
$form['purl']['rewrite'] = array(
'#type' => 'select',
'#options' => array('enabled' => t("Maintain"), 'disabled' => ("Discard")),
'#title' => t('Behavior'),
'#default_value' => (isset($options['purl']) && $options['purl'] == 'disabled') ? 'disabled' : 'enabled',
);
$form['#validate'][] = 'purl_item_edit_validate';
$form['#submit'][] = 'purl_item_edit_submit';
}
}
// Submit handler for menu_edit_menu
function purl_menu_edit_submit($form, &$form_state) {
$menu = $form_state['values'];
$tree = menu_tree_all_data($menu['menu_name']);
// Recurse through all items and set each.
_purl_menu_edit_submit_recurse($tree, $menu['purl']['rewrite']);
menu_cache_clear($menu['menu_name']);
if ($menu['purl']['rewrite'] == 'disabled') {
variable_set('purl_menu_behavior_' .$menu['menu_name'], 'disabled');
}
else {
variable_del('purl_menu_behavior_' .$menu['menu_name']);
}
}
/**
* Recuses though a menu tree and applies a purl behavior to each link.
*
* @param $tree
* A (portion) of a menu tree as generated by menu_tree_all_data()
* @param $behavior
* The purl behavior to save in the options array of the menu links. Either
* 'enabled' or 'disabled'.
*/
function _purl_menu_edit_submit_recurse($tree, $behavior) {
foreach ($tree as $id => $item) {
$link = $tree[$id]['link'];
if ($behavior == 'disabled') {
$link['options']['purl'] = 'disabled';
}
else {
unset($link['options']['purl']);
}
menu_link_save($link);
if ($link['has_children']) {
_purl_menu_edit_submit_recurse($tree[$id]['below'], $behavior);
}
}
}
/**
* Validate handler for menu_edit_item
*
* Doesn't actually validate, but rather moves data to where
* menu_edit_item_submit() expects it.
*/
function purl_item_edit_validate($form, &$form_state) {
if ($form_state['values']['purl']['rewrite'] == 'disabled') {
$form_state['values']['menu']['options']['purl'] = 'disabled';
}
else {
unset($form_state['values']['menu']['options']['purl']);
}
}
// Submit handler for menu_edit_item
function purl_item_edit_submit($form, &$form_state) {
menu_cache_clear($form_state['values']['menu']['menu_name']);
}