shortcut.admin.inc 16.4 KB
Newer Older
1 2 3 4 5 6 7
<?php

/**
 * @file
 * Administrative page callbacks for the shortcut module.
 */

8
use Symfony\Component\HttpFoundation\RedirectResponse;
9 10
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;

11
/**
12
 * Form callback: builds the form for switching shortcut sets.
13 14 15 16 17 18 19 20
 *
 * @param $form
 *   An associative array containing the structure of the form.
 * @param $form_state
 *   An associative array containing the current state of the form.
 * @param $account
 *   (optional) The user account whose shortcuts will be switched. Defaults to
 *   the current logged-in user.
21
 *
22 23 24 25
 * @return
 *   An array representing the form definition.
 *
 * @ingroup forms
26
 * @see shortcut_set_switch_validate()
27 28 29 30 31 32 33 34 35
 * @see shortcut_set_switch_submit()
 */
function shortcut_set_switch($form, &$form_state, $account = NULL) {
  global $user;
  if (!isset($account)) {
    $account = $user;
  }

  // Prepare the list of shortcut sets.
36
  $sets = entity_load_multiple('shortcut');
37
  $current_set = shortcut_current_displayed_set($account);
38

39 40
  $options = array();
  foreach ($sets as $name => $set) {
41
    $options[$name] = check_plain($set->label());
42 43 44 45 46 47 48 49
  }

  // Only administrators can add shortcut sets.
  $add_access = user_access('administer shortcuts');
  if ($add_access) {
    $options['new'] = t('New set');
  }

50 51 52 53 54
  if (count($options) > 1) {
    $form['account'] = array(
      '#type' => 'value',
      '#value' => $account,
    );
55

56 57 58 59
    $form['set'] = array(
      '#type' => 'radios',
      '#title' => $user->uid == $account->uid ? t('Choose a set of shortcuts to use') : t('Choose a set of shortcuts for this user'),
      '#options' => $options,
60
      '#default_value' => $current_set->id(),
61
    );
62

63
    $form['label'] = array(
64
      '#type' => 'textfield',
65
      '#title' => t('Label'),
66
      '#title_display' => 'invisible',
67 68 69
      '#description' => t('The new set is created by copying items from your default shortcut set.'),
      '#access' => $add_access,
    );
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
    $form['id'] = array(
      '#type' => 'machine_name',
      '#machine_name' => array(
        'exists' => 'shortcut_set_load',
        'source' => array('label'),
        'replace_pattern' => '[^a-z0-9-]+',
        'replace' => '-',
      ),
      // This id could be used for menu name.
      '#maxlength' => 23,
      '#states' => array(
        'required' => array(
          ':input[name="set"]' => array('value' => 'new'),
        ),
      ),
      '#required' => FALSE,
    );
87

88 89
    if ($user->uid != $account->uid) {
      $default_set = shortcut_default_set($account);
90
      $form['new']['#description'] = t('The new set is created by copying items from the %default set.', array('%default' => $default_set->label()));
91
    }
92

93
    $form['#attached'] = array(
94
      'library' => array(array('shortcut', 'drupal.shortcut.admin')),
95 96
    );

97
    $form['actions'] = array('#type' => 'actions');
98 99 100 101 102 103 104 105
    $form['actions']['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Change set'),
    );
  }
  else {
    // There is only 1 option, so output a message in the $form array.
    $form['info'] = array(
106
      '#markup' => '<p>' . t('You are currently using the %set-name shortcut set.', array('%set-name' => $current_set->label())) . '</p>',
107 108
    );
  }
109 110 111 112

  return $form;
}

113 114 115 116 117 118
/**
 * Validation handler for shortcut_set_switch().
 */
