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..cca89bb --- /dev/null +++ b/core/modules/shortcut/lib/Drupal/shortcut/Form/SetCustomize.php @@ -0,0 +1,126 @@ +storageController = $storage_controller; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('plugin.manager.entity')->getStorageController('menu_link') + ); + } + + /** + * {@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->id(); + $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) { + $mlids = array_keys($form_state['values']['shortcuts']['links']); + $menu_links = $this->storageController->load($mlids); + foreach ($form_state['values']['shortcuts']['links'] as $mlid => $data) { + $link = $menu_links[$mlid]; + debug($mlid); + debug($data['weight']); + $link->weight = $data['weight']; + $this->storageController->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 ed38a4a..161e726 100644 --- a/core/modules/shortcut/shortcut.admin.inc +++ b/core/modules/shortcut/shortcut.admin.inc @@ -179,80 +179,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 c2c9b4a..d8fc848 100644 --- a/core/modules/shortcut/shortcut.module +++ b/core/modules/shortcut/shortcut.module @@ -75,13 +75,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 488d187..c36f317 100644 --- a/core/modules/shortcut/shortcut.routing.yml +++ b/core/modules/shortcut/shortcut.routing.yml @@ -18,3 +18,10 @@ shortcut_set_admin: _content: 'Drupal\shortcut\Controller\ShortcutController::shortcutSetAdmin' requirements: _permission: 'administer shortcuts' + +shortcut_set_customize: + pattern: '/admin/config/user-interface/shortcut/manage/{shortcut}' + defaults: + _form: 'Drupal\shortcut\Form\SetCustomize' + requirements: + _entity_access: 'shortcut.customize'