it-swarm.com.de

In hook_node_access erlaubte Kraft

Gibt es eine Möglichkeit, den zulässigen Knotenzugriff zu erzwingen, wenn sich in einem anderen Modul ein Hook befindet, der ihn als verboten markiert?

Ich habe ein benutzerdefiniertes Modul, in dem ich hook_node_access implementiere. Die Rückgabe ist zulässig, wenn bestimmte Bedingungen zutreffen. Das Ergebnis wird jedoch von einem Contrib-Modul überschrieben, das den Knotenzugriff auf "Verboten" setzt.

Kann ich mein Ergebnis erzwingen?

4
José Trindade

Die einzige Möglichkeit, dies zu beheben, bestand darin, zu verhindern, dass der in Konflikt stehende Hook ausgeführt wird:

function myModule_module_implements_alter(&$implementations, $hook) {

    if ($hook == 'node_access') {

      unset($implementations['conflicting_module']); // Not any more
    }
}

Da es nützliche Funktionen enthält, führe ich es in meinem eigenen Code aus, falls meine Bedingungen für "Zulässig" nicht zutreffen:

function myModule_node_access(NodeInterface $node, $op, AccountInterface $account) {

  if ($account->isAuthenticated() and myConditionIsTrue()) {

      return AccessResult::allowed();
  }

  // Run removed hook

  if (function_exists('conflicting_module_node_access')) {

    return conflicting_module_node_access($node, $op, $account);
  }

  return AccessResult::neutral();
}

Dies ist weniger als ideal und ich würde eine Alternative bevorzugen.

3
José Trindade

Ich glaube, es ist am besten, die Konfliktimplementierung desselben Hooks nicht zu entfernen (es sei denn, Sie brauchen das WIRKLICH und Sie wissen, was Sie tun). Stattdessen können Sie der Drupal-Dokumentation von hook_module_implements_alter folgen und Ihren Hook an das Ende der Implementierungsliste verschieben, um den Konflikt zu überschreiben und ihn überhaupt nicht zu ignorieren.

function YOURMODULENAME_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'node_access') {

    // Move my module implementation of node_access to the end of the list.
    // \Drupal::moduleHandler()->getImplementations()
    // iterates through $implementations with a foreach loop which PHP iterates
    // in the order that the items were added, so to move an item to the end of
    // the array, we remove it and then add it.
    $group = $implementations['YOURMODULENAME'];
    unset($implementations['YOURMODULENAME']);
    $implementations['YOURMODULENAME'] = $group;
  }
}
0
Saud Alfadhli