Updated Guzzle Client 6 to 7.
Updated text now Australian platform is no longer available.
This is a duplicate of 📌 Drupal 11 Compatibility Active which has some actual work done on it.
@quietone I've just tested this on Drupal 11.0.9 and can confirm the problem exists there too.
Actually setting the status to Active rather than Needs work as explicitly requested by @quietone in #54
Reopening.
Here is a video showing the issue starting from a Standard install of 10.3.9 on SimplyTest.me
If we address the PHPCS issue and folks falling foul of this confirm it works, let's get it merged and in a release - it's been hanging around long enough!
Thanks @davidwhthomas!
MR!21 is showing PHPCS failures so putting back to needs work.
https://git.drupalcode.org/issue/views_ef_fieldset-2497845/-/jobs/3481155
We came across this converting a site to multilingual - we had a limit in services.yml for /jsonapi/* routes but not /cy/jsonapi/*.
This patch fixes that issue.
(we're going to add a limit for the other language anway).
Thanks everyone!
This looks good, moving to RTBC and adding credit
@viniciusrp can you please update the merge request instead of posting patches? That will run the CI.
@viniciusrp can you please update the merge request instead of posting patches? That will run the CI.
You're welcome @evilargest! Thanks for checking and letting me know 💙
Further to #10, in Drupal Slack #support channel, @godotislate pointed me towards \Drupal\views\Plugin\views\filter\LanguageFilter::access(), which is what stops the langcode exposed filter from showing.
Apologies, current MR conflicts with 8.x-1.x HEAD
@evilargest can you confirm if this is still an issue with the latest 8.x-1.x please?
Apologies - merge request now conflicts with HEAD of 8.x-1.x.
Marking as needs work as question in #6 unanswered, and patches should now be converted to merge requests.
Apologies, patch in #10 no longer applies.
Whilst I'm not opposed to the code quality improvements in this patch, they should be addressed in their own separate issues rather than here where reasonably practical.
Can you confirm if this is still an issue on HEAD of 8.x-1.x please?
These docblocks have now been removed elsewhere.
Apologies, MR now conflicts.
Thanks for all your work everyone 💙
Thanks everyone for your work on this. Let's convert the patch to a merge request.
The way I recreated the bug was just by using the standard profile and using views_ef_fieldset on it.
The langcode filter on that form, even though set to exposed, does not show on that form. Whilst this makes functional sense, I don't know the mechanism by which it is hidden at the moment.
It isn't represented in $form['#info']['filter-langcode'] in views_ef_fieldset_form_views_exposed_form_alter() the unlike all the other exposed filters. The alter function assumes it is, hence the PHP warning.
It would be interesting to know if this can happen with other exposed filters, but if it can, the fix in the MR should still work.
I think the fix in MR16 is the right fix, but it has been superseded by some of the recent code quality changes.
I managed to reliably recreate this on Drupal 11.0.5 PHP 8.3 in ddev with the following view
uuid: 9ed39921-eb39-45c8-9025-86ea582d1cca
langcode: en
status: true
dependencies:
module:
- node
- user
_core:
default_config_hash: d7p-wwJZ_Wmz1gnvla9jDtRsjOaWAhPoIoW9w3vo4R4
id: content
label: Content
module: node
description: 'Find and manage content.'
tag: default
base_table: node_field_data
base_field: nid
display:
default:
id: default
display_title: Default
display_plugin: default
position: 0
display_options:
title: Content
fields:
node_bulk_form:
id: node_bulk_form
table: node
field: node_bulk_form
entity_type: node
plugin_id: node_bulk_form
label: ''
exclude: false
alter:
alter_text: false
element_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
title:
id: title
table: node_field_data
field: title
entity_type: node
entity_field: title
plugin_id: field
label: Title
exclude: false
alter:
alter_text: false
element_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
type: string
settings:
link_to_entity: true
type:
id: type
table: node_field_data
field: type
relationship: none
group_type: group
admin_label: ''
entity_type: node
entity_field: type
plugin_id: field
label: 'Content type'
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
click_sort_column: target_id
type: entity_reference_label
settings:
link: false
group_column: target_id
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
name:
id: name
table: users_field_data
field: name
relationship: uid
entity_type: user
entity_field: name
plugin_id: field
label: Author
exclude: false
alter:
alter_text: false
element_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
type: user_name
status:
id: status
table: node_field_data
field: status
entity_type: node
entity_field: status
plugin_id: field
label: Status
exclude: false
alter:
alter_text: false
element_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
type: boolean
settings:
format: custom
format_custom_false: Unpublished
format_custom_true: Published
changed:
id: changed
table: node_field_data
field: changed
entity_type: node
entity_field: changed
plugin_id: field
label: Updated
exclude: false
alter:
alter_text: false
element_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
type: timestamp
settings:
date_format: short
custom_date_format: ''
timezone: ''
tooltip:
date_format: long
custom_date_format: ''
time_diff:
enabled: false
future_format: '@interval hence'
past_format: '@interval ago'
granularity: 2
refresh: 60
langcode:
id: langcode
table: node_field_data
field: langcode
relationship: none
group_type: group
admin_label: ''
entity_type: node
entity_field: langcode
plugin_id: field_language
label: Language
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
click_sort_column: value
type: language
settings:
link_to_entity: false
native_language: false
group_column: value
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
operations:
id: operations
table: node
field: operations
relationship: none
group_type: group
admin_label: ''
plugin_id: entity_operations
label: Operations
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
destination: true
pager:
type: full
options:
pagination_heading_level: h4
items_per_page: 50
tags:
next: 'Next ›'
previous: '‹ Previous'
first: '« First'
last: 'Last »'
exposed_form:
type: basic
options:
submit_button: Filter
reset_button: true
reset_button_label: Reset
exposed_sorts_label: 'Sort by'
expose_sort_order: true
sort_asc_label: Asc
sort_desc_label: Desc
access:
type: perm
options:
perm: 'access content overview'
cache:
type: tag
empty:
area_text_custom:
id: area_text_custom
table: views
field: area_text_custom
plugin_id: text_custom
empty: true
content: 'No content available.'
sorts: { }
arguments: { }
filters:
title:
id: title
table: node_field_data
field: title
relationship: none
group_type: group
admin_label: ''
entity_type: node
entity_field: title
plugin_id: string
operator: contains
value: ''
group: 1
exposed: true
expose:
operator_id: title_op
label: Title
description: ''
use_operator: false
operator: title_op
operator_limit_selection: false
operator_list: { }
identifier: title
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
anonymous: '0'
administrator: '0'
is_grouped: false
group_info:
label: ''
description: ''
identifier: ''
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items: { }
type:
id: type
table: node_field_data
field: type
relationship: none
group_type: group
admin_label: ''
entity_type: node
entity_field: type
plugin_id: bundle
operator: in
value: { }
group: 1
exposed: true
expose:
operator_id: type_op
label: 'Content type'
description: ''
use_operator: false
operator: type_op
operator_limit_selection: false
operator_list: { }
identifier: type
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
anonymous: '0'
administrator: '0'
reduce: false
is_grouped: false
group_info:
label: ''
description: ''
identifier: ''
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items: { }
status:
id: status
table: node_field_data
field: status
relationship: none
group_type: group
admin_label: ''
entity_type: node
entity_field: status
plugin_id: boolean
operator: '='
value: '1'
group: 1
exposed: true
expose:
operator_id: ''
label: Status
description: ''
use_operator: false
operator: status_op
operator_limit_selection: false
operator_list: { }
identifier: status
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
is_grouped: true
group_info:
label: 'Published status'
description: ''
identifier: status
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items:
1:
title: Published
operator: '='
value: '1'
2:
title: Unpublished
operator: '='
value: '0'
langcode:
id: langcode
table: node_field_data
field: langcode
relationship: none
group_type: group
admin_label: ''
entity_type: node
entity_field: langcode
plugin_id: language
operator: in
value: { }
group: 1
exposed: true
expose:
operator_id: langcode_op
label: Language
description: ''
use_operator: false
operator: langcode_op
operator_limit_selection: false
operator_list: { }
identifier: langcode
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
anonymous: '0'
administrator: '0'
reduce: false
is_grouped: false
group_info:
label: ''
description: ''
identifier: ''
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items: { }
status_extra:
id: status_extra
table: node_field_data
field: status_extra
entity_type: node
plugin_id: node_status
operator: '='
value: false
group: 1
expose:
operator_limit_selection: false
operator_list: { }
filter_groups:
operator: AND
groups:
1: AND
style:
type: table
options:
grouping: { }
row_class: ''
default_row_class: true
columns:
node_bulk_form: node_bulk_form
title: title
type: type
name: name
status: status
changed: changed
edit_node: edit_node
delete_node: delete_node
dropbutton: dropbutton
timestamp: title
default: changed
info:
node_bulk_form:
align: ''
separator: ''
empty_column: false
responsive: ''
title:
sortable: true
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: ''
type:
sortable: true
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: ''
name:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: priority-low
status:
sortable: true
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: ''
changed:
sortable: true
default_sort_order: desc
align: ''
separator: ''
empty_column: false
responsive: priority-low
edit_node:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: ''
delete_node:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: ''
dropbutton:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: ''
timestamp:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: ''
override: true
sticky: true
summary: ''
empty_table: true
caption: ''
description: ''
row:
type: fields
query:
type: views_query
relationships:
uid:
id: uid
table: node_field_data
field: uid
admin_label: author
plugin_id: standard
required: true
show_admin_links: false
display_extenders: { }
cache_metadata:
max-age: 0
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- url.query_args
- user
- 'user.node_grants:view'
- user.permissions
tags: { }
page_1:
id: page_1
display_title: Page
display_plugin: page
position: 1
display_options:
display_extenders:
views_ef_fieldset:
views_ef_fieldset:
enabled: true
options:
sort:
root:
container_type: details
depth: '0'
description: ''
id: root
open: true
pid: ''
title: Filters
type: container
weight: '0'
title:
depth: '1'
id: title
pid: root
type: filter
weight: '-10'
type:
depth: '1'
id: type
pid: root
type: filter
weight: '-10'
status:
depth: '1'
id: status
pid: root
type: filter
weight: '-10'
langcode:
depth: '1'
id: langcode
pid: root
type: filter
weight: '-10'
container-0:
container_type: details
depth: '1'
description: ''
id: container-0
open: false
pid: root
title: 'Container 0'
type: container
weight: '-9'
submit:
depth: '2'
id: submit
pid: container-0
type: buttons
weight: '-11'
container-1:
container_type: details
depth: '1'
description: ''
id: container-1
open: false
pid: root
title: 'Container 1'
type: container
weight: '-8'
container-2:
container_type: details
depth: '1'
description: ''
id: container-2
open: false
pid: root
title: 'Container 2'
type: container
weight: '-7'
container-3:
container_type: details
depth: '1'
description: ''
id: container-3
open: false
pid: root
title: 'Container 3'
type: container
weight: '-6'
container-4:
container_type: details
depth: '1'
description: ''
id: container-4
open: false
pid: root
title: 'Container 4'
type: container
weight: '-5'
path: admin/content/node
menu:
type: 'default tab'
title: Content
description: ''
weight: -10
menu_name: admin
context: ''
tab_options:
type: normal
title: Content
description: 'Find and manage content'
weight: -10
menu_name: admin
cache_metadata:
max-age: 0
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- url.query_args
- user
- 'user.node_grants:view'
- user.permissions
tags: { }
After importing this and visiting
I'm reopening this because I think we need to take a pragmatic approach here.
Without adding $context to the FlysystemBridge class, we will continue to fill our logs up with PHP warnings on PHP 8.2 and later.
As @adam-vessey says in #6, the best place to fix this is upstream in the twistor/FlysystemStreamWrapper. However, the PR raised on that project has not had any response from the maintainers, and has no commits since 2019. I think it's wise to proceed on the assumption that will never be merged.
I appreciate we can add twistor/flysystem-stream-wrapper as an explicit package and then patch as outlined by @gold in #7 but that has the drawback that if flysystem is removed from a project later, twistor/flysystem-stream-wrapper has to be manually removed, which could be missed.
The argument to patch upstream is moot if that patch will never be accepted upstream.
Therefore I've opened a pull request to to add $context to this module's FlysystemBridge class. Note this is a different solution to the patch in #2, for the reasons discussed in #6.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
7.x branch is no longer supported so closing as won't fix.
Closing because coding standards are being addressed on the 8.x branch in 📌 Use GitlabCI Active , and given the last release of the 7.x branch was in 2015 I think we should mark it as unsupported.
All CI now passes.
I would very much appreciate any review/manual testing from other users of this module. The automated tests are currently somewhat limited.
CI is now passing again with the exception of PHPStan, which is complaining about the following
------ -----------------------------------------------------------------------
Line src/ArrayDataItemIterator.php
------ -----------------------------------------------------------------------
18 Return type mixed of method
Drupal\views_ef_fieldset\ArrayDataItemIterator::getChildren() is not
covariant with tentative return type RecursiveIterator|null of method
RecursiveIterator::getChildren().
💡 Make it covariant, or use the #[\ReturnTypeWillChange] attribute
to temporarily suppress the error.
30 Return type mixed of method
Drupal\views_ef_fieldset\ArrayDataItemIterator::hasChildren() is not
covariant with tentative return type bool of method
RecursiveIterator::hasChildren().
💡 Make it covariant, or use the #[\ReturnTypeWillChange] attribute
to temporarily suppress the error.
------ -----------------------------------------------------------------------
The pipeline did pass a year ago, but rerunning it now results in failure at the build stage.
https://git.drupalcode.org/project/views_ef_fieldset/-/jobs/3058636
Running the tests locally shows deprecation warnings on Drupal 11 but not 10:
❰elliot.ward❙~/code/d11test/d11❱✔≻ ddev exec phpunit -c web/core/phpunit.xml.dist web/modules/contrib/jsonapi_filter_cache_tags/
HTML output directory sites/simpletest/browser_output is not a writable directory.
PHPUnit 10.5.36 by Sebastian Bergmann and contributors.
Runtime: PHP 8.3.8
Configuration: /var/www/html/web/core/phpunit.xml.dist
DD 2 / 2 (100%)
Time: 00:12.613, Memory: 4.00 MB
2 tests triggered 1 deprecation:
1) /var/www/html/vendor/symfony/error-handler/DebugClassLoader.php:341
Method "Symfony\Component\EventDispatcher\EventSubscriberInterface::getSubscribedEvents()" might add "array" as a native return type declaration in the future. Do the same in implementation "Drupal\jsonapi_filter_cache_tags\EventSubscriber\ResponseSubscriber" now to avoid errors or add an explicit @return annotation to suppress this message.
Triggered by:
* Drupal\Tests\jsonapi_filter_cache_tags\Functional\JsonApiFilterCacheTagsTest::testCacheTagCheckSums
/var/www/html/web/modules/contrib/jsonapi_filter_cache_tags/tests/src/Functional/JsonApiFilterCacheTagsTest.php:142
* Drupal\Tests\jsonapi_filter_cache_tags\Functional\JsonApiFilterCacheTagsTest::testCacheTagHeaders
/var/www/html/web/modules/contrib/jsonapi_filter_cache_tags/tests/src/Functional/JsonApiFilterCacheTagsTest.php:163
testNodeExemptedByIpAddress() now works locally but not in CI.
Also, phpunit is mandatory, but phpunit (next major) is not. We should consider making it so.
Further work needed.
- testNodeExemptedByPath() works locally but not on CI.
- testNodeExemptedByIpAddress() does not work at all - need a way to predict the IP address that a call to drupalGet() in a browser test will be received from, so we can put it in the maintenance exempt config.
OK, this was due to an actual bug in the module, see commit https://git.drupalcode.org/project/maintenance_exempt/-/commit/2db4a3c32...
Adding more tests.
Further work is needed - tests do not yet add exemptions.
It's also unclear why setting site into maintenance mode, then calling $this->assertSession() causes the tests to fail with the following issue
1) Drupal\Tests\maintenance_exempt\Functional\ExemptionsTest::testNodesNotAccessible
Exception: Deprecated function: preg_quote(): Passing null to parameter #1 ($str) of type string is deprecated
Drupal\Core\Path\PathMatcher->matchPath()() (Line: 82)
/var/www/html/web/core/lib/Drupal/Core/Test/HttpClientMiddleware/TestHttpClientMiddleware.php:55
/var/www/html/vendor/guzzlehttp/promises/src/Promise.php:209
/var/www/html/vendor/guzzlehttp/promises/src/Promise.php:158
/var/www/html/vendor/guzzlehttp/promises/src/TaskQueue.php:52
/var/www/html/vendor/guzzlehttp/promises/src/Promise.php:251
/var/www/html/vendor/guzzlehttp/promises/src/Promise.php:227
/var/www/html/vendor/guzzlehttp/promises/src/Promise.php:272
/var/www/html/vendor/guzzlehttp/promises/src/Promise.php:229
/var/www/html/vendor/guzzlehttp/promises/src/Promise.php:69
/var/www/html/vendor/guzzlehttp/guzzle/src/Client.php:189
/var/www/html/web/core/tests/Drupal/Tests/DrupalTestBrowser.php:139
/var/www/html/vendor/symfony/browser-kit/AbstractBrowser.php:369
/var/www/html/vendor/behat/mink-browserkit-driver/src/BrowserKitDriver.php:122
/var/www/html/vendor/behat/mink/src/Session.php:175
/var/www/html/web/core/tests/Drupal/Tests/UiHelperTrait.php:275
/var/www/html/web/modules/contrib/maintenance_exempt/tests/src/Functional/ExemptionsTest.php:86
ERRORS!
Tests: 2, Assertions: 8, Errors: 1.
Everything compliant and mandatory.
Have discussed with @malcomio and agreed that aiming for compliance is the correct approach for this module rather than turning PHPStan/CSpell off.
Just need to actually test these changes now.
PHPStan issues also fixed.
Cspell now passes. PHPStan still to do.
Awesome - that's merged in. Let's get the two widget issues complete, update the documentation and get a new release out!
The following needs addressing:
- Gitlab is running against D9/D10 - needs D11 and not D9
- Cspell doesn't like all the test data
- There are minor PHPCS issues
- Tests fail in a weird way
This also seems to work with the additions to jsonapi_reference_field_widget_info_alter in ✨ Add select list widget Needs work and #3314975: Add radio buttons widget → .
This MR does that
https://git.drupalcode.org/project/jsonapi_reference/-/merge_requests/25
I think this is probably a good idea. Let's give it a try.
I have reverted the change directly on the 2.0.x branch.
Agrre that validation via pagination is prohibitive.
Let's back this out for now so we can release an alpha supporting Drupal 11.