Score:-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';

รหัสของโมดูลของฉันไม่สวยงาม แต่ทำงานได้ตามที่ต้องการ โดยทั่วไปฉันคัดลอกเนื้อหาของฟิลด์เนื้อหาจากโหนดอื่นไปยังฟิลด์เนื้อหาของโหนดอื่น รหัสของโมดูลทั้งหมดมีลักษณะดังนี้:

<?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')

  ถ้า ($ การดำเนินการ == 'แก้ไข') {
    /*dpm("Modul แก้ไข");*/
    // TODO จะดึงโหนดปัจจุบันและ nid เสมอ แต่ยังใช้งานไม่ได้กับการสร้างโหนด ข้อผิดพลาด: การโทรไปยังฟังก์ชันสมาชิก id() เป็นโมฆะ

    $node = \Drupal::routeMatch()->getParameter('โหนด');
    $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($โหนด);

        ถ้า ($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($โหนด);

        ถ้า ($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($โหนด);

        ถ้า ($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($โหนด);

        ถ้า ($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($โหนด);

        ถ้า ($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($โหนด);

        ถ้า ($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($โหนด);

        ถ้า ($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($โหนด);

        ถ้า ($mustervertraege == $arr_vertraege[7]) {
          $node->field_vertragsinhalt_8->value = $getcontract;
          $node->body->format = 'full_html';
          // อย่าเพิ่งบันทึกโหนด มันจะบันทึกหลังจากส่ง
        }
      }
      ถ้า ($node->field_vertrag_updaten_9->value == '1') {
        // dpm($node->field_vertrag_updaten->value);
        //var_dump($โหนด);

        ถ้า ($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($โหนด);

        ถ้า ($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($โหนด);

        ถ้า ($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($โหนด);

        ถ้า ($mustervertraege == $arr_vertraege[11]) {
          $node->field_vertragsinhalt_12->value = $getcontract;
          $node->body->format = 'full_html';
          // อย่าเพิ่งบันทึกโหนด มันจะบันทึกหลังจากส่ง
        }
      }
    }
  }
  }
}

ใครมีเคล็ดลับสำหรับฉัน? ฉันจะขอบคุณมาก

สวัสดี Bavra

PS: กรอกข้อความแสดงข้อผิดพลาดจากบันทึก:

ข้อความแสดงข้อผิดพลาด: ความพยายามที่จะกำหนดคุณสมบัติ "รูปแบบ" เป็น 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_edit.module)
#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/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Entity/EntityForm.php(397): call_user_func_array('copy_fields_fro...', อาร์เรย์)
#2 /home/bavramor/data/Webdesign/Webseiten/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/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Entity/ContentEntityForm.php(287): Drupal\Core\Entity\EntityForm->init(Object (Drupal\Core\Form\FormState))
#4 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Entity/EntityForm.php(96): Drupal\Core\Entity\ContentEntityForm->init(Object (Drupal\Core\Form\FormState))
#5 [ฟังก์ชันภายใน]: Drupal\Core\Entity\EntityForm->buildForm(Array, Object(Drupal\Core\Form\FormState))
#6 /home/bavramor/data/Webdesign/Webseiten/landwehrcie-backup-drupal9/web/core/lib/Drupal/Core/Form/FormBuilder.php(531): call_user_func_array(อาร์เรย์, อาร์เรย์)
#7 /home/bavramor/data/Webdesign/Webseiten/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/Webseiten/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(อาร์เรย์, อาร์เรย์)
#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(อาร์เรย์ , อาร์เรย์)
#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 \Request), 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 flag
ดูเหมือนว่าไม่มีฟิลด์ `body` ในประเภทเนื้อหา
ru flag
ฉันประหลาดใจที่รหัสเคยทำงาน คุณได้รับวัตถุ `$node` ใน hook (วัตถุที่เป็นพารามิเตอร์ของฟังก์ชันหมายถึง "โดยการอ้างอิง" ใน PHP) จากนั้นกำหนดใหม่สามครั้งด้วย ... สิ่งที่แตกต่างกัน ฉันสงสัยอย่างมากว่าการอัปเกรด PHP เป็นสาเหตุของข้อผิดพลาดนี้ และตัวดำเนินการที่ปลอดภัยเป็นโมฆะจากคำตอบด้านล่างอาจหลีกเลี่ยง WSOD แต่ไม่สามารถแก้ไขรหัสของคุณได้จริงๆ
Score:0
ธง fr

เป็นไปได้มากว่าจะมีโหนดที่ไม่มีชุดเนื้อหา $node->body ผลตอบแทน โมฆะ.

เนื่องจากใช้ PHP8 คุณสามารถลองใช้ ตัวดำเนินการที่ปลอดภัยเป็นโมฆะ เพียงทำ:

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

(ให้ความสนใจอย่างใกล้ชิดกับ ?-> ตัวดำเนินการซึ่งหมายถึง "ถ้าเป็นโมฆะเพียงแค่ยกเลิกห่วงโซ่" )

หากโหนดที่แสดงปัญหามีเนื้อหา โปรดอัปเดตคำถาม

แก้ไข: แก้ไขตำแหน่งของตัวดำเนินการที่ปลอดภัยเป็นค่าว่างตามความคิดเห็น

cn flag
นั่นจะทำให้เกิดข้อผิดพลาดเดียวกัน - บางทีคุณอาจหมายถึง `$node?->body?->format` หรือ `$node->body?->format`?
apaderno avatar
us flag
@Nick ข้อผิดพลาดคือ *พยายามกำหนดคุณสมบัติ "รูปแบบ" เป็นโมฆะ* ซึ่งหมายความว่า `$node?->body->format` จะไม่ทำงาน `$node?->body?->format` จะเป็นตัวเลือกที่ดีกว่า นั่นจะไม่แก้ไขรหัสที่เหลือที่แสดงในคำถามอยู่ดี
fr flag
@Clive @apaderno จากมุมมองของ PHP คุณพูดถูก อย่างไรก็ตาม หากมีการตั้งค่า body และเป็น Drupal body (ไม่ใช่ฟิลด์อื่นที่มีชื่อเดียวกัน) ก็จะมีคุณสมบัติ `format` เสมอ ซึ่งไม่เคย (ตามความรู้ของฉัน) `null` ดังนั้นการละเว้นของฉันโปรดแก้ไขฉันหากมีกรณีที่ข้างต้นใช้ไม่ได้
cn flag
_หากตั้งค่าเนื้อหาแล้ว_ - แต่คำตอบของคุณคือเมื่อไม่ได้ตั้งค่าเนื้อหา นั่นเป็นสาเหตุที่คุณกำลังทดสอบค่าว่างในสิ่งที่ไม่ถูกต้อง Null-safe ทดสอบรายการทางซ้ายของตัวดำเนินการ ไม่ใช่ทางขวา ดังนั้นในการทดสอบว่า body เป็น null หรือไม่ จะต้องเป็น `body?->format' คุณยังสามารถทดสอบโหนดเพื่อหาค่า Null ได้ด้วยลมหายใจเดียวกัน ซึ่งก็สมเหตุสมผลเช่นกัน แต่คุณไม่สามารถทดสอบค่า Null บนเนื้อความได้ด้วยการทดสอบค่า Null บนโหนด
fr flag
@ ไคลฟ์เข้าใจขอบคุณ - แก้ไขคำตอบตามนั้น

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา