it-swarm-tr.com

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

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.

Bu tür işlevsellik hook_menu_alter() girmeli ve gerekli mantığı oraya eklemeliyim. 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 etmem gerekir mi? 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.

16
Chaulky

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şkeni üzerinden 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);
}
11
Decipher

Zincir Menüsü Erişim API'sı 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.

Nasıl kullanılacağı konusunda en az bir örnek on Drupal Stack Exchange) vardır.

1
crantok

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
Dave Reid