Drupal 7 开发内部培训资料, 分头诗人

drupal 7 如何删除form外部默认的div?

赞成!
0
否决!

又是一个关于form的问题     - -!

修改表单加时,改得最多的是其div结构,加div很好办,可以用prefix suffix,但是想删除一些自带的div时,我遇到了问题

drupal7 的几个系统自带的表单是会有一些默认的div,如果知道其tree结构还好改,有的表单完全不知道相关元素的名字,改无从下手。

比如form下都会有一个div(没样式,没class或id)把所有元素包住,虽然不影响,但是对于强迫症来说,完全无法忍受。

还比如在user_login_block 中 '#type' => 'password' 的<input>外面会默认包着一个<div class="form-item form-type-textfield form-item-name">,对于开始写的html代码<input>外根本没有包div的人,这是何其的痛苦(我的css本来是 .login-field:focus + .login-field-icon{...},突然遇到dp生成的input外居然还有div,我以前写的几乎得重写了,欲哭无泪啊)

这个是我在user.module里改的

function ($form) {
  $form['#action'] = url(current_path(), array('query' => drupal_get_destination(), 'external' => FALSE));
  $form['#id'] = 'user-login-form';
  $form['#attributes'] = array('class' => array('login hidden'));
  $form['#validate'] = user_login_default_validators();
  $form['#submit'][] = 'user_login_submit';
  $form['name'] = array(
    '#type' => 'textfield',
    //'#title' => t('Username'),
    '#maxlength' => USERNAME_MAX_LENGTH,
    '#size' => 15,
    '#required' => TRUE,
    '#prefix' => '<div class="login-form"><div class="control-group">',
    '#attributes' =>array('class' => array('login-field'),'placeholder'=>'用户名'),
    '#suffix' => '<label class="login-field-icon" for="login-pass">&#xe007;</label></div>', 
  );
  $form['pass'] = array(
    '#type' => 'password',
    //'#title' => t('Password'),
    '#size' => 15,
    '#required' => TRUE,
    '#prefix' => '<div class="control-group">',
    '#attributes' =>array('class' => array('login-field'),'placeholder'=>'密码'),
    '#suffix' => '<label class="login-field-icon" for="login-pass">&#xe00b;</label></div>', 
  );
  //$form['actions'] = array('#type' => 'actions',);
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('登陆'),
    '#attributes' =>array('class' => array('lbtn lbtn-primary lbtn-large lbtn-block')),
  );
  $items = array();
  if (variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL)) {
    $items[] = l(t('用户注册'), 'user/register', array('attributes' => array('class' => array('login-link'),'title' => t('创建一个新的用户'))));
  }
  $items[] = l(t('忘记密码?'), 'user/password', array('attributes' => array('class' => array('login-link'),'title' => t('通过邮箱更新密码'))));
  $form['links'] = array(
    '#markup' => l(t('用户注册'), 'user/register', array('attributes' => array('class' => array('login-link'),'title' => t('创建一个新的用户')))).l(t('忘记密码?'), 'user/password', array('attributes' => array('class' => array('login-link'),'title' => t('通过邮箱更新密码')))),
    '#prefix' => '<div class="login-link-wrapper clearfix">',
    '#attributes' =>array('class' => array('login-link-wrapper clearfix')),
    '#suffix' => '</div></div>', 
  );
  return $form;
}

这个是我想生成的结构

             <form class="login hidden" accept-charset="UTF-8" method="post" action="<?php print $front_page; ?>user?destination=node"><!--login-->
                <div class="login-form"><!--login-form-->
                  <div class="control-group">
                    <input type="text" class="login-field" value="" placeholder="用户名" id="login-name" name="name" />
                    <label class="login-field-icon" for="login-name">&#xe007;</label>
                  </div>
                  <div class="control-group">
                    <input type="password" class="login-field" value="" placeholder="密码" id="login-pass" name="pass" />
                    <label class="login-field-icon" for="login-pass">&#xe00b;</label>
                  </div>
                  <input class="lbtn lbtn-primary lbtn-large lbtn-block" type="submit" value="登陆" name="op" />
                  <input type="hidden" name="form_id" value="user_login">
                  <div class="login-link-wrapper clearfix">
                    <a class="login-link" href="<?php print $front_page; ?>user/register">用户注册</a>
                    <a class="login-link" href="<?php print $front_page; ?>user/password">忘记密码?</a>
                  </div>
                </div><!--./login-form-->
             </form><!--./login-->

几乎都能实现了,就是出现了上诉的两个问题

3 个回答

赞成!
0
否决!

可以用 theme 优化

/**
 * Implements hook_form_alter().
 */
function hook_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'user_login') {
    $form['#theme'] = array('overwrite_user_login');
  }
}

/**
 * Implements hook_theme().
 */
function hook_theme($existing, $type, $theme, $path){
  return array(
    'overwrite_user_login' => array(
      'render element' => 'form',
      'template' => 'form--user_login',
      'path' => $path . '/templates',
    ),
  );
}

然后增加 form--user_login.tpl.php文件

<?php 
print drupal_render_children($form) 
?> 
赞成!
0
否决!

谢谢,这个方法是可行的!不过有没有直接修改原生的表单的方法呢?

还有用theme的方法如何打印#token和#build_id?

没有#token和#build_id对安全性有影响没有?

赞成!
0
否决!

以user_register表单为例:

定义一个函数

your_theme_name_ 或者 phptemplate_ 加 name_of_form($form).

 

<?php
function phptemplate_user_register($form) {
    $variables = array('user' => $user, 'form' => $form);
    return _phptemplate_callback('user_register', $variables);
}
?>

然后创建同名tpl.php , 如本例是:user_register.tpl.php

<?php
drupal_set_message('< pre >'. var_export($variables,TRUE) .'< /pre >');
?>

 

<div id="regform1">
<fieldset class="group-account-basics collapsible"><legend>Account Basics</legend>

<?php print drupal_render($form['name']); ?>

<?php print drupal_render($form['mail']); ?>

<?php print drupal_render($form['pass']); ?>

<?php print drupal_render($form['field_user_picture']); ?>

<?php print drupal_render($form['field_city']); ?>

</fieldset>
</div>

<div id="regform2">
<fieldset class="group-story collapsible"><legend>My Story</legend>

<?php print drupal_render($form['field_storypic']); ?>

<?php print drupal_render($form['field_user_story_field']); ?>

</fieldset>
</div>

<?php print drupal_render($form['captcha']); ?>

<?php print drupal_render($form['submit']); ?>

<?php
unset($form['field_mostimportantlesson']);
print drupal_render($form);
?>