Bir menü öğesine nasıl erişim koşulu eklerim?


17

Bir menü öğesinin görünür olup olmadığını belirleyen mevcut koşulların üstüne nasıl yeni koşullar ekleyebilirim? Bu koşullar izin ayarlarıyla sınırlı olmamalıdır.

Örnek olarak kullanım örneği (bu sorunun nedeni olmayabilir): Kullanıcıların yalnızca bir düğüm oluşturmasına izin verilen bir içerik türüm olduğunu varsayalım. Bu tür içerik eklemek için bir menü öğem var. Ancak kullanıcı bu içerik türünden bir düğüm oluşturduysa, menü öğesini gizlemek istiyorum. İlk düşüncem, geçerli kullanıcı tarafından oluşturulan ve belirli içerik türünde olan bir düğümün varlığını kontrol etmek için bir sorgu çalıştırmaktır. Varsa, menü öğesini gizleyin.

Ben bu tür işlevsellik içine girmek hook_menu_alter()ve orada gerekli mantığı eklemek gerektiğini düşünüyorum . Ancak, kullanıcının bu tür içerik oluşturma izinlerine sahip olup olmadığını kontrol etmek gibi mevcut kontrolleri atlamadan bunu nasıl yapacağımdan emin değilim. Bu mantığı kendi durumuma dahil etmek zorunda mıyım? Veya üzerine yazmadan mevcut erişim mantığına ekleyebilir miyim?


Düzenleme: Bazı kişiler "bir kullanıcıyı içerik türünün bir düğümünü oluşturmakla nasıl sınırlandırabilirim?" Burada soru bu değil. Soru, bir menü öğesine özel erişim koşullarının nasıl ekleneceğidir.

Yanıtlar:


11

Yapmanız gereken geri çağrınızı hook_menu_alter () ile eklemektir ve daha sonra geri çağrınızın içinde mantığınızı yaparsınız ve ardından verileri orijinal geri çağrı ile döndürürsünüz.

Diğer hook_menu_alter () değişikliklerinin üzerine yazmadığınızdan emin olmak için, önceki bağımsız aramayı erişim bağımsız değişkeniyle geri aramanıza iletmeniz gerekir.

Bunların hepsi teorik, ancak kod şu şekilde olmalıdır:

MYMODULE_menu_alter(&$items) {
  $items['menu']['access arguments'] = array_merge(array($items['menu']['access callback']), $item['menu']['access arguments']);
  $items['menu']['access callback'] = 'MYMODULE_access_callback';
}

MYMODULE_access_callback() {
  $args = func_get_args();

  // Do Stuff.
  if ($something == FALSE) {
    return FALSE;
  }

  $function = array_shift($args);
  return call_user_func_array($function, $args);
}

yeni bir erişim geri arama işlevi atarsam, bu kesinlikle orijinal geri aramanın üzerine yazılır mı?
Chaulky

Evet, menü öğesi başına yalnızca bir erişim geri araması yapabilirsiniz, bu nedenle orijinal geri aramaya geri döndüğünüzden emin olun. Bunun gibi bir şey yapan bir modül gördüm, ağır modüllerin izinlerinden biri, hangisinin olduğunu hatırlayamıyorum.
deşifre

array_shift $ $ args ne yapıyor?
Chaulky

İlk argümanı, eski 'erişim geri çağrısı' yaptığımız 'erişim argümanlarından' çıkarır. Yani eski geri arama 'MYMODULE2_access_callback' ise, array_shift bunu döndürür. Ayrıca, yalnızca geri aramanın beklediği bağımsız değişkenleri iletebilmemiz için diziden kaldırır.
deşifre

1

Yukarıdaki yorumlara yanıt olarak, D7'deki çözüm aşağıdakileri kullanmak olacaktır:

/**
 * Implements hook_node_access().
 */
function mymodule_node_access($node, $op, $account) {
  $type = is_string($node) ? $node : $node->type;

  if ($op == 'create' && $type == 'mynodetype' && db_query("SELECT 1 FROM {node} WHERE type = :type AND uid = :uid", array(':type' => $type, ':uid' => $account->uid))->fetchField()) {
    // If the user has already created a node of a specific type, they cannot
    // create any more.
    return NODE_ACCESS_DENY;
  }

  // Otherwise do not affect any node access.
  return NODE_ACCESS_IGNORE;
}

1
Bunun menü öğeleriyle bir ilgisi yok gibi görünüyor. Henüz D7'ye çok aşina değilim, ancak bu düğüm oluşturma işlemine özgü gibi görünüyor. Soru genel olarak menü öğelerine odaklanıyor.
Chaulky

Anlıyorum ... Bu, cevabınızda Düğüm Sınırı modülüne işaret eden D7 çözümünüz hakkında daha fazla ayrıntı isteyen yorumuma yanıt olarak. Hala konu biraz, ama takdir.
Chaulky

Çünkü mynodetype oluşturma bağlantılarının görünürlüğü, Drupal 7'de bu kancayı çağıracak olan node_access () işlevi tarafından kontrol edilir.
Dave Reid

1

Zincir Menüsü Erişimi API modülünü arıyorsunuz .

Zincir Menüsü Erişim API'si modülünüzün kendi menü erişimi geri arama işlevlerini diğer modüllerin menü yönlendirici girişlerine zincirlemesine olanak tanır.

Drupal Stack Exchange'de nasıl kullanılacağına dair en az bir örnek var.


-1

Seçeneklerden biri, içerik türünüz için içerik izni olan yeni bir rol oluşturmak olabilir. Bir kullanıcı bu tür bir düğüm oluşturduktan sonra, bu rolü kaldırın ve artık daha fazla oluşturamazlar.


-1

Belki Düğüm Sınırı modülünü denemelisiniz .

Proje sayfasından:

Düğüm Sınırı modülü yöneticilerin, rollerin veya kullanıcıların oluşturabileceği belirli bir türün düğüm sayısını kısıtlamasına olanak tanır. Örneğin, bir sitenin "reklam" düğümleri oluşturabilen bir "Reklamveren" rolü varsa, düğüm sınırı yöneticisi bu roldeki tüm kullanıcıları belirli sayıda düğümle kısıtlayabilir. Kullanıcıları kullanıcı bazında da kısıtlayabilir.


Bir düğüme sınırlama, özel erişim geri arama yöntemi eklemek için örnek bir kullanım örneğidir. Ayrıca, Düğüm Sınırı menü öğesini kaldırmaz, yalnızca kullanıcının bu içerik türünün başka bir düğümünü eklemesini önler.
Chaulky

Modül açıklamasına tekrar baktığım için bu doğru. Bu Drupal 7'de olsaydı, node tipi bağlantısının kendisinin görünürlüğünü etkileyecek hook_node_access ($ node, 'create', $ account) kullanabileceğinizden aslında kolay olurdu.
Dave Reid

İlginç. Yakında D7'ye taşınmayı planlıyorum. daha ayrıntılı bir şekilde yazıp bir cevap göndermeyi düşünür müsünüz?
Chaulky

Cevabın D7 sürümü gönderildi.
Dave Reid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.