function shortcut_set_switch_validate($form, &$form_state) {
  if ($form_state['values']['set'] == 'new') {
    // Check to prevent creating a shortcut set with an empty title.
119 120
    if (trim($form_state['values']['label']) == '') {
      form_set_error('new', t('The new set label is required.'));
121 122
    }
    // Check to prevent a duplicate title.
123 124
    if (shortcut_set_title_exists($form_state['values']['label'])) {
      form_set_error('label', t('The shortcut set %name already exists. Choose another name.', array('%name' => $form_state['values']['label'])));
125 126 127 128
    }
  }
}

129
/**
130
 * Submit handler for shortcut_set_switch().
131 132 133 134 135 136
 */
function shortcut_set_switch_submit($form, &$form_state) {
  global $user;
  $account = $form_state['values']['account'];

  if ($form_state['values']['set'] == 'new') {
137 138
    // Save a new shortcut set with links copied from the user's default set.
    $default_set = shortcut_default_set($account);
139 140 141
    $set = entity_create('shortcut', array(
      'id' => $form_state['values']['id'],
      'label' => $form_state['values']['label'],
142
      'links' => $default_set->links,
143 144
    ));
    $set->save();
145 146
    $replacements = array(
      '%user' => $account->name,
147
      '%set_name' => $set->label(),
148
      '@switch-url' => url(current_path()),
149 150 151 152
    );
    if ($account->uid == $user->uid) {
      // Only administrators can create new shortcut sets, so we know they have
      // access to switch back.
153
      drupal_set_message(t('You are now using the new %set_name shortcut set. You can edit it from this page or <a href="@switch-url">switch back to a different one.</a>', $replacements));
154 155
    }
    else {
156
      drupal_set_message(t('%user is now using a new shortcut set called %set_name. You can edit it from this page.', $replacements));
157
    }
158
    $form_state['redirect'] = 'admin/config/user-interface/shortcut/manage/' . $set->id();
159 160 161 162 163 164
  }
  else {
    // Switch to a different shortcut set.
    $set = shortcut_set_load($form_state['values']['set']);
    $replacements = array(
      '%user' => $account->name,
165
      '%set_name' => $set->label(),
166 167 168 169 170 171 172 173
    );
    drupal_set_message($account->uid == $user->uid ? t('You are now using the %set_name shortcut set.', $replacements) : t('%user is now using the %set_name shortcut set.', $replacements));
  }

  // Assign the shortcut set to the provided user account.
  shortcut_set_assign_user($set, $account);
}

174
/**
175
 * Page callback: provides the shortcut set creation form.
176
 */
177 178
function shortcut_set_add() {
  $entity = entity_create('shortcut', array());
179
  return Drupal::entityManager()->getForm($entity);
180 181 182 183
}

/**
 * Form callback: builds the form for customizing shortcut sets.
184 185 186 187 188
 *
 * @param $form
 *   An associative array containing the structure of the form.
 * @param $form_state
 *   An associative array containing the current state of the form.
189
 * @param $shortcut_set Drupal\shortcut\Plugin\Core\Entity\Shortcut
190
 *   An object representing the shortcut set which is being edited.
191
 *
192 193 194 195 196 197 198
 * @return
 *   An array representing the form definition.
 *
 * @ingroup forms
 * @see shortcut_set_customize_submit()
 */
