Nach dem Update von Drupal 8.7.x auf Drupal 8.8.1 sehen wir auf mehrsprachigen Seiten beim Erstellen von Übersetzungen die Fehlermeldung
Either the path '/node/123' is invalid or you do not have access to it.
Der Fehler tritt bei Administratoren nicht auf, nur eingeschränkte Benutzer - die jedoch die entsprechenden Rechte haben sollten - sind davon betroffen.
In der Drupal Issue Queue gibt es dazu zwei Bug Reports #3107695 im Pathauto Modul bzw. #3101344 im Drupal Core, für die aber noch keine Patches verfügbar sind.
Es gibt aber zum Glück einige Workarounds, bzw. zwei Lösungsansätze, die unkompliziert Abhilfe schaffen, bis das Problem behoben ist.
Workarounds
Ein Workaround dafür ist, dass vor dem Speichern der Übersetzung die Option 'Generate automatic URL alias' deaktiviert und das Feld URL-Alias leer gelassen wird. Nachdem die Übersetzung gespeichert ist, kann die Seite neu bearbeitet und die Option 'Generate automatic URL alias' wieder aktiviert werden. Danach wird der URL-Alias ohne Fehlermeldung gespeichert.
Ein weiterer Workaround, bis die Issue behoben wird, ist, die Permission 'Link to any page' für entsprechende Rollen zu gewähren. Das hat allerdings den "kosmetischen" Nachteil, dass z. B. im Administrationsmenü auch für eingeschränkte Benutzer alle Menüpunkte sichtbar sind. Der Zugriff auf administrative Seiten bleibt aber trotz der sichtbaren Menüpunkte verweigert.
Vorläufige Lösungen
Eine vorläufige Lösung, die bei unseren Multilanguage Sites bislang ohne "Nebenwirkungen" funktioniert, schlägt @Mschudders in der Issue #3101344 vor. Dafür muss in der Datenbank manuell für jede Sprache ein kleiner Eintrag ergänzt werden. In der Issue Queue finden sich dazu auch weitere Lösungsansätze für diesen Fehler.
In der node_access Tabelle einer Drupal 8.7.8 Seite findet man folgenden Eintrag:
mysql> select * from node_access where nid = 0;
+-----+----------+----------+-----+-------+------------+--------------+--------------+
| nid | langcode | fallback | gid | realm | grant_view | grant_update | grant_delete |
+-----+----------+----------+-----+-------+------------+--------------+--------------+
| 0 | | 1 | 0 | all | 1 | 0 | 0 |
+-----+----------+----------+-----+-------+------------+--------------+--------------+
1 row in set (0,00 sec)
Nach dem Update auf 8.8.x fehlt der Eintrag:
mysql> select * from node_access where nid = 0;
Empty set (0,00 sec)
Als Lösung schlägt @Mschudders vor, den Eintrag manuell für jede verfügbare Sprache der Seite zu erstellen. In den Kommentaren zu diesem Fehler liefert er code, der z. B. über Drupal Console ausgeführt werden kann. Manuell über einen MySQL Client können die fehlenden Einträge so erstellt werden. Hier müssen natürlich die entsprechenden Sprachen verwendet werden. In diesem Beispiel Deutsch und Französisch.
INSERT INTO node_access (nid, langcode, fallback, gid, realm, grant_view)
VALUES (0, 'de', 1, 0, 'all', 1);
INSERT INTO node_access (nid, langcode, fallback, gid, realm, grant_view)
VALUES (0, 'fr', 0, 0, 'all', 1);
mysql> select * from node_access where nid = 0;
+-----+----------+----------+-----+-------+------------+--------------+--------------+
| nid | langcode | fallback | gid | realm | grant_view | grant_update | grant_delete |
+-----+----------+----------+-----+-------+------------+--------------+--------------+
| 0 | de | 1 | 0 | all | 1 | 0 | 0 |
| 0 | fr | 0 | 0 | all | 1 | 0 | 0 |
+-----+----------+----------+-----+-------+------------+--------------+--------------+
Ein weiterer Lösungsvorschlag kommt von @rgpublic, der hook_validation_constraint_alter verwendet, um die entsprechenden Berechtigungen zum Speichern des URL-Alias zu gewähren:
function mymodule_validation_constraint_alter(array &$definitions) {
$definitions['ValidPath']=$definitions['NotNull'];
}
In unserem Fall war der Eintrag in der Tabelle node_access die angenehmste Lösung und nachdem wir bislang keine Beschwerden von Redakteuren erhalten haben, scheint sie ohne hässliche Nebeneffekte zu funktionieren.