在表单元素的div包装器上更改类


11

有没有一种方法可以使用表单api向表单包装器(div)添加或更改类?

还是仅使用主题功能即可完成?

如果是这样,则使用哪个主题功能来改变它?


我很确定这是一个主题功能。问题是要使用哪个主题功能。:)
akalata 2011年

啊,你就在那里。
chrisjlee 2011年

我想你也可以使用#attribute键定义一个类
米卡A.

@MikaA。这仅适用于<input>标签,我想更改包装器的类(<div>)。
chrisjlee 2011年

Answers:


5

theme_form_element()如果要全局更改主题,则可以正常覆盖。如果您只想修改一个特定的表单元素,那么我知道有两种选择。

  1. 您可以为感兴趣的特定类型的表单元素(例如,文本字段)注册新的主题功能。然后,您可以创建此主题函数(基于原始主题,例如theme_textfield()),但不会theme('form_element', ...)在最后调用(您可以在一个主题函数中处理包装器和元素,也可以制作单独的包装器主题函数并使用它)。最后,将#theme属性添加到特定的form元素,该元素将获得您的自定义主题。

  2. 您可以创建一个名为的模板文件form_element.tpl.php,该文件仅具有默认行为,theme_form_element()然后用于hook_preprocess_form_element()添加模板建议。然后,创建与建议匹配的新模板。您经常听到人们提到模板比函数要慢一些,对于如此频繁使用的主题调用,我可以想象人们对使用模板感到沮丧。但是我自己从未对此做任何测量。另外,您需要在预处理阶段具有足够的上下文才能提出建议。


你能举个例子吗?
chrisjlee 2012年

@ ChrisJ.Lee您要更改所有元素的包装,还是仅更改一个特定的包装?
安迪

只是一个。
chrisjlee'2

@chrisjlee我已经更新了答案。
安迪

4

我知道这是一个超旧的线程,但是我一直在学习如何更改表单元素和添加类。我开始制作自定义模块:

function yourtheme_custom_form_alter(&$form, &$form_state, $form_id) {
 case'webform_number_whatever':
   _yourtheme_form_add_wrapper($form['submitted']['yourfieldhere'], array('form-field-some-style', 'not-label', 'whatever-other-styles-you-want'));
 break;
}

function _yourtheme_form_add_wrapper(&$element, $classes = array(), $type = array('form-item', 'form-type-textfield'), $removeTitle = FALSE){
  $element['#prefix'] = '<div class="' . implode(" ", $classes) . '"><div class="' . implode(" ", $type) . '">';
  $element['#suffix'] = '</div></div>';
}

这是一个很好的替代解决方案-不要在包装div中添加类,只需将包装div包装在您自己的div中,您就可以应用所需的任何类。
菲利克斯·夏娃

3

要更改“包装器”,您需要覆盖form_element。基本上所有表单元素都以form_element主题theme_form_element($element,$value);(form.inc文件)呈现

因此,要更改其呈现表单元素的方式,您只需将该函数复制到template.php文件夹并将其重命名为: phptemplate_form_element($element,$value)

现在您可以进行任何更改,并且将使用它们代替原始功能

  1. theme_form_element($element,$value);从form.inc 复制
  2. 将其粘贴到(您的主题)template.php中
  3. 将其重命名为: phptemplate_form_element($element,$value)
  4. 清除所有主题缓存
  5. 进行所需的任何更改,这些更改将被使用。

1

您可以使用wrapper_attributes属性。

$form['example'] = [
  '#type' => 'textfield',
  '#title' => $this->t('Example'),
  '#wrapper_attributes' => ['class' => ['wrapper-class']],
];

这个答案对我有帮助,但是请注意,它专门适用于Drupal 8.x及更高版本。
威尔·马丁

0

重要的是,theme_form_element将仅修改直接父包装器div,而这可能不是CSS效果的预期目标。

[尽管不是编程的,但是如果只是想将一个类应用于节点字段的顶层包装器(它是包装器,包装器,包装器),我可以假设通过为特定的内容类型选择“管理字段”来使用“字段组”模块,并且选择“添加新组”作为简单的DIV。然后,可以删除标签,并将所需的类分配给其他包装器(但现在我们有更多包装器了-无限嵌套)


0

你可以用

'#prefix' => '<div class="new_class">', '#suffix' => '</div>'

这会把它包起来


0

使包装器属性可配置!

在主题中创建自己的表单元素主题功能... sites/all/themes/MY_THEME/theme/form-element.theme.inc

function my_theme_form_element($variables) {
  $element = &$variables['element'];

  $attributes = isset($element['#my_theme_wrapper_attributes']) ?
    $element['#my_theme_wrapper_attributes'] : array();

  ...

  $output = '<div' . drupal_attributes($attributes) . '>' . "\n";

  ...
}

然后你可以做这样的事情...

function my_module_form_alter(&$form, &$form_state, $form_id) {
  $form['account']['mail']['#my_theme_wrapper_attributes']['class'][] = 'form-field--inline';
}

0

在某些情况下,既#prefix/#suffix没有#attributes => array('class')给出也没有得到预期的结果。我的特殊情况是在managed_file元素周围向ajax-wrapper div添加一个类。 #prefix/#suffix创建一个新容器并#attributes/'class'修改内部元素的类,而不是最外部的类。

正常的最外面的div是

<div id="edit-doc1--XX-ajax-wrapper">

在CSS中很难定位。我可以锁定目标,[id^="edit-doc"]或者[id$="-ajax-wrapper"]这两个目标都不仅仅是我想要的元素。

我想出的解决方案是在表单中添加一个#process元素,然后手动操作该元素的代码。这是#process添加到表单项的声明中的属性:

$form['doc1'] = array(
  '#type' => 'managed_file',
  '#process' => array('mymodule_managed_file_process'),
);

这是mymodule_managed_file_process()函数:

function mymodule_managed_file_process($element, &$form_state, $form) {

  // Call the original function to perform its processing.
  $element = file_managed_file_process($element, $form_state, $form);

  // Add our own class for theming.
  $element['#prefix'] = str_replace(
    'id=',
    'class="managed-file-wrapper" id=',
    $element['#prefix']
  );

  return $element;
}

依靠字符串替换不是很str_replace容易移植,因此使用后果自负。但是,此代码确实确实更改了最外层的DIV以添加必要的类:

<div class="managed-file-wrapper" id="edit-doc1--XX-ajax-wrapper">

-1
<?php
    $form['#attributes'] = array('class' => 'your-class-name');
?> 

您可以使用上述方法在form元素上添加一个类。


6
然后,您将如何修改div的类?上面的代码更改了<input />标记的类。
chrisjlee 2011年

1
对于此处提出的特定问题,此答案是错误的。
doublejosh
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.