ธีมแบบฟอร์มการติดต่อ


11

ฉันต้องการธีมของแบบฟอร์มการติดต่อใน Drupal 8 ฉันต้องการใส่ div รอบองค์ประกอบของแบบฟอร์ม (โดยใช้ bootstrap)

ฉันต้องการใส่บางคลาสในองค์ประกอบบางอย่าง (ปุ่มส่ง, ฟอร์มเอง)


2
ฉันขอแนะนำให้อธิบายปัญหาของคุณในรายละเอียดเพิ่มเติมและบอกสิ่งที่คุณได้ลองไปแล้ว ที่จะแสดงความคิดริเริ่มและช่วยให้ผู้อื่นตอบคุณได้ดีขึ้น
Aram Boyajyan

คำตอบ:


16

เปิดไฟล์ YOURTHEMENAME.theme ของคุณและเพิ่มรหัสต่อไปนี้:

function YOURTHEMENAME_form_contact_message_feedback_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {

  // Name
  $form['name']['#prefix'] = '<div class="row"><div class="col-md-6"><div class="form-group">';
  $form['name']['#suffix'] = '</div>';
  $form['name']['#attributes']['placeholder'][] = $form['name']['#title'].'*';
  $form['name']['#attributes']['class'][] = 'form-control';
  unset($form['name']['#title']);

  // Mail
  $form['mail']['#prefix'] = '<div class="form-group">';
  $form['mail']['#suffix'] = '</div>';
  $form['mail']['#attributes']['placeholder'][] = $form['mail']['#title'].'*';
  $form['mail']['#attributes']['class'][] = 'form-control';
  unset($form['mail']['#title']);


  // Subject
  $form['subject']['widget'][0]['value']['#attributes']['class'][] = 'form-control';
  $form['subject']['widget'][0]['value']['#attributes']['placeholder'][] = $form['subject']['widget'][0]['#title'].'*';
  $form['subject']['widget'][0]['#title'] = '';
  unset($form['subject']['widget'][0]['value']['#title']);
  $form['subject']['widget'][0]['#prefix'] = '<div class="form-group">';
  $form['subject']['widget'][0]['#suffix'] = '</div></div>';

  // Message
  $form['message']['widget'][0]['value']['#attributes']['class'][] = 'form-control';
  $form['message']['widget'][0]['value']['#attributes']['placeholder'][] = $form['message']['widget'][0]['#title'].'*';
  $form['message']['widget'][0]['#title'] = '';
  unset($form['message']['widget'][0]['value']['#title']);
  $form['message']['widget'][0]['#prefix'] = '<div class="col-md-6"><div class="form-group">';
  $form['message']['widget'][0]['#suffix'] = '</div></div></div>';

  // Submit
  $form['actions']['#prefix'] = '<div class="clearfix">';
  $form['actions']['#suffix'] = '</div>';
  $form['actions']['submit']['#attributes']['class'][] = 'btn';
  $form['actions']['submit']['#attributes']['class'][] = 'btn-success';
  $form['actions']['submit']['#attributes']['class'][] = 'pull-right';

}

และนี่คือผลลัพธ์ของคุณ: ป้อนคำอธิบายรูปภาพที่นี่

อย่าลืมล้างแคชของคุณ;)


1
หากชุดรูปแบบของฉันชื่อ 'abc' และแบบฟอร์มชื่อ 'ติดต่อเรา' ฉันจะตั้งชื่อฟังก์ชันอย่างไร
Daniel Dewhurst

3
{themename} _form_contact_message_ {formname} _form_alter
Johan Haest

มันยอดเยี่ยมมาก !!!
ipwa

20

คุณสามารถธีมทุกรูปแบบตามที่คุณต้องการ ฉันไม่ชอบวิธีการโดย @rpayanm เพราะมันยากที่จะดูแลและอ่านยากด้วยรูปแบบขนาดใหญ่นี่ไม่ใช่กรณีเพียงเสื้อคลุมเดียวและโครงสร้างที่เรียบง่าย

ทุกรูปแบบที่พยายามใช้ธีมเท่ากับชื่อเครื่อง คุณสามารถค้นหาชื่อเทมเพลตนี้ได้$form['#theme']โดยเพียงแค่แก้ไขมันเสมอ (หรือในเวลาส่วนใหญ่) เหมือนกับชื่อเครื่อง id ของแบบฟอร์ม สิ่งที่คุณต้องทำคือลงทะเบียนเทมเพลตสำหรับมัน hook_theme()คุณจำเป็นต้องใช้ คุณสามารถเขียนมันใน CUSTOMMODULE.module หรือใน THEMENAME.theme ชุดรูปแบบคีย์จะต้องเหมือนกับใน$form['#theme']ดังนั้นจึงใช้โดยอัตโนมัติมิฉะนั้นคุณต้องเพิ่มใหม่ผ่านการแก้ไขแบบฟอร์ม

/**
 * Implements hook_theme().
 */
function MODULENAME_theme($existing, $type, $theme, $path) {
  return [
    'FORM_ID_THEME' => [
      'template' => 'custom-form-template-name',
      'render element' => 'form',
    ]
  ];
}

