5

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

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

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

谢谢。

4

2 回答 2

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>';
  }
}
于 2012-07-04T14:21:15.440 回答
2

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

  1. 如果您希望在字段级别覆盖标记,您可以使用field.tpl.phpor template_preprocess_field()
  2. 如果您想更改表单的封闭标记(尽管我想知道为什么 Drupal 的标准标记非常适合样式),您需要注册主题函数并因此处理标记。这是一篇很好的文章,详细说明了这一点。
于 2012-07-04T14:24:38.357 回答