主题联系表格


11

我想在Drupal 8中建立联系表单的主题。我想在表单元素周围放置div(使用bootstrap)。

我还想在某些元素(提交按钮,表单本身)上放置一些类。


2
我建议更详细地描述您的问题,并说您已经尝试过什么。这将显示一些主动性,并帮助其他人给您更好的答案。
Aram Boyajyan 2015年

Answers:


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”,而我的表单的名称为“与我们联系”,该函数的名称是什么?
丹尼尔·德赫斯特2013年

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'],因此它会自动使用,否则您需要通过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传递带有表单的变量。

然后,您必须创建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 '16

@Niklan:对于自定义实体捆绑形式,我遵循了相同的代码。如果我使用{{ form }},它将打印整个表格。但是,如果我使用{{ form.my_field }},则什么都不会显示。知道如何显示自定义实体捆绑形式的每个字段吗?
kalidasan

@kalidasan尝试不打印而打印每个字段{{ form }}。我建议在打印后,{{ form }}所有表单元素都将标记为,'#rendered' => TRUE并且不会很快呈现。如果您不想使用这种主题形式的方法,则必须单独打印每个字段。drupal_render_children()除非您自己编写,否则Drupal 8中没有。无论如何,默认情况下这将导致重复,因此请尝试手动打印每个字段。
Niklan '17

@Niklan:我还没{{ form }} & {{ form.my_field }}在一起。首先仅尝试使用{{ form }},在这里我可以看到整个表格。然后{{ form }}从模板中删除,然后像这样分别为每个表单字段尝试 {{ form.my_field }}, etc ,但有点麻烦。没有显示。
kalidasan

1
@kalidasan,您可以在中取消设置标题template_preprocess_FORM_ID_THEME(&$variables)。在此预处理中,您可以添加新变量,更改包括表单元素在内的现有变量。我从没看过这个{{ form.field_name.widget }}主题,而且经常以主题形式出现。看起来该字段是由第三方模块自定义创建或添加的?我认为这是允许的,但对其他人则不行。我建议您从预处理钩子开始,然后看看$variables['form']它包含的内容。
Niklan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.