Drupal Version

10.3.0

Domain module version

2.0.x-dev

Expected Behavior

The user Add/Edit page is loaded and Domain configurations can be configured.

Actual Behavior

Error on User add/edit page
TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in count() (line 79 of modules/contrib/domain/domain/src/DomainElementManager.php).
Error

Steps to reproduce

- Install and enable the module
- Enable Domain Access & Domain content
- Configure the Domain
- Enable the Account form Domain fields
- Add/Edit a user
- Error will be shown

Issue fork domain-3470873

Command icon Show commands

Start within a Git clone of the project using the version control instructions.

Or, if you do not have SSH keys set up on git.drupalcode.org:

Comments

joshua1234511 created an issue. See original summary.

joshua1234511’s picture

Status: Active » Needs review

Submitted a merge request. Ready for review.

dqd’s picture

Status: Needs review » Needs work

The solution is somewhat doubling the condition check and could be more performant by using nested checks:

instead of

// @@ -76,7 +76,8 @@ class DomainElementManager implements DomainElementManagerInterface {

if ((isset($form[$field_name]['widget']['#options']) &&
    count($form[$field_name]['widget']['#options']) === 0)
    ||
    (isset($form[$field_name]['widget']['#options']) &&
    count($form[$field_name]['widget']['#options']) === 1 &&
    isset($form[$field_name]['widget']['#options']['_none']))
) {
  $empty = TRUE;

maybe like:

// @@ -76,7 +76,8 @@ class DomainElementManager implements DomainElementManagerInterface {

if ((isset($form[$field_name]['widget']['#options']) 
    if (count($form[$field_name]['widget']['#options']) === 0)
        ||
        (count($form[$field_name]['widget']['#options']) === 1 &&
        isset($form[$field_name]['widget']['#options']['_none']))
    )
) {
  $empty = TRUE;
amir jamshidi’s picture

I made this condition like this

if ((isset($form[$field_name]['widget']['#options']) &&
         count($form[$field_name]['widget']['#options']) === 0)
        ||
        (isset($form[$field_name]['widget']['#options']) &&
         count($form[$field_name]['widget']['#options']) === 1 &&
         isset($form[$field_name]['widget']['#options']['_none']))
    ) {
      $empty = TRUE;
    } 
seeduardo’s picture

Status: Needs work » Needs review
StatusFileSize
new995 bytes

While I can confirm the code in #5 does work on D10.3, it is simply a repetition of what's in the merge request mentioned in #3. I agree with dqd in #4 that the change could be rewritten, but the code in that comment isn't quite right and would be a breaking change, so I've tweaked it in the patch attached here, which does work for me.

earthday47’s picture

Here's my +1 comment - We are experiencing this issue and I can confirm that the patch in #6 resolves it.

therobyouknow’s picture

I also found #6 https://www.drupal.org/project/domain/issues/3470873#comment-15844907 to work, in that I don't now see that fatal error, the title of this issue "TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in count() (line 79 of modules/contrib/domain/domain/src/DomainElementManager.php)". I needed to clear cache.

Thank you!

However, I get a warning on the node add/edit page: "Warning: Undefined array key "#options" in Drupal\domain\DomainElementManager->setFormOptions() (line 79 of modules/contrib/domain/domain/src/DomainElementManager.php)."

But I can get by. Hope for a fix for the warning (or even to help provide one), when I can.

guiu.rocafort.ferrer’s picture

I managed to reproduce this error when using a "Autocomplete" or "Autocomplete (Tags style)" for the field "Domain Access" in the manage form display configuration for the content type.

Clearly the code does not contemplate the possibility of using those field widgets for this field, so the patches do not fix the root cause of the issue.

guiu.rocafort.ferrer’s picture

Status: Needs review » Needs work
omahm’s picture

Also encountered this with the 'Chosen' module installed and set as the widget for Domain Access/Source.

guiu.rocafort.ferrer’s picture

Issue tags: +Needs tests

The code now checks if the widget is of type checkbox/select, or if the widget is autocomplete.

If the code is checkbox/select, it does the same as before, but with an autocomplete field, it initializes the selection plugin and calls countReferenceableEntities() instead.

Regarding the 'Chosen' module, i have not tried it, but it should not throw an error and just not hide the field if there is no domain available.

the_g_bomb’s picture

MR !133 no longer applies to 2.0.x

divyansh.gupta’s picture

Working on it.

divyansh.gupta’s picture

Status: Needs work » Needs review

Rebased the MR!133 against 2.0.x
Please review.

mably’s picture

Status: Needs review » Needs work

@divyansh.gupta did you have a look at your MR changes before setting it to "Needs review"?

Looks like it's rolling back all the recent updates to the dev branch...

Not sure the rebase was done properly.

divyansh.gupta’s picture

@mably, Sorry but there was problem in previous rebase,
Rebased again properly,
Please review.

mably’s picture

The Gitlab CI warnings and the failing tests need to be fixed

divyansh.gupta’s picture

Solved all PHPUnit errors and other Gitlab-Ci warnings,
Please review.

mably’s picture

Status: Needs work » Reviewed & tested by the community

Seems to work fine here. Thanks!

mably changed the visibility of the branch 2.0.x to hidden.

mably’s picture

Status: Reviewed & tested by the community » Fixed

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.