Рейтинг:-2

После обновления до PHP 8 модуль больше не работает

флаг sg

Я обновил свой Drupal с 8 до 9 и использовал PHP 7.4. Теперь я выбрал время для обновления до PHP 8. Пока все работает, только с самодельным модулем я получаю сообщение об ошибке:

Сайт обнаружил непредвиденную ошибку. Пожалуйста, повторите попытку позже.
Ошибка: попытка присвоить свойству «формат» значение null в функции copy_fields_from_model_contract_node_edit_node_prepare_form() (строка 57 модуля modules/custom/copy_fields_from_model_contract_node_edit/copy_fields_from_model_contract_node_edit.module).

Это касается именно этой строки:

$node->body->format = 'full_html';

Код моего модуля не элегантен, но со своей задачей справился как надо. По сути, я копирую из другого узла содержимое поля body в поле body другого узла. Код всего модуля выглядит так:

<?php

используйте Drupal\node\NodeInterface;
используйте Drupal\Core\Form\FormStateInterface;


/**
* Реализует hook_ENTITY_TYPE_prepare_form() для сущностей узла.
*/
функция copy_fields_from_model_contract_node_edit_node_prepare_form(NodeInterface $node, $operation, FormStateInterface $form_state)
{

//TODO Построить NID в виде массива и выполнить цикл

  $arr_vertraege = массив (6766, 6769, 6768, 6775, 6767, 6776, 6777, 6778, 6779, 6780, 6781, 6782);

  foreach ($arr_vertraege как $mustervertraege) {

    $nid = $mustervertraege;
    $node_storage = \Drupal::entityTypeManager()->getStorage('узел');
    $node = $node_storage->load($nid);

    если ($nid == $mustervertraege) {


      $getcontract = $node->field_vertragsinhalt->значение;
    }

  //TODO работает без ($operation == 'default')

  если ($operation == 'редактировать') {
    /*dpm("Модуль редактирования");*/
    //TODO Всегда должен извлекать текущий узел и nid. Но пока не работает с созданием узла. Ошибка: вызов функции-члена id() при нулевом значении в

    $node = \Drupal::routeMatch()->getParameter('node');
    $nid = $node->id();
    $node_storage = \Drupal::entityTypeManager()->getStorage('узел');
    $node = $node_storage->load($nid);

    если ($node->getType() == 'buch_anlegen') {
      если ($node->field_vertrag_updaten->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[0]) {
          $node->field_vertragsinhalt->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
      если ($node->field_vertrag_updaten_2->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[1]) {
          $node->field_vertragsinhalt_2->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
      если ($node->field_vertrag_updaten_3->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[2]) {
          $node->field_vertragsinhalt_3->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
      если ($node->field_vertrag_updaten_4->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[3]) {
          $node->field_vertragsinhalt_4->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
      если ($node->field_vertrag_updaten_5->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[4]) {
          $node->field_vertragsinhalt_5->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
      если ($node->field_vertrag_updaten_6->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[5]) {
          $node->field_vertragsinhalt_6->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
      если ($node->field_vertrag_updaten_7->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[6]) {
          $node->field_vertragsinhalt_7->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
      если ($node->field_vertrag_updaten_8->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[7]) {
          $node->field_vertragsinhalt_8->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
      если ($node->field_vertrag_updaten_9->значение == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[8]) {
          $node->field_vertragsinhalt_9->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
      если ($node->field_vertrag_updaten_10->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[9]) {
          $node->field_vertragsinhalt_10->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
      если ($node->field_vertrag_updaten_11->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[10]) {
          $node->field_vertragsinhalt_11->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
      если ($node->field_vertrag_updaten_12->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($node);

        если ($mustervertraege == $arr_vertraege[11]) {
          $node->field_vertragsinhalt_12->value = $getcontract;
          $node->body->format = 'full_html';
          // пока не сохраняйте узел, он будет сохранен после отправки
        }
      }
    }
  }
  }
}

У кого-нибудь есть совет для меня? Я буду очень признателен.

Грец Бавра

P.S.: Полное сообщение об ошибке из логов:

Ошибка сообщения: попытка присвоить свойству «формат» значение null в copy_fields_from_model_contract_node_edit_node_prepare_form() (строка 57 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/modules/custom/copy_fields_from_model_contract_node_edit/copy_fields_from_model_contract_node)
#0 [внутренняя функция]: copy_fields_from_model_contract_node_edit_node_prepare_form(Object(Drupal\node\Entity\Node), 'edit', Object(Drupal\Core\Form\FormState))
#1 /home/bavramor/data/Webdesign/Websiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Entity/EntityForm.php(397): call_user_func_array('copy_fields_fro...', Array)
#2 /home/bavramor/data/Webdesign/Websiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Entity/EntityForm.php(129): Drupal\Core\Entity\EntityForm->prepareInvokeAll(' node_prepare_fo...', Объект(Drupal\Core\Form\FormState))
#3 /home/bavramor/data/Webdesign/Websiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Entity/ContentEntityForm.php(287): Drupal\Core\Entity\EntityForm->init(Object (Друпал\Ядро\Форма\ФормСтате))
#4 /home/bavramor/data/Webdesign/Websiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Entity/EntityForm.php(96): Drupal\Core\Entity\ContentEntityForm->init(Object (Друпал\Ядро\Форма\ФормСтате))
#5 [внутренняя функция]: Drupal\Core\Entity\EntityForm->buildForm(Array, Object(Drupal\Core\Form\FormState))
#6 /home/bavramor/data/Webdesign/Websiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Form/FormBuilder.php(531): call_user_func_array(Array, Array)
#7 /home/bavramor/data/Webdesign/Websiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Form/FormBuilder.php(278): Drupal\Core\Form\FormBuilder->retrieveForm(' node_buch_anleg...', Объект(Drupal\Core\Form\FormState))
#8 /home/bavramor/data/Webdesign/Websiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Controller/FormController.php(73): Drupal\Core\Form\FormBuilder->buildForm(Object (Drupal\node\NodeForm), Объект(Drupal\Core\Form\FormState))
#9 [внутренняя функция]: Drupal\Core\Controller\FormController->getContentResult(Object(Symfony\Component\HttpFoundation\Request), Object(Drupal\Core\Routing\RouteMatch))
#10 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(123): call_user_func_array(Array, Array)
#11 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Render/Renderer.php(564): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core \EventSubscriber\{закрытие}()
#12 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(124): Drupal\Core\Render\Renderer->executeInRenderContext(Object (Drupal\Core\Render\RenderContext), Объект(Замыкание))
#13 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(97): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array , Множество)
#14 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/vendor/symfony/http-kernel/HttpKernel.php(158): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{ закрытие}()
#15 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/vendor/symfony/http-kernel/HttpKernel.php(80): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component \HttpFoundation\Request), 1)
#16 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/modules/contrib/redirect_after_login/src/RedirectMiddleware.php(46): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony \Component\HttpFoundation\Request), 1, правда)
#17 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/StackMiddleware/Session.php(58): Drupal\redirect_after_login\RedirectMiddleware->handle(Object(Symfony \Component\HttpFoundation\Request), 1, правда)
#18 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(48): Drupal\Core\StackMiddleware\Session->handle(Object (Symfony\Component\HttpFoundation\Request), 1, правда)
#19 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(106): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object (Symfony\Component\HttpFoundation\Request), 1, правда)
#20 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object (Symfony\Component\HttpFoundation\Request), 1, правда)
#21 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/modules/ban/src/BanMiddleware.php(50): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony \Component\HttpFoundation\Request), 1, правда)
#22 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(48): Drupal\ban\BanMiddleware->handle(Object(Symfony \Component\HttpFoundation\Request), 1, правда)
#23 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(51): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object (Symfony\Component\HttpFoundation\Request), 1, правда)
#24 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony \Component\HttpFoundation\Request), 1, правда)
#25 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/DrupalKernel.php(708): Stack\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation \Запрос), 1, правда)
#26 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
# 27 {основной}
флаг us
Похоже, что поле `body` не существует в типе контента.
флаг ru
Я удивлен, что код когда-либо работал. Вы получаете объект `$node` в хуке (объект как параметр функции означает "по ссылке" в PHP), а затем переназначаете его три раза с... разными вещами. Я очень сомневаюсь, что обновление PHP является причиной этой ошибки, и нулевой безопасный оператор из приведенного ниже ответа может избежать WSOD, но на самом деле не исправит ваш код.
Рейтинг:0
флаг fr

Скорее всего есть узлы, которые не имеют набора кузова, таким образом $узел->тело возвращается ноль.

Поскольку вы используете PHP8, вы можете попробовать нулевой безопасный оператор просто выполнив:

$node->body?->format = 'full_html';

(Обратите пристальное внимание на ?-> оператор, который означает «если ноль, просто прервите цепочку»)

Если у узла, в котором обнаружена проблема, есть тело, обновите вопрос.

Редактировать: Исправлено положение нулевого безопасного оператора в соответствии с комментариями.

флаг cn
Это вызовет ту же ошибку — возможно, вы имели в виду `$node?->body?->format` или `$node->body?->format`?
apaderno avatar
флаг us
@Nick Ошибка: * Попытка присвоить свойству «формат» значение null *. Это означает, что `$node?->body->format` не будет работать. `$node?->body?->format` будет лучшим выбором. В любом случае это не исправит остальную часть кода, показанного в вопросе.
флаг fr
@Clive @apaderno с точки зрения PHP, вы правы; однако, если тело установлено, и это тело Drupal (а не какое-то другое поле с таким же именем), оно всегда имеет свойство «формат» — которое никогда (насколько мне известно) не является «нулевым». Отсюда мое упущение.Пожалуйста, поправьте меня, если есть случаи, когда вышеизложенное не применяется.
флаг cn
_Если тело установлено_ - но ваш ответ для случая, когда тело не установлено, поэтому вы тестируете нуль не на том. Null-safe проверяет элемент слева от оператора, а не справа, поэтому, чтобы проверить, является ли тело нулевым, оно должно быть `body?->format`. Вы также можете проверить узел на значение null на одном дыхании, что тоже имеет смысл, но вы не можете проверить значение null на теле, проверяя значение null на узле.
флаг fr
@Clive понял, спасибо - соответственно изменил ответ.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.