function shortcut_set_customize($form, &$form_state, $shortcut_set) {
199
  $form['#shortcut_set_name'] = $shortcut_set->id();
200 201 202
  $form['shortcuts'] = array(
    '#tree' => TRUE,
    '#weight' => -20,
203
    'links' => array(),
204 205
  );

206
  foreach ($shortcut_set->links as $uuid => $link) {
207
    $mlid = $link['mlid'];
208 209
    $form['shortcuts']['links'][$mlid]['name']['#markup'] = l($link['link_title'], $link['link_path']);
    $form['shortcuts']['links'][$mlid]['weight'] = array(
210
      '#type' => 'weight',
211 212
      '#title' => t('Weight for @title', array('@title' => $link['link_title'])),
      '#title_display' => 'invisible',
213 214 215 216
      '#delta' => 50,
      '#default_value' => $link['weight'],
      '#attributes' => array('class' => array('shortcut-weight')),
    );
217

218
    $links['edit'] = array(
219
      'title' => t('Edit'),
220 221 222
      'href' => "admin/config/user-interface/shortcut/link/$mlid",
    );
    $links['delete'] = array(
223
      'title' => t('Delete'),
224 225 226 227 228 229
      'href' => "admin/config/user-interface/shortcut/link/$mlid/delete",
    );
    $form['shortcuts']['links'][$mlid]['operations'] = array(
      '#type' => 'operations',
      '#links' => $links,
    );
230 231
  }

232 233 234 235
  $form['actions'] = array(
    '#type' => 'actions',
    '#access' => !empty($shortcut_set->links),
  );
236
  $form['actions']['submit'] = array(
237
    '#type' => 'submit',
238
    '#value' => t('Save changes'),
239 240 241 242 243 244
  );

  return $form;
}

/**
245
 * Submit handler for shortcut_set_customize().
246 247
 */
function shortcut_set_customize_submit($form, &$form_state) {
248 249 250 251
  foreach ($form_state['values']['shortcuts']['links'] as $mlid => $data) {
    $link = menu_link_load($mlid);
    $link['weight'] = $data['weight'];
    menu_link_save($link);
252 253 254 255 256
  }
  drupal_set_message(t('The shortcut set has been updated.'));
}

/**
257
 * Returns HTML for a shortcut set customization form.
258 259 260
 *
 * @param $variables
 *   An associative array containing:
261
 *   - form: A render element representing the form.
262
 *
263
 * @see shortcut_set_customize()
264
 * @ingroup themeable
265 266 267
 */
function theme_shortcut_set_customize($variables) {
  $form = $variables['form'];
268

269 270
  // Do not add any rows to the table if there are no shortcuts to display.
  $statuses = empty($shortcuts_by_status['enabled']) && empty($shortcuts_by_status['disabled']) ? array() : array_keys($shortcuts_by_status);
271 272

  $rows = array();
273 274 275 276 277 278
  drupal_add_tabledrag('shortcuts', 'order', 'sibling', 'shortcut-weight');
  foreach (element_children($form['shortcuts']['links']) as $key) {
    $shortcut = &$form['shortcuts']['links'][$key];
    $row = array();
    $row[] = drupal_render($shortcut['name']);
    $row[] = drupal_render($shortcut['weight']);
279
    $row[] = drupal_render($shortcut['operations']);
280
    $rows[] = array(
281 282
      'data' => $row,
      'class' => array('draggable'),
283 284
    );
  }
285

286
  $header = array(t('Name'), t('Weight'), t('Operations'));
287 288 289 290 291

  $table = array(
    '#theme' => 'table',
    '#header' => $header,
    '#rows' => $rows,
292 293 294
    '#empty' => t('No shortcuts available. <a href="@link">Add a shortcut</a>.', array(
      '@link' => url('admin/config/user-interface/shortcut/manage/' . $form['#shortcut_set_name'] . '/add-link'),
    )),
295 296
    '#attributes' => array(
      'id' => 'shortcuts',
297
    ),
298 299 300
  );

  $output = drupal_render($table);
301
  $output .= drupal_render($form['actions']);
302 303 304 305 306
  $output = drupal_render_children($form) . $output;
  return $output;
}

/**
307
 * Form callback: builds the form for adding a new shortcut link.
308 309 310 311 312
 *
 * @param $form
 *   An associative array containing the structure of the form.
 * @param $form_state
 *   An associative array containing the current state of the form.
313
 * @param $shortcut_set Drupal\shortcut\Plugin\Core\Entity\Shortcut
314
 *   An object representing the shortcut set to which the link will be added.
315
 *
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
 * @return
 *   An array representing the form definition.
 *
 * @ingroup forms
 * @see shortcut_link_edit_validate()
 * @see shortcut_link_add_submit()
 */
