diff --git a/core/modules/shortcut/lib/Drupal/shortcut/Form/SetCustomize.php b/core/modules/shortcut/lib/Drupal/shortcut/Form/SetCustomize.php new file mode 100644 index 0000000..51d5a94 --- /dev/null +++ b/core/modules/shortcut/lib/Drupal/shortcut/Form/SetCustomize.php @@ -0,0 +1,124 @@ +entity_manager = $entity_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('plugin.manager.entity') + ); + } + + /** + * {@inheritdoc} + */ + public function getFormID() { + return 'shortcut_set_customize'; + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, array &$form_state, Shortcut $shortcut = NULL) { + $form['#shortcut_set_name'] = $shortcut->id(); + $form['shortcuts'] = array( + '#tree' => TRUE, + '#weight' => -20, + 'links' => array(), + ); + + foreach ($shortcut->links as $uuid => $link) { + $mlid = $link['mlid']; + $form['shortcuts']['links'][$mlid]['name']['#markup'] = l($link['link_title'], $link['link_path']); + $form['shortcuts']['links'][$mlid]['weight'] = array( + '#type' => 'weight', + '#title' => t('Weight for @title', array('@title' => $link['link_title'])), + '#title_display' => 'invisible', + '#delta' => 50, + '#default_value' => $link['weight'], + '#attributes' => array('class' => array('shortcut-weight')), + ); + + $links['edit'] = array( + 'title' => t('Edit'), + 'href' => "admin/config/user-interface/shortcut/link/$mlid", + ); + $links['delete'] = array( + 'title' => t('Delete'), + 'href' => "admin/config/user-interface/shortcut/link/$mlid/delete", + ); + $form['shortcuts']['links'][$mlid]['operations'] = array( + '#type' => 'operations', + '#links' => $links, + ); + } + + $form['actions'] = array( + '#type' => 'actions', + '#access' => !empty($shortcut->links), + ); + $form['actions']['submit'] = array( + '#type' => 'submit', + '#value' => t('Save changes'), + ); + + return $form; + } + + /** + * {@inheritdoc} + */ + public function validateform(array &$form, array &$form_state) { + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + foreach ($form_state['values']['shortcuts']['links'] as $mlid => $data) { + $menu_link = $this->entityManager + ->getStorageController('menu_link'); + $link = $menu_link->load(array($mlid)); + $link['weight'] = $data['weight']; + $menu_link->save($link); + } + drupal_set_message(t('The shortcut set has been updated.')); + } + +} diff --git a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutAccessController.php b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutAccessController.php index b527b1f..bfc7a79 100644 --- a/core/modules/shortcut/lib/Drupal/shortcut/ShortcutAccessController.php +++ b/core/modules/shortcut/lib/Drupal/shortcut/ShortcutAccessController.php @@ -20,12 +20,30 @@ class ShortcutAccessController extends EntityAccessController { * {@inheritdoc} */ protected function checkAccess(EntityInterface $entity, $operation, $langcode, User $account) { - if ($operation == 'delete') { - if (!user_access('administer shortcuts', $account)) { + switch ($operation) { + case 'delete': + if (!user_access('administer shortcuts', $account)) { + return FALSE; + } + return $entity->id() != 'default'; + break; + + case 'customize': + // Sufficiently-privileged users can edit their currently displayed shortcut + // set, but not other sets. Shortcut administrators can edit any set. + if (user_access('administer shortcuts')) { + return TRUE; + } + if (user_access('customize shortcut links')) { + return !isset($entity) || $entity == shortcut_current_displayed_set(); + } + return FALSE; + break; + + default: return FALSE; - } - return $entity->id() != 'default'; } + } } diff --git a/core/modules/shortcut/shortcut.admin.inc b/core/modules/shortcut/shortcut.admin.inc index dec4dbd..7f8f83c 100644 --- a/core/modules/shortcut/shortcut.admin.inc +++ b/core/modules/shortcut/shortcut.admin.inc @@ -186,80 +186,6 @@ function shortcut_set_add() { } /** - * Form callback: builds the form for customizing shortcut sets. - * - * @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_set Drupal\shortcut\Plugin\Core\Entity\Shortcut - * An object representing the shortcut set which is being edited. - * - * @return - * An array representing the form definition. - * - * @ingroup forms - * @see shortcut_set_customize_submit() - */ -function shortcut_set_customize($form, &$form_state, $shortcut_set) { - $form['#shortcut_set_name'] = $shortcut_set->id(); - $form['shortcuts'] = array( - '#tree' => TRUE, - '#weight' => -20, - 'links' => array(), - ); - - foreach ($shortcut_set->links as $uuid => $link) { - $mlid = $link['mlid']; - $form['shortcuts']['links'][$mlid]['name']['#markup'] = l($link['link_title'], $link['link_path']); - $form['shortcuts']['links'][$mlid]['weight'] = array( - '#type' => 'weight', - '#title' => t('Weight for @title', array('@title' => $link['link_title'])), - '#title_display' => 'invisible', - '#delta' => 50, - '#default_value' => $link['weight'], - '#attributes' => array('class' => array('shortcut-weight')), - ); - - $links['edit'] = array( - 'title' => t('Edit'), - 'href' => "admin/config/user-interface/shortcut/link/$mlid", - ); - $links['delete'] = array( - 'title' => t('Delete'), - 'href' => "admin/config/user-interface/shortcut/link/$mlid/delete", - ); - $form['shortcuts']['links'][$mlid]['operations'] = array( - '#type' => 'operations', - '#links' => $links, - ); - } - - $form['actions'] = array( - '#type' => 'actions', - '#access' => !empty($shortcut_set->links), - ); - $form['actions']['submit'] = array( - '#type' => 'submit', - '#value' => t('Save changes'), - ); - - return $form; -} - -/** - * Submit handler for shortcut_set_customize(). - */ -function shortcut_set_customize_submit($form, &$form_state) { - foreach ($form_state['values']['shortcuts']['links'] as $mlid => $data) { - $link = menu_link_load($mlid); - $link['weight'] = $data['weight']; - menu_link_save($link); - } - drupal_set_message(t('The shortcut set has been updated.')); -} - -/** * Returns HTML for a shortcut set customization form. * * @param $variables diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module index db3373b..685f5ec 100644 --- a/core/modules/shortcut/shortcut.module +++ b/core/modules/shortcut/shortcut.module @@ -77,13 +77,7 @@ function shortcut_menu() { ); $items['admin/config/user-interface/shortcut/manage/%shortcut_set'] = array( 'title' => 'Edit shortcuts', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('shortcut_set_customize', 5), - 'title callback' => 'entity_page_label', - 'title arguments' => array(5), - 'access callback' => 'shortcut_set_edit_access', - 'access arguments' => array(5), - 'file' => 'shortcut.admin.inc', + 'route_name' => 'shortcut_set_customize', ); $items['admin/config/user-interface/shortcut/manage/%shortcut_set/links'] = array( 'title' => 'List links', diff --git a/core/modules/shortcut/shortcut.routing.yml b/core/modules/shortcut/shortcut.routing.yml index 277853f..ae6cf19 100644 --- a/core/modules/shortcut/shortcut.routing.yml +++ b/core/modules/shortcut/shortcut.routing.yml @@ -11,3 +11,11 @@ shortcut_set_delete: _form: 'Drupal\shortcut\Form\SetDelete' requirements: _entity_access: 'shortcut.delete' + +shortcut_set_customize: + pattern: '/admin/config/user-interface/shortcut/manage/{shortcut}' + defaults: + _form: 'Drupal\shortcut\Form\SetCustomize' + requirements: + _entity_access: 'shortcut.customize' +