为Drupal 7注册表单添加自定义类遇问题求助
解决Drupal 7注册表单密码与CAPTCHA字段自定义类添加失败的问题
嘿,我来帮你搞定这个问题!你已经成功处理了大部分字段,卡在密码和CAPTCHA字段上,主要是这两个字段的表单结构和普通字段不一样,咱们一步步来修正:
1. 密码字段的问题
在Drupal 7的用户注册表单中,密码确认组(pass1/pass2)是由password_confirm表单元素生成的,它的内部结构有特殊的处理逻辑。你直接修改pass1和pass2的#attributes可能会被表单的#process函数覆盖,或者需要确保正确的数组赋值方式(避免直接覆盖原有的类)。
推荐用Drupal内置的drupal_add_class()函数来安全添加类,它会自动处理数组不存在的情况:
// 修正密码字段的类添加 drupal_add_class('form-element__control', $form['account']['pass']['pass1']['#attributes']['class']); drupal_add_class('form-element__control', $form['account']['pass']['pass2']['#attributes']['class']);
如果你想手动处理数组,也可以这么写:
// 确保class数组存在,再追加类 if (!isset($form['account']['pass']['pass1']['#attributes']['class'])) { $form['account']['pass']['pass1']['#attributes']['class'] = []; } $form['account']['pass']['pass1']['#attributes']['class'][] = 'form-element__control'; if (!isset($form['account']['pass']['pass2']['#attributes']['class'])) { $form['account']['pass']['pass2']['#attributes']['class'] = []; } $form['account']['pass']['pass2']['#attributes']['class'][] = 'form-element__control';
2. CAPTCHA字段的问题
CAPTCHA模块在表单中会把响应字段放在captcha容器元素下面,而不是直接在account数组里。你之前的路径$form['account']['captcha_response']是错误的,正确的路径应该是$form['captcha']['captcha_response']。
修正后的CAPTCHA字段处理代码:
// 修正CAPTCHA字段的类添加与描述清除 if (isset($form['captcha']['captcha_response'])) { drupal_add_class('form-element__control', $form['captcha']['captcha_response']['#attributes']['class']); $form['captcha']['captcha_response']['#description'] = t(''); }
完整修正后的代码
把这些修改整合到你的hook函数里,最终代码如下:
function MyTheme_form_user_register_form_alter(&$form, &$form_state){ // set classes; $form["#attributes"]["class"] = "form-element"; $form['field_first_name']['und'][0]['value']['#attributes']['class'][] = 'form-element__control'; $form['field_last_name']['und'][0]['value']['#attributes']['class'][] = 'form-element__control'; $form['field_developer_organization']['und'][0]['value']['#attributes']['class'][] = 'form-element__control'; $form['account']['mail']['#attributes']['class'][] = 'form-element__control'; // 修正密码字段类添加 drupal_add_class('form-element__control', $form['account']['pass']['pass1']['#attributes']['class']); drupal_add_class('form-element__control', $form['account']['pass']['pass2']['#attributes']['class']); // 修正CAPTCHA字段类添加 if (isset($form['captcha']['captcha_response'])) { drupal_add_class('form-element__control', $form['captcha']['captcha_response']['#attributes']['class']); } // remove descriptions; $form['field_first_name']['und'][0]['value']['#description'] = t(''); $form['field_last_name']['und'][0]['value']['#description'] = t(''); $form['field_developer_organization']['und'][0]['value']['#description'] = t(''); $form['account']['mail']['#description'] = t(''); $form['account']['pass']['pass1']['#description'] = t(''); $form['account']['pass']['pass2']['#description'] = t(''); // 修正CAPTCHA描述清除 if (isset($form['captcha']['captcha_response'])) { $form['captcha']['captcha_response']['#description'] = t(''); } }
额外提示
- 使用
drupal_add_class()是Drupal推荐的添加CSS类的方式,能避免因数组未初始化导致的PHP警告。 - 给CAPTCHA字段加
isset()判断,能防止CAPTCHA模块未启用或表单未加载CAPTCHA时出现报错。
内容的提问来源于stack exchange,提问作者Node_Ninja
相关产品推荐
相关产品推荐