function shortcut_link_add($form, &$form_state, $shortcut_set) {
  drupal_set_title(t('Add new shortcut'));
  $form['shortcut_set'] = array(
    '#type' => 'value',
    '#value' => $shortcut_set,
  );
  $form += _shortcut_link_form_elements();
  return $form;
}

/**
334
 * Form callback: builds the form for editing a shortcut link.
335 336 337 338 339 340 341
 *
 * @param $form
 *   An associative array containing the structure of the form.
 * @param $form_state
 *   An associative array containing the current state of the form.
 * @param $shortcut_link
 *   An array representing the link that is being edited.
342
 *
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
 * @return
 *   An array representing the form definition.
 *
 * @ingroup forms
 * @see shortcut_link_edit_validate()
 * @see shortcut_link_edit_submit()
 */
function shortcut_link_edit($form, &$form_state, $shortcut_link) {
  drupal_set_title(t('Editing @shortcut', array('@shortcut' => $shortcut_link['link_title'])));
  $form['original_shortcut_link'] = array(
    '#type' => 'value',
    '#value' => $shortcut_link,
  );
  $form += _shortcut_link_form_elements($shortcut_link);
  return $form;
}

/**
 * Helper function for building a form for adding or editing shortcut links.
 *
 * @param $shortcut_link
 *   (optional) An array representing the shortcut link that will be edited. If
 *   not provided, a new link will be created.
366
 *
367 368 369 370 371
 * @return
 *   An array of form elements.
 */
function _shortcut_link_form_elements($shortcut_link = NULL) {
  if (!isset($shortcut_link)) {
372
    $shortcut_link = entity_create('menu_link', array(
373 374
      'link_title' => '',
      'link_path' => ''
375
    ));
376
  }
377
  else {
378
    $shortcut_link['link_path'] = ($shortcut_link['link_path'] == '<front>') ? '' : Drupal::service('path.alias_manager')->getPathAlias($shortcut_link['link_path']);
379
  }
380 381 382 383 384 385 386 387

  $form['shortcut_link']['#tree'] = TRUE;
  $form['shortcut_link']['link_title'] = array(
    '#type' => 'textfield',
    '#title' => t('Name'),
    '#size' => 40,
    '#maxlength' => 255,
    '#default_value' => $shortcut_link['link_title'],
388
    '#required' => TRUE,
389 390 391 392 393 394 395
  );

  $form['shortcut_link']['link_path'] = array(
    '#type' => 'textfield',
    '#title' => t('Path'),
    '#size' => 40,
    '#maxlength' => 255,
396
    '#field_prefix' => url(NULL, array('absolute' => TRUE)),
397 398 399 400 401
    '#default_value' => $shortcut_link['link_path'],
  );

  $form['#validate'][] = 'shortcut_link_edit_validate';

402
  $form['actions'] = array('#type' => 'actions');
403
  $form['actions']['submit'] = array(
404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420
    '#type' => 'submit',
    '#value' => t('Save'),
  );

  return $form;
}

/**
 * Validation handler for the shortcut link add and edit forms.
 */
function shortcut_link_edit_validate($form, &$form_state) {
  if (!shortcut_valid_link($form_state['values']['shortcut_link']['link_path'])) {
    form_set_error('shortcut_link][link_path', t('The link must correspond to a valid path on the site.'));
  }
}

/**
421
 * Submit handler for shortcut_link_edit().
422 423
 */
