it-swarm-eu.dev

Jak k položce nabídky přidám podmínku přístupu?

Jak mohu přidat nové podmínky k existujícím podmínkám, které určují, zda je položka nabídky viditelná? Tyto podmínky by neměly být omezeny na nastavení oprávnění.

Jako příklad použití (ne nutně důvod této otázky): Předpokládejme, že mám typ obsahu, který uživatelé mohou vytvářet pouze jeden uzel. Mám položku nabídky pro přidání tohoto typu obsahu. Pokud však uživatel již vytvořil uzel tohoto typu obsahu, chci položku skrýt. Moje první myšlenka je spustit dotaz a zkontrolovat existenci uzlu vytvořeného aktuálním uživatelem, který má specifický typ obsahu. Pokud existuje, skryjte položku nabídky.

Myslím, že by tento typ funkce měl jít do hook_menu_alter() a přidat tam potřebnou logiku. Ale nejsem si jistý, jak to udělat bez obcházení existujících kontrol, jako je kontrola, zda má uživatel oprávnění k vytvoření tohoto typu obsahu. Musel bych zahrnout tuto logiku do svého vlastního stavu? Nebo mohu přidat k existující přístupové logice, aniž bych ji přepsal?


Úpravy: Někteří lidé se zdají být zaměřeni na odpověď „jak omezím uživatele na vytvoření jednoho uzlu typu obsahu“. To zde není otázka. Otázkou je, jak do položky nabídky přidat vlastní podmínky přístupu.

17
Chaulky

Musíte přidat zpětné volání přes hook_menu_alter (), a pak v rámci zpětného volání jednoduše provedete logiku a poté vrátíte data přes původní zpětné volání.

Chcete-li mít jistotu, že nepřepíšete žádné další změny hook_menu_alter (), měli byste předat zpětné zpětné volání zpětnému volání prostřednictvím argumentu přístupu.

To je vše teoretické, ale kód by měl jít takto:

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

Hledáte modul Chain Menu Access API .

Chain Menu Access API umožňuje vašemu modulu zřetězit své vlastní funkce přístupu zpětného volání z menu do položek routeru v menu ostatních modulů.

Existuje alespoň jeden příklad on Drupal Exchange Exchange, jak jej používat).

1
crantok

V reakci na výše uvedené komentáře by řešení v D7 bylo použít:

/**
 * 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