2009-10-14 3 views
0

Редактировать:Drupal - Включить более одного user_profile_form на странице

Я думаю, что это потому, что действие такое же или что-то в этом роде. Я пытался изменить действие с помощью этого:

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

Но, вид действия, когда форма на самом деле оказывается не меняется. Они все/пользователь /% uid

Могу ли я изменить действие формы?

Я включаю несколько разных «категорий» формы профиля пользователя на одной странице, и код будет правильно выводить формы, которые я указываю. Каждая форма находится в отдельном разборном div.

Моя проблема двоякая.

(1) Существующие значения для полей предварительно не заселены и

(2) При нажатии на «Сохранить» для одной секции приведет предупреждение: поле Email требуется, независимо от того, какой формы вы фактически сохраняете

Я уверен, что для проблемы №2 это потому, что имя кнопки одинаково во всех случаях, равно как и идентификатор формы.

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>'; 
+0

Вы любили источник, чтобы узнать, действительно ли эти формы уникальны? – mikewaters

ответ

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'. (Обратите внимание, что пары «категории» является обязательной здесь - 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); 
    } 

Там ваше сообщение об ошибке.

Поскольку эта форма должна только утверждать, когда категория == 'account', и ваша проблема (# 2) кажется, что она всегда проверяет независимо от категории, возможно, ваши формы не отображаются как уникальная форма случаи? Drupal может давать полную форму каждый раз и просто устанавливать значение скрытой формы независимо от категории (например, в функции определения этой формы в user_pages.inc $form['_category'] = array('#type' => 'value', '#value' => $category);)

Было бы полезно увидеть фактический выход источника html ,

== EDIT 10-15-09 в ответ на обновленный вопрос ===

ОК, это выглядит как ваш метод (редактирование $form['#action'] вручную в тематическом слое) не может быть возможным (см this пост для справки). Если вы хотите изменить действие формы, вам нужно написать настраиваемый модуль, который реализует hook_form_alter() (он не будет работать в файле шаблона темы). Эта функция позволяет вам изменять способ визуализации формы, в вашем случае - форму модификации пользователя. Более подробная информация о модификации формы here.

Я не уверен на 100%, это то, что вы хотите сделать; (поскольку похоже, что вы уже должны создать модуль), возможно, вы хотите перехватить hook_user(); эта функция «... позволяет модулям реагировать, когда операции выполняются на учетных записях пользователей». Вы можете реагировать на категорию в этой функции и блокировать/разрешать любой пользователь, который вам нравится.

Однако, если это просто проверка адреса электронной почты, это проблема, и если вы имеете дело с существующими пользователями, почему бы вам просто не убедиться, что адрес электронной почты установлен до сохранения?

+0

Да, в этом проблема ... Я редактирую свое оригинальное сообщение, чтобы немного поработать над этим ... – n00b0101