Drupal pass ตัวแปร $ form พร้อมด้วย form

จากนั้นคุณต้องสร้างcustom-form-template-name.html.twig(ด้วยชื่อเทมเพลตของคุณจาก hook_theme ())

แม่แบบที่น้อยที่สุดคือ

{{ form }}

คุณยังสามารถพิมพ์ทุกฟิลด์จากฟอร์มที่คุณต้องการ

{{ form.field_name }}

ที่นี่คุณสามารถทำสิ่งที่คุณต้องการด้วยมาร์กอัป

นอกจากนี้คุณยังสามารถส่งข้อมูลเพิ่มเติมไปยังแม่แบบโดยการใช้งาน template_preprocess_TEMPALTENAME

function template_preprocess_FORM_ID_THEME(&$variables) {
  $variables['example'] = 'This is added via preprocess';
}

แล้วใช้ในเทมเพลต

{{ example }}
<div class="first-field">
  {{ form.first_field }}
</div>

<div class="second-field">
  {{ form.second_field }}
</div>

<div class="buttons">
  {{ form.submit }}
  {{ form.preview }}
</div>
{#
Don't forget to add printing form special info at the end.
Without this data form will not working propertly.
#}
{{ form.form_build_id }}
{{ form.form_token }}
{{ form.form_id }}

ฉันคิดว่าวิธีนี้ยืดหยุ่นกว่าสะอาดและมีประสิทธิภาพมากกว่า

Ps ขอโทษสำหรับภาษาอังกฤษของฉันหวังว่าจะมีคนแก้ไขและแก้ไขข้อผิดพลาดของฉัน :)

ตัวอย่างของรูปแบบที่ซับซ้อนโดยใช้วิธีนี้

ป้อนคำอธิบายรูปภาพที่นี่


2
โปรดทราบว่าสำหรับฉันฉันได้เปลี่ยน{{ form.submit }}เป็น{{ form.actions.submit }}
mikeDOTexe

@Niklan: ฉันได้ติดตามโค้ดข้างต้นสำหรับฟอร์มบันเดิลเอนทิตีที่กำหนดเองของฉันแล้ว ถ้าฉันใช้{{ form }}มันจะพิมพ์แบบฟอร์มทั้งหมด แต่ถ้าฉันใช้ฟิลด์เฉพาะเช่น{{ form.my_field }}ไม่มีอะไรแสดง แนวคิดใดที่เราจะแสดงแต่ละฟิลด์ของฟอร์มบันเดิลเอนทิตีแบบกำหนดเองได้
kalidasan

@kalidasan {{ form }}พยายามที่จะพิมพ์ทุกสาขาโดยไม่ต้องพิมพ์ ฉันแนะนำหลังจากพิมพ์{{ form }}องค์ประกอบของแบบฟอร์มทั้งหมดจะถูกทำเครื่องหมายเป็น'#rendered' => TRUEและจะไม่ถูกแสดงในไม่ช้า หากคุณไม่ต้องการใช้วิธีการแบบฟอร์มชุดรูปแบบนี้คุณต้องพิมพ์ทุกฟิลด์เป็นรายบุคคล ไม่มีdrupal_render_children()ใน Drupal 8 เว้นแต่คุณจะเขียนด้วยตัวเอง อย่างไรก็ตามค่าเริ่มต้นจะทำให้เกิดรายการซ้ำดังนั้นลองพิมพ์แต่ละฟิลด์ด้วยตนเอง
Niklan

@ นิกลัน: ฉันไม่ได้ใช้{{ form }} & {{ form.my_field }}ด้วยกัน ความพยายามครั้งแรกกับเพียง{{ form }}ที่นี่ฉันสามารถเห็นทั้งฟอร์ม จากนั้นนำออก{{ form }}จากเทมเพลตจากนั้นลองใช้กับแต่ละเขตข้อมูลแบบแยกกันเช่นนี้ {{ form.my_field }}, etc แต่จะไม่มีการนำออกวาง ไม่มีอะไรแสดง
kalidasan

1
@kalidasan คุณสามารถยกเลิกการตั้งชื่อหนังสือtemplate_preprocess_FORM_ID_THEME(&$variables)ได้ ใน preprocess นี้คุณสามารถเพิ่มตัวแปรใหม่เปลี่ยนที่มีอยู่รวมทั้งองค์ประกอบของแบบฟอร์ม ฉันไม่เคยเห็นสิ่งนี้{{ form.field_name.widget }}มาก่อน ดูเหมือนว่าฟิลด์นี้จะถูกสร้างหรือเพิ่มเองโดยโมดูลบุคคลที่สาม? ฉันคิดว่านี่ใช้ได้ แต่ไม่ใช่กฎสำหรับคนอื่น ฉันขอแนะนำให้คุณเริ่มต้นด้วยเบ็ดกระบวนการก่อนและเพียงแค่ดู$variables['form']สิ่งที่มันมีอยู่ภายใน
Niklan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.