Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix accessing an undefined variable #2806

Merged
merged 1 commit into from Mar 3, 2021

Conversation

m-vo
Copy link
Member

@m-vo m-vo commented Feb 25, 2021

Q A
Fixed issues Fixes #...
Docs PR or issue contao/docs#...

Sigh, another one for PHP8.

Fixes

Warning: Undefined array key "breadcrumb"

after clicking on the articles selection in the page tree because the sorting array does not contain breadcrumb.

@m-vo m-vo force-pushed the bugfix/breadcrumb-not-defined branch 3 times, most recently from 247cecb to e5b62be Compare February 25, 2021 18:15
fritzmg
fritzmg previously approved these changes Feb 25, 2021
@bytehead bytehead added the bug label Feb 25, 2021
@bytehead bytehead added this to the 4.11 milestone Feb 25, 2021
@leofeyer leofeyer merged commit 247659f into contao:4.11 Mar 3, 2021
@leofeyer
Copy link
Member

leofeyer commented Mar 3, 2021

Thank you @m-vo.

@leofeyer leofeyer changed the title fix accessing undefined variable Fix accessing an undefined variable Mar 3, 2021
fritzmg pushed a commit to fritzmg/contao that referenced this pull request Mar 4, 2021
Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes #...
| Docs PR or issue | contao/docs#...

Sigh, another one for PHP8.

Fixes 
```
Warning: Undefined array key "breadcrumb"
```
after clicking on the articles selection in the page tree because the `sorting` array does not contain `breadcrumb`.

Commits
-------

36dcf5e fix accessing undefined variable
leofeyer pushed a commit that referenced this pull request Mar 4, 2021
Description
-----------

Fixes #2787 ([thread](https://community.contao.org/de/showthread.php?80310-Internal-Server-Error-beim-Dr%C3%BCcken-auf-quot-Auswahl-%C3%A4ndern-quot-bei-der-Weiterleitungsseite&p=540163&viewfull=1#post540163)):

```
TypeError:
preg_replace(): Argument #3 ($subject) must be of type array|string, null given

  at vendor/contao/core-bundle/src/EventListener/DataContainer/ContentCompositionListener.php:107
  at preg_replace()
     (vendor/contao/core-bundle/src/EventListener/DataContainer/ContentCompositionListener.php:107)
  at Contao\CoreBundle\EventListener\DataContainer\ContentCompositionListener->renderPageArticlesOperation()
     (vendor/contao/core-bundle/src/Resources/contao/classes/DataContainer.php:804)
  at Contao\DataContainer->generateButtons()
     (vendor/contao/core-bundle/src/Resources/contao/drivers/DC_Table.php:4028)
  at Contao\DC_Table->generateTree()
     (vendor/contao/core-bundle/src/Resources/contao/drivers/DC_Table.php:3628)
  at Contao\DC_Table->treeView()
     (vendor/contao/core-bundle/src/Resources/contao/drivers/DC_Table.php:353)
  at Contao\DC_Table->showAll()
     (vendor/contao/core-bundle/src/Resources/contao/classes/Backend.php:644)
  at Contao\Backend->getBackendModule()
     (vendor/contao/core-bundle/src/Resources/contao/controllers/BackendMain.php:167)
  at Contao\BackendMain->run()
     (vendor/contao/core-bundle/src/Controller/BackendController.php:48)
  at Contao\CoreBundle\Controller\BackendController->mainAction()
     (vendor/symfony/http-kernel/HttpKernel.php:158)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw()
     (vendor/symfony/http-kernel/HttpKernel.php:80)
  at Symfony\Component\HttpKernel\HttpKernel->handle()
     (vendor/symfony/http-kernel/Kernel.php:201)
  at Symfony\Component\HttpKernel\Kernel->handle()
     (web/index.php:31)
```

Since `$icon` can specifically be null. Not sure why it would be though in this specific instance, but apparently it can happen.

Commits
-------

