PHP 8.2 - Deprecated function: Drupal\facets\Result\Result::$transliterateDisplayValue

Created on 4 December 2023, 7 months ago
Updated 25 June 2024, 3 days ago

Problem/Motivation

While testing PHP 8.2 compatability on the Drupal 10 build I'm maintaining the dblog produced the following error:

PHP 8.2 explicitly removed this feature:
https://wiki.php.net/rfc/deprecate_dynamic_properties

Deprecated function: Creation of dynamic property Drupal\facets\Result\Result::$transliterateDisplayValue is deprecated in Drupal\facets\Plugin\facets\processor\DisplayValueWidgetOrderProcessor->sortResults() (line 75 of /srv/drupal/docroot/modules/contrib/facets/src/Plugin/facets/processor/DisplayValueWidgetOrderProcessor.php)
#0 /srv/drupal/docroot/core/includes/bootstrap.inc(164): _drupal_error_handler_real()
#1 /srv/drupal/docroot/modules/contrib/facets/src/Plugin/facets/processor/DisplayValueWidgetOrderProcessor.php(75): _drupal_error_handler()
#2 /srv/drupal/docroot/modules/contrib/facets/src/FacetManager/DefaultFacetManager.php(541): Drupal\facets\Plugin\facets\processor\DisplayValueWidgetOrderProcessor->sortResults()
#3 [internal function]: Drupal\facets\FacetManager\DefaultFacetManager->Drupal\facets\FacetManager\{closure}()
#4 /srv/drupal/docroot/modules/contrib/facets/src/FacetManager/DefaultFacetManager.php(538): uasort()
#5 /srv/drupal/docroot/modules/contrib/facets/src/FacetManager/DefaultFacetManager.php(369): Drupal\facets\FacetManager\DefaultFacetManager->sortFacetResults()
#6 /srv/drupal/docroot/modules/contrib/facets/src/FacetManager/DefaultFacetManager.php(420): Drupal\facets\FacetManager\DefaultFacetManager->processBuild()
#7 /srv/drupal/docroot/modules/contrib/facets/src/Plugin/Block/FacetBlock.php(91): Drupal\facets\FacetManager\DefaultFacetManager->build()
#8 /srv/drupal/docroot/modules/contrib/facets_block/src/Plugin/Block/FacetsBlock.php(233): Drupal\facets\Plugin\Block\FacetBlock->build()
#9 /srv/drupal/docroot/modules/contrib/facets_block/src/Plugin/Block/FacetsBlock.php(287): Drupal\facets_block\Plugin\Block\FacetsBlock->buildFacets()
#10 /srv/drupal/docroot/core/modules/block/src/BlockViewBuilder.php(171): Drupal\facets_block\Plugin\Block\FacetsBlock->build()
#11 [internal function]: Drupal\block\BlockViewBuilder::preRender()
#12 /srv/drupal/docroot/core/lib/Drupal/Core/Security/DoTrustedCallbackTrait.php(111): call_user_func_array()
#13 /srv/drupal/docroot/core/lib/Drupal/Core/Render/Renderer.php(797): Drupal\Core\Render\Renderer->doTrustedCallback()
#14 /srv/drupal/docroot/core/lib/Drupal/Core/Render/Renderer.php(386): Drupal\Core\Render\Renderer->doCallback()
#15 /srv/drupal/docroot/core/lib/Drupal/Core/Render/Renderer.php(204): Drupal\Core\Render\Renderer->doRender()
#16 /srv/drupal/docroot/core/lib/Drupal/Core/Render/Renderer.php(160): Drupal\Core\Render\Renderer->render()
#17 /srv/drupal/docroot/core/lib/Drupal/Core/Render/Renderer.php(592): Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}()
#18 /srv/drupal/docroot/core/lib/Drupal/Core/Render/Renderer.php(159): Drupal\Core\Render\Renderer->executeInRenderContext()
#19 /srv/drupal/docroot/core/lib/Drupal/Core/Render/Renderer.php(175): Drupal\Core\Render\Renderer->renderPlain()
#20 /srv/drupal/docroot/core/modules/big_pipe/src/Render/BigPipe.php(693): Drupal\Core\Render\Renderer->renderPlaceholder()
#21 /srv/drupal/docroot/core/modules/big_pipe/src/Render/BigPipe.php(547): Drupal\big_pipe\Render\BigPipe->renderPlaceholder()
#22 /srv/drupal/docroot/core/modules/big_pipe/src/Render/BigPipe.php(305): Drupal\big_pipe\Render\BigPipe->sendPlaceholders()
#23 /srv/drupal/docroot/core/modules/big_pipe/src/Render/BigPipeResponse.php(112): Drupal\big_pipe\Render\BigPipe->sendContent()
#24 /srv/drupal/vendor/symfony/http-foundation/Response.php(423): Drupal\big_pipe\Render\BigPipeResponse->sendContent()
#25 /srv/drupal/docroot/index.php(20): Symfony\Component\HttpFoundation\Response->send()
#26 {main}

Steps to reproduce

When viewing any faceted result set the error is produced per record. Resulting 1000s of errors per page view per visitor!

