Skip to content

Commit 34919d6

Browse files
committed
Issue #3017812 by ibustos, joachim: Language selector is immune to hook_entity_field_access in entity forms
(cherry picked from commit f6674fa)
1 parent e070b9c commit 34919d6

File tree

6 files changed

+94
-1
lines changed

6 files changed

+94
-1
lines changed

modules/language/language.module

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ function language_form_alter(&$form, FormStateInterface $form_state) {
381381
$entity = $form_object->getEntity();
382382
$entity_type = $entity->getEntityType();
383383
$langcode_key = $entity_type->getKey('langcode');
384-
if (isset($form[$langcode_key])) {
384+
if (isset($form[$langcode_key]) && $form[$langcode_key]['#access'] !== FALSE) {
385385
$language_configuration = ContentLanguageSettings::loadByEntityTypeBundle($entity->getEntityTypeId(), $entity->bundle());
386386
$form[$langcode_key]['#access'] = $language_configuration->isLanguageAlterable();
387387
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
langcode: en
2+
status: true
3+
dependencies:
4+
config:
5+
- node.type.page
6+
id: node.page
7+
target_entity_type_id: node
8+
target_bundle: page
9+
default_langcode: site_default
10+
language_alterable: true
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
langcode: en
2+
status: true
3+
dependencies: { }
4+
name: page
5+
type: page
6+
description: ''
7+
help: ''
8+
new_revision: false
9+
preview_mode: 1
10+
display_submitted: false
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
name: 'Language entity field access test'
2+
type: module
3+
description: 'Support module for verifying entity field access and the language selector.'
4+
core: 8.x
5+
package: Testing
6+
version: VERSION
7+
dependencies:
8+
- drupal:node
9+
- drupal:text
10+
- drupal:field
11+
- drupal:filter
12+
- drupal:language
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
/**
4+
* @file
5+
* Hook implementations for language_entity_field_access_test.
6+
*/
7+
8+
use Drupal\Core\Access\AccessResult;
9+
use Drupal\Core\Field\FieldDefinitionInterface;
10+
use Drupal\Core\Field\FieldItemListInterface;
11+
use Drupal\Core\Session\AccountInterface;
12+
13+
/**
14+
* Implements hook_entity_field_access().
15+
*/
16+
function language_entity_field_access_test_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) {
17+
return AccessResult::forbidden();
18+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace Drupal\Tests\language\Functional;
4+
5+
use Drupal\Tests\BrowserTestBase;
6+
7+
/**
8+
* Tests language picker compatibility with hook_entity_field_access.
9+
*
10+
* @group language
11+
*/
12+
class LanguageEntityFieldAccessHookTest extends BrowserTestBase {
13+
14+
/**
15+
* Modules to enable.
16+
*
17+
* @var array
18+
*/
19+
public static $modules = [
20+
'node',
21+
'text',
22+
'field',
23+
'filter',
24+
'language',
25+
'language_entity_field_access_test',
26+
];
27+
28+
/**
29+
* Tests compatibility with hook_entity_field_access().
30+
*/
31+
public function testHookEntityFieldAccess() {
32+
// Create an admin user and do the login.
33+
$user = $this->drupalCreateUser([], NULL, TRUE);
34+
$this->drupalLogin($user);
35+
36+
// Assess the field is not visible.
37+
$this->drupalGet('node/add/page');
38+
$this->assertSession()->fieldNotExists('langcode[0][value]');
39+
40+
$this->drupalLogout();
41+
}
42+
43+
}

0 commit comments

Comments
 (0)