Yoast / Yoast-SEO-for-TYPO3

Yoast SEO plugin for TYPO3
Other
51 stars 56 forks source link

Display of page snippet does not take TYPO3_USER_SETTINGS into account #577

Open sorenmalling opened 2 months ago

sorenmalling commented 2 months ago

Please give us a description of what happened.

The YoastUtility method snippetPreviewEnabled https://github.com/Yoast/Yoast-SEO-for-TYPO3/blob/c1e4ae93d7de523696a5d94cad19154237813e27/Classes/Utility/YoastUtility.php#L51 does not take the default value of the TYPO3_USER_SETTINGS hideYoastInPageModule into account and expect that snippet is enabled.

Please describe what you expected to happen and why.

I'd expect the utility to take the default value into account in the condition, so it first checko the uc of the user and fallback to the default value

        if ((bool)($GLOBALS['BE_USER']->uc['hideYoastInPageModule'] ?? !($GLOBALS['TYPO3_USER_SETTINGS']['hideYoastInPageModule']['columns']['default'])) {
            return false;
        }

And set a default value in ext_tables.php for backward compability

How can we reproduce this behavior?

  1. Set a default value for hideYoastInPageModule to true
  2. Set the UI of the User Settings reflect that value
  3. Find that the snippet is still shown, because it's not saved to the uc field, untill the user clicks save

Technical info

sorenmalling commented 2 months ago

To solve it, we implemented this with usage of the AfterUserLoggedInEvent:

<?php

namespace OwnVendorName\YoastSeo\EventListener;

use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
use TYPO3\CMS\Core\Authentication\Event\AfterUserLoggedInEvent;

final class HideYoastPreviewByDefault
{
    public function __invoke(AfterUserLoggedInEvent $event): void
    {
        if (
            $event->getUser() instanceof BackendUserAuthentication
        ) {
            $settingSet = $event->getUser()->uc['hideYoastInPageModule'] ?? false;
            if ($settingSet === false) {
                $event->getUser()->uc['hideYoastInPageModule'] = true;
                $event->getUser()->writeUC();
            }
        }
    }
}