编辑:
我认为这是因为行动是相同的或什么的。我试图用这个修改动作:
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>– Account Settings</h3>';
print '<div class="expand">';
print(drupal_get_form('user_profile_form', $user, 'account'));
print '</div>';
print '<h3>– My Info</h3>';
print '<div class="expand">';
print(drupal_get_form('user_profile_form', $user, 'Personal'));
print '</div>';
print '<h3>– Experience</h3>';
print '<div class="expand">';
print(drupal_get_form('user_profile_form', $user, 'experience'));
print '</div>';
print '<h3>– Education</h3>';
print '<div class="expand">';
print(drupal_get_form('user_profile_form', $user, 'education'));
print '</div>';
答案 0 :(得分:1)
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()
;此功能“......允许模块在对用户帐户执行操作时作出反应。”您可以对此功能中的类别做出反应,并阻止/允许您喜欢的任何用户更改。
但是,如果仅仅是电子邮件地址验证问题,并且如果您正在与现有用户打交道,那么为什么不确保在保存之前设置了电子邮件地址?