Proposed resolution

Perhaps reference the work of the team on a similar, yet different issue?
https://www.drupal.org/project/facets/issues/3336646 🐛 PHP 8.2 compatibility for the 2.0.x branch Fixed

Remaining tasks

Restructure the class parameters and get/set functions to suppress the error per record/field?

🐛 Bug report
Status

Postponed: needs info

Version

3.0

Component

Code

Created by

🇺🇸United States emptyvoid

Live updates comments and jobs are added and updated live.
  • PHP 8.2

    The issue particularly affects sites running on PHP version 8.2.0 or later.

Sign in to follow issues

Merge Requests

Comments & Activities

  • Issue created by @emptyvoid
  • 🇺🇸United States emptyvoid

    While technically the listed patch is for the 2.x branch applying it to the 3.x branch suppresses the error.

    https://www.drupal.org/files/issues/2023-01-26/3336646-2.patch

  • Assigned to Mohd Sahzad
  • Issue was unassigned.
  • Status changed to Needs review 7 months ago
  • Open in Jenkins → Open on Drupal.org →
    Core: 10.1.x + Environment: PHP 8.1 & MySQL 8
    last update 7 months ago
    425 pass
  • 🇮🇳India Mohd Sahzad

    I have fixed this issue

  • I'm on
    Drupal Version: 10.2.0
    Facets 2.0.6

    and after updating to
    PHP 8.2.13 (I also tested with PHP 8.3 -> getting the same results as PHP 8.2)

    I got multiple deprecated function messages

    "Deprecated function: Creation of dynamic property Drupal\facets\Result\Result::$transliterateDisplayValue is deprecated in Drupal\facets\Plugin\facets\processor\DisplayValueWidgetOrderProcessor->sortResults() (line 72)..."

    I installed patch fexed-transliterateDisplayValue-15345798.patch
    but did not work - composer update was failing to apply the patch, since the sortResults() function in Facets 2.0.6 version is different than the one in the patch (the "get()" function is not defined)

    This is my current 'sortResults' function defined in "DisplayValueWidgetOrderProcessor"

      /**
       * {@inheritdoc}
       */
      public function sortResults(Result $a, Result $b) {
        // Get the transliterate values only once.
        if (!isset($a->transliterateDisplayValue)) {
          $a->transliterateDisplayValue = $this->transliteration->removeDiacritics($a->getDisplayValue());
        }
        if (!isset($b->transliterateDisplayValue)) {
          $b->transliterateDisplayValue = $this->transliteration->removeDiacritics($b->getDisplayValue());
        }
    
        // Return the sort value.
        if ($a->transliterateDisplayValue == $b->transliterateDisplayValue) {
          return 0;
        }
        return strnatcasecmp($a->transliterateDisplayValue, $b->transliterateDisplayValue);
      }

    so I tweaked the #5 patch (removing the get() function and make it look like:

    -   * {@inheritdoc}
    -   */
    + * {@inheritdoc}
    + */
       public function sortResults(Result $a, Result $b) {
         // Get the transliterate values only once.
    -    if (!isset($a->transliterateDisplayValue)) {
    -      $a->transliterateDisplayValue = $this->transliteration->removeDiacritics($a->getDisplayValue());
    +    $transliterateValueA = $a->transliterateDisplayValue;
    +    if (!$transliterateValueA) {
    +        $transliterateValueA = $this->transliteration->removeDiacritics($a->getDisplayValue());
    +        $a->set('transliterateDisplayValue', $transliterateValueA);
         }
    -    if (!isset($b->transliterateDisplayValue)) {
    -      $b->transliterateDisplayValue = $this->transliteration->removeDiacritics($b->getDisplayValue());
    +
    +    $transliterateValueB = $b->transliterateDisplayValue;
    +    if (!$transliterateValueB) {
    +        $transliterateValueB = $this->transliteration->removeDiacritics($b->getDisplayValue());
    +        $b->set('transliterateDisplayValue', $transliterateValueB);
         }
     
         // Return the sort value.
    -    if ($a->transliterateDisplayValue == $b->transliterateDisplayValue) {
    -      return 0;
    +    if ($transliterateValueA == $transliterateValueB) {
    +        return 0;
         }
    -    return strnatcasecmp($a->transliterateDisplayValue, $b->transliterateDisplayValue);
    +
    +    return strnatcasecmp($transliterateValueA, $transliterateValueB);
       }
     
     }

    by doing so, I was able to successfully install the patch through 'composer update'

    however, this did not fix the deprecated function message; getting

    Deprecated function: Creation of dynamic property Drupal\facets\Result\Result::$transliterateDisplayValue is deprecated in Drupal\facets\Plugin\facets\processor\DisplayValueWidgetOrderProcessor->sortResults() (line 75 ...

  • Open in Jenkins → Open on Drupal.org →
    Core: 10.1.x + Environment: PHP 8.1 & MySQL 8
    last update 6 months ago
    Patch Failed to Apply
  • 🇺🇸United States emptyvoid

    Rerolled for 3 beta 1

  • 🇺🇸United States emptyvoid

    created a new patch with some missing elements for the results class..
    But it looks like I can't upload patches anymore so..

  • Open in Jenkins → Open on Drupal.org →
    Core: 10.2.x + Environment: PHP 8.1 & MySQL 8
    last update 6 months ago
    Patch Failed to Apply
  • Open in Jenkins → Open on Drupal.org →
    Core: 10.2.x + Environment: PHP 8.1 & MySQL 8
    last update 6 months ago
    Patch Failed to Apply
  • 🇺🇸United States emptyvoid

    Re-rolled patch to be based on the root of the module.

  • Open in Jenkins → Open on Drupal.org →
    Core: 10.2.x + Environment: PHP 8.1 & MySQL 8
    last update 6 months ago
    149 pass, 61 fail
  • 🇺🇸United States emptyvoid

    Rerolled based on dev branch

  • The last submitted patch, 12: facets-3-beta-3406085-2024-10-10.patch, failed testing. View results
    - codesniffer_fixes.patch Interdiff of automated coding standards fixes only.

  • 🇪🇸Spain aleix

    Adding new patch with proper CS and resultInterface new methods, for 3.0.0-beta1 .

  • 🇪🇸Spain aleix

    The same as #14 but for 3.0.x

  • Open in Jenkins → Open on Drupal.org →
    Core: 10.2.x + Environment: PHP 8.2 & MySQL 8
    last update 5 months ago
    PHPLint Failed
  • 🇪🇸Spain aleix

    reroll for 3.0.x

  • Open in Jenkins → Open on Drupal.org →
    Core: 10.2.x + Environment: PHP 8.2 & MySQL 8
    last update 5 months ago
    424 pass, 2 fail
  • Open in Jenkins → Open on Drupal.org →
    Core: 10.2.x + Environment: PHP 8.2 & MySQL 8
    last update 5 months ago
    424 pass, 2 fail
  • 🇫🇷France MacSim

    Isn't this issue a duplicate of https://www.drupal.org/project/facets/issues/3336646 🐛 PHP 8.2 compatibility for the 2.0.x branch Fixed ?

  • Updating patch from #14 was getting below error

    Error: Cannot access protected property Drupal\facets\Result\Result::$termWeight in Drupal\facets\Plugin\facets\processor\TermWeightWidgetOrderProcessor->sortResults() (line 91 of modules/contrib/facets/src/Plugin/facets/processor/TermWeightWidgetOrderProcessor.php).

  • Open in Jenkins → Open on Drupal.org →
    Core: 10.2.x + Environment: PHP 8.1 & MariaDB 10.3.22
    last update 4 months ago
    Patch Failed to Apply
  • 🇬🇧United Kingdom fonant

    Patch #18 works for me to stop the watchdog logs filling up with deprecation warnings. Thanks @gurvindersingh!

  • 🇧🇪Belgium borisson_ Mechelen, 🇧🇪

    Hard disagree that this should be changed to setters/getters. Especially if the properties stay public.

    PS: It seems you (like many others – it's really easy to misinterpret) are confused by the "Issue tags" field. As the guidelines state, they aren't meant for free text tags related to the issue, but only for specific categorization purposes, usually by module maintainers.
    So, if you aren't sure your current usage is correct, please just leave the field empty, especially the name of the module is not helpful at all.

    Can we add 2 branches, one for 2.x and one for 3.x?

  • 🇺🇸United States joshmiller Indianapolis, Indiana, USA

    Chiming in here that this error, unnoticed by our team, took down urban.org briefly a few weeks ago when we updated to PHP 8.2.

    Whatever the fix is, we're going to test out this patch, and we will need something to resolve this error.

    How did this take down our elite Pantheon site? It eventually filled up our database with almost 500 GB of watchdog entries with thousands of warnings per record per user.

  • 🇺🇸United States jkwilson

    Following. Same issue after moving to PHP 8.2: watchdog logs filled up the server and briefly took the site down. Have applied patch #18. More thanks @gurvindersingh!

  • 🇹🇭Thailand Nick Hope

    #18 works for me. PHP 8.3.2 (DDEV). Drupal 10.2.6. Facets 3.0.0-beta1.

  • 🇸🇬Singapore clairero

    Patch #18 is works for me too. I'm running Drupal 10.2.4 with PHP 8.2.18. Thanks @gurvindersingh!

  • 🇮🇳India Anita verma

    I am unable to add Facets and facing Deprecated php error. I applied Patch #18 it is works to me. I'm running Drupal 10.2.4 with PHP 8.2.

  • Status changed to Needs review 20 days ago
  • First commit to issue fork.
  • Merge request !218Resolve #3406085 "Result dynamic property 3.x" → (Open) created by heddn
  • Pipeline finished with Failed
    15 days ago
    Total: 639s
    #197331
  • Status changed to Postponed: needs info 3 days ago
  • 🇫🇮Finland sokru

    Isn't this duplicate of 📌 PHP 8.2 compatibility Fixed ? At least based on the issue summary and (failing) MR, this issue should be closed as duplicate.

Production build 0.69.0 2024