Drupal - 在页面上包含多个user_profile_form

时间:2009-10-14 22:56:14

标签: forms drupal profile

编辑:

我认为这是因为行动是相同的或什么的。我试图用这个修改动作:

function mytheme_user_profile_form($form) {
        global $user;
        $uid = $user->uid;
        //print '<pre>'; print_r($form); print '</pre>';
    $category = $form['_category']['#value'];

    switch($category) {
            case 'account':
            $form['#action'] = '/user/'.$uid.'/edit?destination=user/'.$uid;
                        break;
        case 'education':
                        $form['#action'] = '/user/'.$uid.'/edit/education?destination=user/'.$uid;
                        break;
        case 'experience':
                        $form['#action'] = '/user/'.$uid.'/edit/experience?destination=user/'.$uid;
                        break;
            case 'publications':
                        $form['#action'] = '/user/'.$uid.'/edit/publications?destination=user/'.$uid;
                        break;
        case 'conflicts':
                        $form['#action'] = '/user/'.$uid.'/edit/conflicts?destination=user/'.$uid;
                        break;
    }

        //print '<pre>'; print_r($form); print '</pre>';
        //print $form['#action'];
        $output .= drupal_render($form);
        return $output;
}

但是,当实际呈现表单时,表单操作不会改变。他们都是/ user /%uid

我可以修改表单操作吗?

我在一个页面上包含了几个不同的“类别”用户配置文件表单,代码将正确输出我指定的表单。每个表单都在一个单独的可折叠div中。

我的问题是双重的。

(1)字段的现有值未预先填充

(2)点击“保存”一个部分将产生警告:无论您实际保存哪种表格,都需要电子邮件字段

我很确定对于问题#2,这是因为按钮的名称在所有情况下都是相同的,就像表单ID一样。

print '<h3>&ndash; Account Settings</h3>';
print '<div class="expand">';
print(drupal_get_form('user_profile_form', $user, 'account'));
print '</div>';

print '<h3>&ndash; My Info</h3>';
print '<div class="expand">';
print(drupal_get_form('user_profile_form', $user, 'Personal'));
print '</div>';

print '<h3>&ndash; Experience</h3>';
print '<div class="expand">';
print(drupal_get_form('user_profile_form', $user, 'experience'));
print '</div>';

print '<h3>&ndash; Education</h3>';
print '<div class="expand">';
print(drupal_get_form('user_profile_form', $user, 'education'));
print '</div>';

1 个答案:

答案 0 :(得分:1)

问题#1:?你可以发布html源代码吗? 对于问题#2: 好的,我会在这里单步执行代码: 用户配置文件表单(user_profile_form_validate())的验证处理程序调用

user_module_invoke('validate', $form_state['values'], $form_state['values']['_account'], $form_state['values']['_category']);

看起来像

<?php
/**
* Invokes hook_user() in every module.
*
* We cannot use module_invoke() for this, because the arguments need to
* be passed by reference.
*/
function user_module_invoke($type, &$array, &$user, $category = NULL) {
  foreach (module_list() as $module) {
    $function = $module .'_user'; 
    if (function_exists($function)) {
      $function($type, $array, $user, $category);
    }
  }
}
?>

因此,此表单的验证处理程序将遍历每个模块,查找用户钩子函数并使用$type = 'validate'调用它们。 (注意'category'param在这里是可选的 - contrib模块不需要使用它)

让我们以user.module的用户钩子为例来看看会发生什么:

function user_user($type, &$edit, &$account, $category = NULL) {
  if ($type == 'view') {
    $account->content['user_picture'] = array(
      '#value' => theme('user_picture', $account),
      '#weight' => -10,
    );
    if (!isset($account->content['summary'])) {
      $account->content['summary'] = array();
    }
    $account->content['summary'] += array(
      '#type' => 'user_profile_category',
      '#attributes' => array('class' => 'user-member'),
      '#weight' => 5,
      '#title' => t('History'),
    );
    $account->content['summary']['member_for'] = array(
      '#type' => 'user_profile_item',
      '#title' => t('Member for'),
      '#value' => format_interval(time() - $account->created),
    );
  }
  if ($type == 'form' && $category == 'account') {
    $form_state = array();
    return user_edit_form($form_state, (isset($account->uid) ? $account->uid : FALSE), $edit);
  }
//<-- LOOK HERE -->
  if ($type == 'validate' && $category == 'account') {
    return _user_edit_validate((isset($account->uid) ? $account->uid : FALSE), $edit);
  }

  if ($type == 'submit' && $category == 'account') {
    return _user_edit_submit((isset($account->uid) ? $account->uid : FALSE), $edit);
  }

  if ($type == 'categories') {
    return array(array('name' => 'account', 'title' => t('Account settings'), 'weight' => 1));
  }
}

因此,它只应该验证类别=='帐户'

在函数_use_edit_validate中,我们找到:

  // Validate the e-mail address:
  if ($error = user_validate_mail($edit['mail'])) {
    form_set_error('mail', $error);
  }

有你的错误信息。

由于该表单只应在类别=='帐户'时进行验证,而您的问题(#2)似乎始终无论类别如何都有效,因此您的表单可能不会呈现为唯一的表单实例? Drupal每次都可能呈现一个完整的表单,只是将隐藏的表单值设置为类别(就像在user_pages.inc $form['_category'] = array('#type' => 'value', '#value' => $category);中这个表单的定义函数一样)

查看实际的html源输出会很有帮助。

==编辑10-15-09以回应更新的问题===

好的,看起来您的方法(在主题图层中手动编辑$form['#action'])可能无法实现(请参阅this帖子以供参考)。如果要更改表单操作,则需要编写实现hook_form_alter()的自定义模块(它不能在主题模板文件中使用)。此功能允许您修改表单的呈现方式,在您的情况下是用户修改表单。有关表单修改的更多详细信息here

我并非100%确定这是你想要做的事情; (因为看起来你已经必须创建一个模块)也许你想要挂钩到hook_user();此功能“......允许模块在对用户帐户执行操作时作出反应。”您可以对此功能中的类别做出反应,并阻止/允许您喜欢的任何用户更改。

但是,如果仅仅是电子邮件地址验证问题,并且如果您正在与现有用户打交道,那么为什么不确保在保存之前设置了电子邮件地址?