연락처 양식 테마


11

Drupal 8에서 연락처 양식을 테마로하고 싶습니다. 부트 스트랩을 사용하여 양식 요소 주위에 div를 넣고 싶습니다.

또한 특정 요소 (제출 버튼, 양식 자체)에 클래스를 추가하고 싶습니다.


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'이고 폼의 이름이 'contact us'인 경우 함수의 이름은 무엇입니까?
Daniel Dewhurst 2016 년

3
{themename} _form_contact_message_ {formname} _form_alter
Johan Haest

정말 대단해 !!!
ipwa

20

원하는 방식으로 모든 양식을 간단하게 테마로 지정할 수 있습니다. 나는 @rpayanm의 방법을 좋아하지 않으며, 유지하기가 어렵고 읽기가 어렵습니다.

테마를 사용하려는 모든 양식은 시스템 이름과 같습니다. 이 템플릿 이름은 $form['#theme']alter만으로 찾을 수 있으며 양식 ID 시스템 이름과 항상 (또는 대부분의 경우) 동일합니다. 당신이해야 할 일은 템플릿을 등록하는 것입니다. 구현해야합니다 hook_theme(). CUSTOMMODULE.module 또는 THEMENAME.theme에 작성할 수 있습니다. 테마 키는의 키와 동일해야 $form['#theme']하므로 자동으로 사용합니다. 그렇지 않으면 form alter를 통해 새 키를 추가해야합니다.

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

Drupal은 $ form 변수를 form과 함께 전달합니다.

그런 다음 custom-form-template-name.html.twighook_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()당신이 스스로를 작성하지 않는 한, 드루팔 8. 어쨌든 기본적으로 중복이 발생하므로 각 필드를 수동으로 인쇄하십시오.
Niklan

@ Niklan : 나는 {{ form }} & {{ form.my_field }}함께 사용하지 않았습니다 . 처음으로 시도했지만 {{ form }}여기에서 전체 양식을 볼 수 있습니다. 그런 다음 {{ form }}템플릿에서 제거 한 다음 이와 같이 각 양식 필드를 별도로 시도 {{ form.my_field }}, etc 했지만 dint는 출력합니다. 아무것도 표시되지 않습니다.
kalidasan

1
@kalidasan에서 제목을 설정 해제 할 수 있습니다 template_preprocess_FORM_ID_THEME(&$variables). 이 사전 프로세스에서 새 변수를 추가하고 양식 요소를 포함하여 기존 변수를 변경할 수 있습니다. 나는 이것을 본 적이 없으며 {{ form.field_name.widget }}종종 주제를 형성합니다. 이 필드는 타사 모듈에서 사용자 정의하거나 추가 한 것 같습니다. 나는 이것이 허용되지만 다른 사람들에게는 규칙이 아니라고 생각합니다. 사전 프로세스 후크로 시작하여 $variables['form']내부 에 무엇이 들어 있는지 확인하는 것이 좋습니다 .
Niklan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.