Score:0

แสดงฟิลด์ที่ส่งของแบบฟอร์มไปยังอีเมลพร้อมชื่อเรื่อง + ค่า

ธง in

ฉันมีรูปแบบที่ค่อนข้างซับซ้อนตาม \Drupal\Core\Form\FormBase ที่มีหลายช่อง (ซ้อนบางส่วน) และต้องการส่งเนื้อหาทั้งหมดในอีเมลเมื่อส่ง

ปัจจุบันฉันมี

ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state)
{

   foreach ($form_state->getValues() เป็น $key => $value) {
     ถ้า (!empty($form[$key]['#title']) && $key != 'images') {
       $values[$form[$key]['#title']->render()] = $value;
     }
   }
...
# ต่อไปฉันจะจัดรูปแบบอาร์เรย์ $values ​​เป็นรายการ HTML

นี่จะแสดงเฉพาะฟิลด์ที่ระดับบนสุดของแบบฟอร์ม แต่ฉันมีฟิลด์ภายในกลุ่ม

มีวิธีที่ดีและสะอาดในการแสดงค่าของฟิลด์ทั้งหมดหรือไม่ หรือฉันต้องวนซ้ำและแยกวิเคราะห์ด้วยตนเองผ่าน $รูปแบบ อาร์เรย์?

ฉันสามารถใช้ตัวเรนเดอร์สำหรับสิ่งนี้ได้ไหม

แก้ไข:

ฟังก์ชันสาธารณะ buildForm (อาร์เรย์ $form, FormStateInterface $form_state) {


    // ...

    $แบบฟอร์ม['บริษัท'] = [
        '#type' => 'คอนเทนเนอร์',
    ];

    $แบบฟอร์ม['บริษัท']['ชื่อบริษัท'] = [
        '#type' => 'ช่องข้อความ',
        '#title' => $this->t('ชื่อบริษัท'),
    ];

โดยสรุป:

ฉันจะวนซ้ำฟิลด์ทั้งหมด รวมถึงฟิลด์ที่อยู่ในคอนเทนเนอร์และรับค่า + ป้ายกำกับ (ไม่ใช่เฉพาะชื่อทางเทคนิค) ได้อย่างไร มีตัวช่วยดีๆ สำหรับสิ่งนี้ไหม หรือฉันต้องทำเองทั้งหมด?

apaderno avatar
us flag
รหัสนั้นจะใช้งานไม่ได้และไม่สมเหตุสมผล ทำไมคุณต้องใช้ `$form[$key]['#title']` เพื่อเข้าถึงค่าใน `$form_state` นอกจากนี้ เนื่องจาก `$form[$key]['#title']` เป็นสตริง จึงไม่ใช้วิธี `render()` ใดๆ
apaderno avatar
us flag
นอกจากนี้ยังจะช่วยให้เห็นรหัสสร้างแบบฟอร์ม ยังไม่ชัดเจนว่าคุณหมายถึงอะไรโดย *groups* และถ้า *fields* หมายถึง *องค์ประกอบของแบบฟอร์ม*
in flag
รหัสใช้งานได้ในขณะนี้ #title เป็นวัตถุ ฉันเชื่อว่าเป็นเพราะแบบฟอร์มถูกสร้างขึ้นแล้ว ปัญหาเดียวของฉันคือการวนซ้ำองค์ประกอบแบบฟอร์มทั้งหมด เนื่องจากองค์ประกอบเหล่านี้ซ้อนกันเป็นกลุ่ม ฉันเพิ่มโค้ดตัวอย่างวิธีสร้างอาร์เรย์ $form เริ่มต้น
apaderno avatar
us flag
หากไม่เห็นองค์ประกอบฟอร์มทั้งหมด คุณจะไม่สามารถเข้าใจความหมายของ *groups* ได้ สำหรับรหัสที่แสดง ก็เพียงพอแล้วที่จะใช้ `'nameofcompany'` ไม่ใช่สิ่งที่ส่งคืนโดย `$this->t('Name of Company')` คุณมี `$values['nameofcompany']` แล้ว; คุณไม่จำเป็นต้องตั้งค่า `$values[$this->t('Name of Company')]` เป็นค่าเดียวกัน
in flag
ฉันต้องการป้ายกำกับ ไม่ใช่ชื่อภายใน
in flag
ฉันได้แก้ไขคำถามแล้ว - ด้วยกลุ่ม ฉันหมายถึงคอนเทนเนอร์ ดูโค้ดตัวอย่าง สิ่งนี้ทำให้ชัดเจนยิ่งขึ้นหรือไม่? แจ้งให้เราทราบหากคุณมีคำถาม
in flag
@apaderno ฉันโพสต์คำตอบ ... แต่ฉันสงสัยว่ามีวิธีที่ดีกว่า - ไม่ใช่ระดับต่ำ
Score:0
ธง in

นี่คือสิ่งที่ฉันคิดขึ้นมา ฉันแค่สงสัยว่ามีวิธีที่หรูหรากว่าการแยกวิเคราะห์ "ระดับต่ำ" นี้หรือไม่

/**
 * ส่งคืนอาร์เรย์ที่มีป้ายกำกับเป็นคีย์ ส่งค่าเป็นค่าตามรูปแบบเดิม
 *
 * @param FormStateInterface $form_state
 * @return อาร์เรย์
 */
ฟังก์ชันส่วนตัว createLabelsWithValues ​​(FormStateInterface $form_state): อาร์เรย์ {
  $form = $form_state->getCompleteForm();
  $result = $this->iterateAndAddValues($form, $form_state);
  ส่งคืนผลลัพธ์ $;
}

/**
 * วนซ้ำแบบฟอร์มหรือคอนเทนเนอร์และเพิ่มค่า
 */
ฟังก์ชันส่วนตัว iterateAndAddValues ​​(อาร์เรย์ $formOrContainer, FormStateInterface $form_state, อาร์เรย์ $result = []) {
  foreach ($formOrContainer เป็น $key => $องค์ประกอบ) {
    ถ้า ($key[0] === '#' || $key === 'form_build_id' || $key === 'form_id' || $key === 'submit') {
      ดำเนินต่อ;
    }
    ถ้า ($element['#type'] === 'container' || $element['#type'] === 'fieldset') {
      $result = $this->iterateAndAddValues($องค์ประกอบ, $form_state, $result);
      ดำเนินต่อ;
    }

    ถ้า ($value = $form_state->getValue($key)) {
      $result[(string)$element['#title']] = $value;
    }
  }

  ส่งคืนผลลัพธ์ $;
}

โพสต์คำตอบ

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