有没有一种方法可以使用表单api向表单包装器(div)添加或更改类?
还是仅使用主题功能即可完成?
如果是这样,则使用哪个主题功能来改变它?
有没有一种方法可以使用表单api向表单包装器(div)添加或更改类?
还是仅使用主题功能即可完成?
如果是这样,则使用哪个主题功能来改变它?
Answers:
theme_form_element()
如果要全局更改主题,则可以正常覆盖。如果您只想修改一个特定的表单元素,那么我知道有两种选择。
您可以为感兴趣的特定类型的表单元素(例如,文本字段)注册新的主题功能。然后,您可以创建此主题函数(基于原始主题,例如theme_textfield()
),但不会theme('form_element', ...)
在最后调用(您可以在一个主题函数中处理包装器和元素,也可以制作单独的包装器主题函数并使用它)。最后,将#theme
属性添加到特定的form元素,该元素将获得您的自定义主题。
您可以创建一个名为的模板文件form_element.tpl.php
,该文件仅具有默认行为,theme_form_element()
然后用于hook_preprocess_form_element()
添加模板建议。然后,创建与建议匹配的新模板。您经常听到人们提到模板比函数要慢一些,对于如此频繁使用的主题调用,我可以想象人们对使用模板感到沮丧。但是我自己从未对此做任何测量。另外,您需要在预处理阶段具有足够的上下文才能提出建议。
我知道这是一个超旧的线程,但是我一直在学习如何更改表单元素和添加类。我开始制作自定义模块:
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>';
}
要更改“包装器”,您需要覆盖form_element。基本上所有表单元素都以form_element主题theme_form_element($element,$value);
(form.inc文件)呈现
因此,要更改其呈现表单元素的方式,您只需将该函数复制到template.php文件夹并将其重命名为: phptemplate_form_element($element,$value)
现在您可以进行任何更改,并且将使用它们代替原始功能
theme_form_element($element,$value);
从form.inc 复制phptemplate_form_element($element,$value)
使包装器属性可配置!
在主题中创建自己的表单元素主题功能...
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';
}
在某些情况下,既#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">
<?php
$form['#attributes'] = array('class' => 'your-class-name');
?>
您可以使用上述方法在form元素上添加一个类。