【问题标题】:Drupal 7 - Overriding Basic Form HTML Mark-UpDrupal 7 - 覆盖基本表单 HTML 标记
【发布时间】:2012-07-04 14:15:26
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 您是否创建了自定义表单或想要为现有表单设置样式?试试这个tutorialthis one
  • 我已经使用表单 API 创建了自己的自定义表单,但我无法按照我想要的方式设置它的样式,因为我需要对大量元素进行分组,即个人详细信息(姓名、地址、电话等)。基本上我想在屏幕上滑动表单的一部分,当每个部分都被填写时,这就是为什么我需要添加额外的 HTML 标记。
  • 感谢您的回复。 JAYPAN 发送的第一个教程在发布后运行良好,我必须在某些更改后重新启动模块。

标签: forms api drupal


【解决方案1】:

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>';
  }
}

【讨论】:

  • 感谢 alter 功能的帮助,也尝试了其他一些方法。
  • 当您有一个动态的复选框列表(来自分类术语)并且您无法对其名称进行硬编码时,您会怎么做。我有一个带有动态数量的#options 的#type 复选框。 ATM 每个选项都显示一个不需要的 div 包装器,我根本不需要任何包装器。我想要完全控制。
【解决方案2】:

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

  1. 如果您希望在字段级别覆盖标记,可以使用 field.tpl.phptemplate_preprocess_field()
  2. 如果您想更改表单的封闭标记(尽管我想知道为什么 Drupal 的标准标记非常适合样式),您会想要注册主题函数并因此处理标记。这是一个nice article,详细说明了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2018-01-01
    • 1970-01-01
    相关资源
    最近更新 更多