Apa yang setara dengan hook_translated_menu_link_alter () untuk mengubah tautan menu? [duplikat]


8

Saya ingin mengubah tautan menu di Drupal 8. Di Drupal 7 kita bisa mencapai ini menggunakan hook_translated_menu_link_alter().

function module_translated_menu_link_alter(&$item, $map) {
  global $user;

  if (!empty($item['access'])) {
    // Administrator will access all menu's.
    if (strpos(current_path(), 'admin/structure/menu/manage/' . $item['menu_name']) === 0 && user_access('administer menu')) {
      return;
    }
    // If userid is equal to menu user id.
    if ($user->uid == 1) {
      $access = 'UNBLOCK';
      break;
    }
   // Block menu.
    else {
      $access = 'BLOCK';
    }
    // Access FALSE if Menu not for USER.
    if ($access == 'BLOCK') {
      $item['access'] = FALSE;
    }
  }
}

Di Drupal 7 saya menyembunyikan / menonaktifkan menu berdasarkan beberapa kondisi seperti ID pengguna.

Demikian pula, saya ingin mengubah tautan menu di Drupal 8. Bagaimana saya bisa mencapainya?


Pada halaman ini jika Anda gulir untuk mengakhiri sebelum komentar, itu telah menyatakan hook_translated_menu_link_alter() has been replaced by hook_menu_link_load(), saya tidak tahu apakah itu benar atau salah, saya baru saja menemukan ini. Mungkin Anda bisa tahu. Jika, beri tahu saya juga.
CodeNext

Jawaban:


0

HOOK_link_alter akan menjadi satu D8 yang setara dengan hook_translated_menu_link_alter:

/**
 * Implements hook_link_alter().
 *
 * @inheritdoc
 */
function HOOK_link_alter(&$variables) {
  $url = $variables['url'];
  // Check url is routed in Drupal.
  if ($url->isRouted()) {
    // Load the current user by user ID.
    $currentUser = User::load(\Drupal::currentUser()->id());
    // Check access.
    $urlAccess = $url->access();
    // Get url options.
    $urlOptions = $url->getOptions();
    // Your code here.
  }
}

Lihat URL Drupal 8 kelas untuk info API lebih lanjut.

Namun, Anda dapat menggunakan Hook_preprocess_HOOK () seperti:

/**
 * Implements hook_preprocess_hook().
 *
 * @inheritdoc
 */
function HOOK_preprocess_menu(&$variables) {
  if (isset($variables['menu_name']) && $variables['menu_name'] === 'menu_name') {
    foreach($variables['items'] as $key => $item) {
      $url = $item['url']->toString();
      if ($url == '/user') {
        // Remove menu item.
        unset($variables['items'][$key]);
      }
    }
  }
}

Hanya memeriksa di pathatas, tetapi ini menunjukkan Anda dapat menyembunyikan item menu tunggal berdasarkan kriteria tertentu.


Untuk pembatasan akses, tergantung pada kebutuhan Anda, Anda mungkin melihat perutean dan izin berdasarkan pada entityalih - alih item menu dan biarkan Drupal menangani tampilan item menu.

Untuk akses menu berdasarkan peran, lihat modul ini: https://www.drupal.org/project/menu_item_role_access


hook_link_alter()tidak dianggap sebagai penggantian hook_translated_menu_link_alter()karena hanya ada beberapa kunci yang dapat diubah, dan kunci akses bukan salah satunya.
kiamlaluno

-1

Dari drupal.org pada / node / 2122241:

Mengubah tautan menu dan menambahkan tautan menu secara dinamis

Item menu yang ditentukan secara statis dapat diubah menggunakan hook_menu_links_discovered_alter () (tetapi perhatikan tidak ada hook_menu_link_discovered (), tautan menu dibuat dari file .yml seperti dijelaskan di atas). Hook ini juga dapat digunakan untuk menambahkan item menu dinamis baru.

Lebih sering, Anda mungkin ingin menggunakan kelas deriver untuk menambahkan plugin tautan menu baru. Sebagai contoh, tautan menu yang disediakan Views ditambahkan dalam views.links.menu.yml, yang menentukan kelas deriver \ Drupal \ views \ Plugin \ Derivative \ ViewsMenuLink.

Terakhir, Anda dapat menggunakan pengelola plugin secara langsung untuk menambah, memperbarui, dan menghapus definisi.

Anda mungkin dapat menggunakan hook_menu_links_discovered_alter untuk skenario Anda.


Sunting: Anda ingin mengedit izin untuk mengakses tautan itu, sehingga secara otomatis tidak muncul di menu.

Baca di drupal.org: / node / 2311427

Drupal 8

Di Drupal 8, Anda dapat mendukung izin dinamis dengan merujuk fungsi yang secara dinamis akan menentukan izin tersebut. Callback ini mendefinisikan izin untuk modul filter inti.

// in filter.permissions.yml


permission_callbacks:
  - Drupal\filter\FilterPermissions::permissions

// in FilterPermissions.php

class FilterPermissions {
  public function permissions() {
    $permissions = [];
    // Generate permissions for each text format. Warn the administrator that any
    // of them are potentially unsafe.
    /** @var \Drupal\filter\FilterFormatInterface[] $formats */
    $formats = $this->entityManager->getStorage('filter_format')->loadByProperties(['status' => TRUE]);
    uasort($formats, 'Drupal\Core\Config\Entity\ConfigEntityBase::sort');
    foreach ($formats as $format) {
      if ($permission = $format->getPermissionName()) {
        $permissions[$permission] = [
          'title' => $this->t('Use the @label text format', ['@url' => $format->url(), '@label' => $format->label()]),
          'description' => String::placeholder($this->t('Warning: This permission may have security implications depending on how the text format is configured.')),
        ];
      }
    }
    return $permissions;
  }
}

Anda juga harus membaca artikel ini https://www.lullabot.com/articles/what-happened-to-hook_menu-in-drupal-8 (gulir ke bawah ke "Kontrol Akses" dan "Hook_Menu_Alter").

Saya harap ini membantu.


1
Sudah mencoba hook_menu_links_discovered_alter ini, tetapi ini tidak berguna untuk menyembunyikan menu. Harap periksa bahwa pengait ini hanya berguna untuk definisi tautan yang akan diubah.
Ajay Reddy

Mengacu pada artikel di atas, saya mencobanya tetapi itu hanya akan memberikan akses ditolak, itu tidak akan menyembunyikan menu.
Ajay Reddy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.