0

編集:

行動が同じか何かだからだと思います。これを使用してアクションを変更しようとしました:

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です

フォームアクションを変更できますか?

1つのページにユーザープロファイルフォームのいくつかの異なる「カテゴリ」を含めています。コードは、指定したフォームを正しく出力します。各フォームは、個別の折りたたみ可能なdivにあります。

私の問題は2つあります。

(1)フィールドの既存の値は事前入力されておらず、

(2)1つのセクションで[保存]をクリックすると、警告が表示されます。実際に保存しているフォームに関係なく、[メール]フィールドが必要です。

問題#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>';
4

1 に答える 1

1

問題#1:?HTMLソースを載せていただけませんか?問題 #2 の場合: OK、ここでコードをステップ実行します: ユーザー プロファイル フォームの検証ハンドラー ( 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」パラメータはオプションであることに注意してください - 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を編集===

OK、あなたの方法 ($form['#action']テーマ レイヤーで手動で編集する) はできないようです (この投稿を参照してください)。フォーム アクションを変更する場合は、実装するカスタム モジュールを作成する必要がありますhook_form_alter()(テーマ テンプレート ファイルでは機能しません)。この関数を使用すると、フォームのレンダリング方法を変更できます。この場合、ユーザー変更フォームです。フォームの変更の詳細については、こちらを参照してください

ただし、それがあなたがやりたいことであるとは100%確信が持てません。hook_user()(すでにモジュールを作成する必要があるように見えるため) おそらく、代わりにフックしたいでしょう。この関数は「...ユーザーアカウントで操作が実行されたときにモジュールが反応できるようにします。」. この関数のカテゴリに反応して、好きなユーザーの変更をブロック/許可できる場合があります。

ただし、問題が電子メール アドレスの検証だけであり、既存のユーザーを扱っている場合は、保存する前に電子メール アドレスが設定されていることを確認してみませんか?

于 2009-10-15T01:41:31.000 に答える