Drupal 7 - 覆盖基本表单HTML标记

时间:2012-07-04 14:15:26

标签: forms api drupal

我真的很难理解Drupal Form API ...实际上是Drupal。

这是我的问题,我已经创建了一个渲染精美的表单,但是我现在想要做的是围绕某些表单元素的包装器div,这样我就能以适合我的网站的方式设置我的表单样式而不是一些盒子标准废话。

有人可以帮助或者至少指向一个“好”教程的正确方向,而不是在整个网络上涂抹一些简短且非常模糊的废话吗?

感谢。

2 个答案:

答案 0 :(得分:13)

hook_form_alter是你的朋友。

在主题的template.php文件中,您可以为表单,表单元素等添加前缀和后缀。

以下是我最近所做网站的一个例子。

function bhha_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'user_login') {      
    $form['#prefix'] = '<div class="loginForm">';
    $form['#suffix'] = '</div>';
    $form['name']['#title'] = Null; // Change text on form
    $form['name']['#description'] = Null; // Change text on form
    $form['name']['#attributes'] = array('placeholder' => t('username'));
    $form['name']['#size'] = '30';
    $form['pass']['#title'] = Null;
    $form['pass']['#description'] = Null; // Change text on form
    $form['pass']['#attributes'] = array('placeholder' => t('password'));
    $form['pass']['#size'] = '30';
    //$form['actions']['submit']['#value'] = t('password');
    $form['actions']['submit'] = array('#type' => 'image_button', '#src' => base_path() . path_to_theme() . '/images/Login.png');
    $form['links']['#markup'] = '<a class="user-password" href="'.url('user/password').'">' . t('Forgot your password?') . '</a>'; // Remove Request New Password from Block form
    $form['links']['#weight'] = 540;
  }
}

检查您的代码以获取您想要主题ID的表单。用连字符替换下划线,你应该能够使用上面的例子来做你想要的。

这是最基本的,我想一个例子是:

function THEME_NAME_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'FORM_ID') {      
        // Adds a wrapper div to the whole form
    $form['#prefix'] = '<div class="loginForm">';
    $form['#suffix'] = '</div>';

        // Adds a wrapper div to the element NAME
    $form['name']['#prefix'] = '<div class="formRow">';
    $form['name']['#suffix'] = '</div>';
  }
}

答案 1 :(得分:2)

有几种方法可以做到这一点。例如

  1. 如果您要在字段级别覆盖标记,可以使用field.tpl.phptemplate_preprocess_field()
  2. 如果你想更改表单的封闭标记(虽然我想知道为什么Drupal的标准标记非常具有样式),你需要注册主题函数并处理标记。这是一个nice article,详细阐述了这一点。