function shortcut_link_edit_submit($form, &$form_state) {
424
  // Normalize the path in case it is an alias.
425
  $shortcut_path = Drupal::service('path.alias_manager')->getSystemPath($form_state['values']['shortcut_link']['link_path']);
426 427 428 429
  if (empty($shortcut_path)) {
    $shortcut_path = '<front>';
  }
  $form_state['values']['shortcut_link']['link_path'] = $shortcut_path;
430

431 432 433 434
  $shortcut_link = $form_state['values']['original_shortcut_link'];
  foreach ($form_state['values']['shortcut_link'] as $key => $value) {
   $shortcut_link[$key] = $value;
  }
435

436
  menu_link_save($shortcut_link);
437 438
  $set_name = str_replace('shortcut-', '' , $shortcut_link['menu_name']);
  $form_state['redirect'] = 'admin/config/user-interface/shortcut/manage/' . $set_name;
439 440 441 442
  drupal_set_message(t('The shortcut %link has been updated.', array('%link' => $shortcut_link['link_title'])));
}

/**
443
 * Submit handler for shortcut_link_add().
444 445 446 447 448
 */
function shortcut_link_add_submit($form, &$form_state) {
  // Add the shortcut link to the set.
  $shortcut_set = $form_state['values']['shortcut_set'];
  $shortcut_link = $form_state['values']['shortcut_link'];
449
  $shortcut_link['menu_name'] = $shortcut_set->id();
450
  shortcut_admin_add_link($shortcut_link, $shortcut_set);
451 452
  $shortcut_set->save();
  $form_state['redirect'] = 'admin/config/user-interface/shortcut/manage/' . $shortcut_set->id();
453 454 455 456
  drupal_set_message(t('Added a shortcut for %title.', array('%title' => $shortcut_link['link_title'])));
}

/**
457
 * Adds a link to the end of a shortcut set, keeping within a prescribed limit.
458 459 460
 *
 * @param $link
 *   An array representing a shortcut link.
461
 * @param $shortcut_set Drupal\shortcut\Plugin\Core\Entity\Shortcut
462 463 464 465 466
 *   An object representing the shortcut set which the link will be added to.
 *   The links in the shortcut set will be re-weighted so that the new link is
 *   at the end, and some existing links may be disabled (if the $limit
 *   parameter is provided).
 */
467
function shortcut_admin_add_link($shortcut_link, &$shortcut_set) {
468
  // Normalize the path in case it is an alias.
469
  $shortcut_link['link_path'] = Drupal::service('path.alias_manager')->getSystemPath($shortcut_link['link_path']);
470 471 472
  if (empty($shortcut_link['link_path'])) {
    $shortcut_link['link_path'] = '<front>';
  }
473 474
  $menu_link = entity_create('menu_link', $shortcut_link);
  $menu_link->save();
475

476
  // Add the link to the end of the list.
477
  $shortcut_set->links[$menu_link->uuid()] = $menu_link;
478 479 480 481
  shortcut_set_reset_link_weights($shortcut_set);
}

/**
482
 * Menu page callback: creates a new link in the provided shortcut set.
483 484 485
 *
 * After completion, redirects the user back to where they came from.
 *
486
 * @param $shortcut_set Drupal\shortcut\Plugin\Core\Entity\Shortcut
487 488 489 490
 *   Returned from shortcut_set_load().
 */
function shortcut_link_add_inline($shortcut_set) {
  if (isset($_REQUEST['token']) && drupal_valid_token($_REQUEST['token'], 'shortcut-add-link') && shortcut_valid_link($_GET['link'])) {
491 492
    $item = menu_get_item($_GET['link']);
    $title = ($item && $item['title']) ? $item['title'] : $_GET['name'];
493
    $link = array(
494
      'link_title' => $title,
495 496
      'link_path' => $_GET['link'],
    );
497
    shortcut_admin_add_link($link, $shortcut_set);
498
    if ($shortcut_set->save() == SAVED_UPDATED) {
499 500 501 502 503
      drupal_set_message(t('Added a shortcut for %title.', array('%title' => $link['link_title'])));
    }
    else {
      drupal_set_message(t('Unable to add a shortcut for %title.', array('%title' => $link['link_title'])));
    }
504
    return new RedirectResponse(url('<front>', array('absolute' => TRUE)));
505
  }
506

507
  throw new AccessDeniedHttpException();
508
}