1f5fa9d check if icon is null
d3f8425 return empty string if href and icon are missing
a6d128a Merge branch '4.11' into fix-content-composition-listener-if-icon-is-null
7fc3159 Update core-bundle/src/EventListener/DataContainer/ContentCompositionListener.php

Co-authored-by: Leo Feyer <github@contao.org>
69243b6 Correctly merge image size _defaults (see #2783)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | -
| Docs PR or issue | -

Currently defining `formats` under the image size `_defaults` is broken. This is because the processed config values of the individual size definitions already contain an empty `formats` array which then wins in  `array_merge`. This PR fixes this problem by giving the values under `_defaults` precedence over empty arrays.

Unfortunately this case was missing from the tests and went unnoticed (added now)…

Commits
-------

b7b7b60 merge _defaults with precedence over empty arrays
990be33 add reference
af36ec2 Merge branch '4.11' into bugfix/image-size-defaults-empty-arrays
aafb762 Suggest using the contao-setup binary with @php prefix (see #2796)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes #2776 
| Docs PR or issue | -

related contao/managed-edition#57

Commits
-------

b1bd185 suggest using the prefixed contao-setup binary
9cfd8c6 fix accessing undefined variable (see #2806)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes #...
| Docs PR or issue | contao/docs#...

Sigh, another one for PHP8.

Fixes 
```
Warning: Undefined array key "breadcrumb"
```
after clicking on the articles selection in the page tree because the `sorting` array does not contain `breadcrumb`.

Commits
-------

36dcf5e fix accessing undefined variable
fdbc6b8 Correctly sort pages if the URL suffix is empty (see #2784)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes #2775

Apparently, `substr('foo', 0, -0)` is empty 🙈

Commits
-------

502a0e0 Correctly sort pages on empty URL suffix
aa5fe3b Merge branch '4.11' into bugfix/folderurl
f16cbfc Fix accessing Model\Collection instead of Model in ModuleFaqPage (see #2788)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes #2786 
| Docs PR or issue | -

`$figureBuilder->setMetadata($objFaq->getOverwriteMetadata())` was failing because `$objFaq` is a `Model\Collection` instead of a `Model`. To prevent this rather hard to spot error in the future, I adjusted how we're iterating over the results instead.

Commits
-------

ff2f8b9 iterate over FaqModels instead of operating on Model\Collection
c2934f0 Merge branch '4.11' into bugfix/module-faq-model-collection
51107f0 Handle another illegal array access in the tl_page DCA (see #2794)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes -
| Docs PR or issue | -

This fixes `Warning: Undefined array key "root"` coming from `DCTable` line 3669. This also hardens `tl_page#pastePage()` that will receive an incomplete `$row` by the call in line 3678 and would otherwise produce `Warning: Undefined array key "pid"`.

https://github.com/contao/contao/blob/1873bcc9ea728a08ca8755f6e7251d999d7b316b/core-bundle/src/Resources/contao/drivers/DC_Table.php#L3669-L3690

Commits
-------

7e5b39f handle illegal array access
5ff8b5f simplify expression

Co-authored-by: Leo Feyer <github@contao.org>
aaa71e1 Fix the logout handler in Symfony 5 (see #2818)

Description
-----------

This PR fixes the following error in Contao **4.11.0**:

```
TypeError:
Argument 2 passed to Contao\CoreBundle\Security\Logout\LogoutHandler::logout() must be an instance of Symfony\Component\HttpFoundation\Response, null given, called in vendor\symfony\security-bundle\Security\LegacyLogoutHandlerListener.php on line 42

  at vendor\contao\contao\core-bundle\src\Security\Logout\LogoutHandler.php:50
  at Contao\CoreBundle\Security\Logout\LogoutHandler->logout()
     (vendor\symfony\security-bundle\Security\LegacyLogoutHandlerListener.php:42)
  at Symfony\Bundle\SecurityBundle\Security\LegacyLogoutHandlerListener->onLogout()
     (vendor\symfony\event-dispatcher\EventDispatcher.php:270)
  at Symfony\Component\EventDispatcher\EventDispatcher::Symfony\Component\EventDispatcher\{closure}()
     (vendor\symfony\event-dispatcher\EventDispatcher.php:230)
  at Symfony\Component\EventDispatcher\EventDispatcher->callListeners()
     (vendor\symfony\event-dispatcher\EventDispatcher.php:59)
  at Symfony\Component\EventDispatcher\EventDispatcher->dispatch()
     (vendor\symfony\security-http\Firewall\LogoutListener.php:122)
  at Symfony\Component\Security\Http\Firewall\LogoutListener->authenticate()
     (vendor\symfony\security-bundle\Debug\WrappedLazyListener.php:49)
  at Symfony\Bundle\SecurityBundle\Debug\WrappedLazyListener->authenticate()
     (vendor\symfony\security-http\Firewall\AbstractListener.php:26)
  at Symfony\Component\Security\Http\Firewall\AbstractListener->__invoke()
     (vendor\symfony\security-bundle\Debug\TraceableFirewallListener.php:62)
  at Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener->callListeners()
     (vendor\symfony\security-http\Firewall.php:86)
  at Symfony\Component\Security\Http\Firewall->onKernelRequest()
     (vendor\symfony\event-dispatcher\Debug\WrappedListener.php:117)
  at Symfony\Component\EventDispatcher\Debug\WrappedListener->__invoke()
     (vendor\symfony\event-dispatcher\EventDispatcher.php:230)
  at Symfony\Component\EventDispatcher\EventDispatcher->callListeners()
     (vendor\symfony\event-dispatcher\EventDispatcher.php:59)
  at Symfony\Component\EventDispatcher\EventDispatcher->dispatch()
     (vendor\symfony\event-dispatcher\Debug\TraceableEventDispatcher.php:151)
  at Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher->dispatch()
     (vendor\symfony\http-kernel\HttpKernel.php:133)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw()
     (vendor\symfony\http-kernel\HttpKernel.php:79)
  at Symfony\Component\HttpKernel\HttpKernel->handle()
     (vendor\symfony\http-kernel\Kernel.php:195)
  at Symfony\Component\HttpKernel\Kernel->handle()
     (web\index.php:31)
  at require('web\\index.php')
     (web\app.php:4)           
```

**Reproduction**:

1. Create a login form, login page and member.
2. Create a logout page.
3. Log into the front end.
4. Use the link in the menu for the logout.

Apparently the `LogoutEvent` might not contain a `Response` object any more.

Commits
-------

aa5b2e8 fix argument error in Symfony 5
bd06335 Merge branch '4.11' into fix-logout-handler
e1f1e8d Fix an illegal array access in DC_Table when expanding the tree (see #2805)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes #2797 
| Docs PR or issue | -

I split the PR in two commits:
* one that *only* formats the code so that there is any chance of reviewing this:
a1a16fe
* one that applies the fixes:
9bcedb7

(If you want to, I can collapse the whole thing into a oneline-mega-expression again in a third one…)

Commits
-------

a1a16fe format call
9bcedb7 fix illegal array access
2f22b2f collapse expression
01a9a39 Allow passing an array of IDs to User::isMemberOf() (see #2834)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes #2753
| Docs PR or issue | -

To fix #2753 (do not show protected pages in the sitemap if there is no front end user or the user groups do not match), I have adjusted the `User::isMemberOf()` method to also accept an array of group IDs. This allows us to greatly simplify other checks as well:

### Current

```php
$blnFeUserLoggedIn = System::getContainer()->get('contao.security.token_checker')->hasFrontendUser();

while ($objCalendar->next())
{
	if ($objCalendar->protected)
	{
		if (!$blnFeUserLoggedIn || !\is_array($this->User->groups))
		{
			continue;
		}

		$groups = StringUtil::deserialize($objCalendar->groups);

		if (empty($groups) || !\is_array($groups) || \count(array_intersect($groups, $this->User->groups)) < 1)
		{
			continue;
		}
	}

	// …
}
```

### New

```php
$user = null;

if (System::getContainer()->get('contao.security.token_checker')->hasFrontendUser())
{
	$user = FrontendUser::getInstance();
}

while ($objCalendar->next())
{
	if ($objCalendar->protected && (!$user || !$user->isMemberOf(StringUtil::deserialize($objCalendar->groups))))
	{
		continue;
	}

	// …
}
```

Commits
-------

9a924c3 Allow passing an array of IDs to User::isMemberOf()
c5c39ae add some unit tests
2db757c Merge branch '4.11' into fix-content-composition-listener-if-icon-is-null
AlexejKossmann pushed a commit to AlexejKossmann/contao that referenced this pull request Apr 6, 2021
Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes #...
| Docs PR or issue | contao/docs#...

Sigh, another one for PHP8.

Fixes
```
Warning: Undefined array key "breadcrumb"
```
after clicking on the articles selection in the page tree because the `sorting` array does not contain `breadcrumb`.

Commits
-------

36dcf5e fix accessing undefined variable
AlexejKossmann pushed a commit to AlexejKossmann/contao that referenced this pull request Apr 6, 2021
)

Description
-----------

Fixes contao#2787 ([thread](https://community.contao.org/de/showthread.php?80310-Internal-Server-Error-beim-Dr%C3%BCcken-auf-quot-Auswahl-%C3%A4ndern-quot-bei-der-Weiterleitungsseite&p=540163&viewfull=1#post540163)):

```
TypeError:
preg_replace(): Argument contao#3 ($subject) must be of type array|string, null given

  at vendor/contao/core-bundle/src/EventListener/DataContainer/ContentCompositionListener.php:107
  at preg_replace()
     (vendor/contao/core-bundle/src/EventListener/DataContainer/ContentCompositionListener.php:107)
  at Contao\CoreBundle\EventListener\DataContainer\ContentCompositionListener->renderPageArticlesOperation()
     (vendor/contao/core-bundle/src/Resources/contao/classes/DataContainer.php:804)
  at Contao\DataContainer->generateButtons()
     (vendor/contao/core-bundle/src/Resources/contao/drivers/DC_Table.php:4028)
  at Contao\DC_Table->generateTree()
     (vendor/contao/core-bundle/src/Resources/contao/drivers/DC_Table.php:3628)
  at Contao\DC_Table->treeView()
     (vendor/contao/core-bundle/src/Resources/contao/drivers/DC_Table.php:353)
  at Contao\DC_Table->showAll()
     (vendor/contao/core-bundle/src/Resources/contao/classes/Backend.php:644)
  at Contao\Backend->getBackendModule()
     (vendor/contao/core-bundle/src/Resources/contao/controllers/BackendMain.php:167)
  at Contao\BackendMain->run()
     (vendor/contao/core-bundle/src/Controller/BackendController.php:48)
  at Contao\CoreBundle\Controller\BackendController->mainAction()
     (vendor/symfony/http-kernel/HttpKernel.php:158)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw()
     (vendor/symfony/http-kernel/HttpKernel.php:80)
  at Symfony\Component\HttpKernel\HttpKernel->handle()
     (vendor/symfony/http-kernel/Kernel.php:201)
  at Symfony\Component\HttpKernel\Kernel->handle()
     (web/index.php:31)
```

Since `$icon` can specifically be null. Not sure why it would be though in this specific instance, but apparently it can happen.

Commits
-------

1f5fa9d check if icon is null
d3f8425 return empty string if href and icon are missing
a6d128a Merge branch '4.11' into fix-content-composition-listener-if-icon-is-null
7fc3159 Update core-bundle/src/EventListener/DataContainer/ContentCompositionListener.php

Co-authored-by: Leo Feyer <github@contao.org>
69243b6 Correctly merge image size _defaults (see contao#2783)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | -
| Docs PR or issue | -

Currently defining `formats` under the image size `_defaults` is broken. This is because the processed config values of the individual size definitions already contain an empty `formats` array which then wins in  `array_merge`. This PR fixes this problem by giving the values under `_defaults` precedence over empty arrays.

Unfortunately this case was missing from the tests and went unnoticed (added now)…

Commits
-------

b7b7b60 merge _defaults with precedence over empty arrays
990be33 add reference
af36ec2 Merge branch '4.11' into bugfix/image-size-defaults-empty-arrays
aafb762 Suggest using the contao-setup binary with @php prefix (see contao#2796)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes contao#2776
| Docs PR or issue | -

related contao/managed-edition#57

Commits
-------

b1bd185 suggest using the prefixed contao-setup binary
9cfd8c6 fix accessing undefined variable (see contao#2806)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes #...
| Docs PR or issue | contao/docs#...

Sigh, another one for PHP8.

Fixes
```
Warning: Undefined array key "breadcrumb"
```
after clicking on the articles selection in the page tree because the `sorting` array does not contain `breadcrumb`.

Commits
-------

36dcf5e fix accessing undefined variable
fdbc6b8 Correctly sort pages if the URL suffix is empty (see contao#2784)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes contao#2775

Apparently, `substr('foo', 0, -0)` is empty 🙈

Commits
-------

502a0e0 Correctly sort pages on empty URL suffix
aa5fe3b Merge branch '4.11' into bugfix/folderurl
f16cbfc Fix accessing Model\Collection instead of Model in ModuleFaqPage (see contao#2788)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes contao#2786
| Docs PR or issue | -

`$figureBuilder->setMetadata($objFaq->getOverwriteMetadata())` was failing because `$objFaq` is a `Model\Collection` instead of a `Model`. To prevent this rather hard to spot error in the future, I adjusted how we're iterating over the results instead.

Commits
-------

ff2f8b9 iterate over FaqModels instead of operating on Model\Collection
c2934f0 Merge branch '4.11' into bugfix/module-faq-model-collection
51107f0 Handle another illegal array access in the tl_page DCA (see contao#2794)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes -
| Docs PR or issue | -

This fixes `Warning: Undefined array key "root"` coming from `DCTable` line 3669. This also hardens `tl_page#pastePage()` that will receive an incomplete `$row` by the call in line 3678 and would otherwise produce `Warning: Undefined array key "pid"`.

https://github.com/contao/contao/blob/1873bcc9ea728a08ca8755f6e7251d999d7b316b/core-bundle/src/Resources/contao/drivers/DC_Table.php#L3669-L3690

Commits
-------

7e5b39f handle illegal array access
5ff8b5f simplify expression

Co-authored-by: Leo Feyer <github@contao.org>
aaa71e1 Fix the logout handler in Symfony 5 (see contao#2818)

Description
-----------

This PR fixes the following error in Contao **4.11.0**:

```
TypeError:
Argument 2 passed to Contao\CoreBundle\Security\Logout\LogoutHandler::logout() must be an instance of Symfony\Component\HttpFoundation\Response, null given, called in vendor\symfony\security-bundle\Security\LegacyLogoutHandlerListener.php on line 42

  at vendor\contao\contao\core-bundle\src\Security\Logout\LogoutHandler.php:50
  at Contao\CoreBundle\Security\Logout\LogoutHandler->logout()
     (vendor\symfony\security-bundle\Security\LegacyLogoutHandlerListener.php:42)
  at Symfony\Bundle\SecurityBundle\Security\LegacyLogoutHandlerListener->onLogout()
     (vendor\symfony\event-dispatcher\EventDispatcher.php:270)
  at Symfony\Component\EventDispatcher\EventDispatcher::Symfony\Component\EventDispatcher\{closure}()
     (vendor\symfony\event-dispatcher\EventDispatcher.php:230)
  at Symfony\Component\EventDispatcher\EventDispatcher->callListeners()
     (vendor\symfony\event-dispatcher\EventDispatcher.php:59)
  at Symfony\Component\EventDispatcher\EventDispatcher->dispatch()
     (vendor\symfony\security-http\Firewall\LogoutListener.php:122)
  at Symfony\Component\Security\Http\Firewall\LogoutListener->authenticate()
     (vendor\symfony\security-bundle\Debug\WrappedLazyListener.php:49)
  at Symfony\Bundle\SecurityBundle\Debug\WrappedLazyListener->authenticate()
     (vendor\symfony\security-http\Firewall\AbstractListener.php:26)
  at Symfony\Component\Security\Http\Firewall\AbstractListener->__invoke()
     (vendor\symfony\security-bundle\Debug\TraceableFirewallListener.php:62)
  at Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener->callListeners()
     (vendor\symfony\security-http\Firewall.php:86)
  at Symfony\Component\Security\Http\Firewall->onKernelRequest()
     (vendor\symfony\event-dispatcher\Debug\WrappedListener.php:117)
  at Symfony\Component\EventDispatcher\Debug\WrappedListener->__invoke()
     (vendor\symfony\event-dispatcher\EventDispatcher.php:230)
  at Symfony\Component\EventDispatcher\EventDispatcher->callListeners()
     (vendor\symfony\event-dispatcher\EventDispatcher.php:59)
  at Symfony\Component\EventDispatcher\EventDispatcher->dispatch()
     (vendor\symfony\event-dispatcher\Debug\TraceableEventDispatcher.php:151)
  at Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher->dispatch()
     (vendor\symfony\http-kernel\HttpKernel.php:133)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw()
     (vendor\symfony\http-kernel\HttpKernel.php:79)
  at Symfony\Component\HttpKernel\HttpKernel->handle()
     (vendor\symfony\http-kernel\Kernel.php:195)
  at Symfony\Component\HttpKernel\Kernel->handle()
     (web\index.php:31)
  at require('web\\index.php')
     (web\app.php:4)
```

**Reproduction**:

1. Create a login form, login page and member.
2. Create a logout page.
3. Log into the front end.
4. Use the link in the menu for the logout.

Apparently the `LogoutEvent` might not contain a `Response` object any more.

Commits
-------

aa5b2e8 fix argument error in Symfony 5
bd06335 Merge branch '4.11' into fix-logout-handler
e1f1e8d Fix an illegal array access in DC_Table when expanding the tree (see contao#2805)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes contao#2797
| Docs PR or issue | -

I split the PR in two commits:
* one that *only* formats the code so that there is any chance of reviewing this:
contao@a1a16fe
* one that applies the fixes:
contao@9bcedb7

(If you want to, I can collapse the whole thing into a oneline-mega-expression again in a third one…)

Commits
-------

a1a16fe format call
9bcedb7 fix illegal array access
2f22b2f collapse expression
01a9a39 Allow passing an array of IDs to User::isMemberOf() (see contao#2834)

Description
-----------

| Q                | A
| -----------------| ---
| Fixed issues     | Fixes contao#2753
| Docs PR or issue | -

To fix contao#2753 (do not show protected pages in the sitemap if there is no front end user or the user groups do not match), I have adjusted the `User::isMemberOf()` method to also accept an array of group IDs. This allows us to greatly simplify other checks as well:

### Current

```php
$blnFeUserLoggedIn = System::getContainer()->get('contao.security.token_checker')->hasFrontendUser();

while ($objCalendar->next())
{
	if ($objCalendar->protected)
	{
		if (!$blnFeUserLoggedIn || !\is_array($this->User->groups))
		{
			continue;
		}

		$groups = StringUtil::deserialize($objCalendar->groups);

		if (empty($groups) || !\is_array($groups) || \count(array_intersect($groups, $this->User->groups)) < 1)
		{
			continue;
		}
	}

	// …
}
```

### New

```php
$user = null;

if (System::getContainer()->get('contao.security.token_checker')->hasFrontendUser())
{
	$user = FrontendUser::getInstance();
}

while ($objCalendar->next())
{
	if ($objCalendar->protected && (!$user || !$user->isMemberOf(StringUtil::deserialize($objCalendar->groups))))
	{
		continue;
	}

	// …
}
```

Commits
-------

9a924c3 Allow passing an array of IDs to User::isMemberOf()
c5c39ae add some unit tests
2db757c Merge branch '4.11' into fix-content-composition-listener-if-icon-is-null
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants