web-dev-qa-db-ja.com

D7フォームAPIのパスワード要素にデフォルト値を与える?

フィードを取得する前に認証呼び出しを行うカスタムフィードフェッチャークラスを作成しました。その設定では、フォームにユーザー名とパスワードのフィールドがあります。フィールド#typepasswordに設定しようとしましたが、#default_value要素を使用していないように見えたため、[保存]ボタンをクリックすると、保存されたパスワードが消去されました。

これはパスワードを維持しますが、プレーンテキストで表示します:

$form['password'] = array(
  '#type' => 'textfield',
  '#title' => t('Password'),
  '#description' => t(''),
  '#default_value' => $this->config['password'],
);

これはパスワードのドットを示していますが、#default_valueを使用してフィールドにデータを入力していないため、フォームに値を変更して保存するたびにパスワードを入力する必要があります。

$form['password'] = array(
  '#type' => 'password',
  '#title' => t('Password'),
  '#description' => t(''),
  '#default_value' => $this->config['password'],
);

ユーザーにパスワードを入力してもらい、フォームで変更して保存した他の値に関係なくパスワードを保持できるようにする必要があります。 #default_value要素を使用していないように見えるため、これによりpasswordフィールドタイプを使用できなくなりますか?

2
user1359

#attributesオプションを使用して、デフォルト値を直接追加することができます。

$form['password'] = array(
  '#type' => 'password',
  '#title' => t('Password'),
  '#description' => t(''),
  '#attributes' => array('value' => $this->config['password']),
);

validatesubmitcallbackでその値を取得できるかどうかわからない場合は、確認する必要があります。

2
yvan

パスワードフィールドにデフォルト値を設定することはできません。これは意味がありません。これは、属性にプレーンテキストで書き込まれるため、パスワード固有のものはすべて無意味になります(*、コピー防止など)。

デフォルト値を持つ通常のテキストフィールドを使用するか(ほとんどのフォームではそうだと思います)、空のままにし、空でない場合にのみ既存の値を上書きする特別なコードを追加し、対応する説明を追加します。

2
Berdir

これはかなり一般的な使用例ですが、パスワードフィールドのデフォルト値を設定して、クライアントにパスワードを再公開する必要はありません。したがって、ユーザーはパスワード入力を更新してパスワードを変更するか、フィールドを空白のままにして変更しないでおくことができます。

これをコードで実装するには、フォームに別の送信ハンドラを追加します。

$form['password'] = array(
    '#type' => 'password',
    '#title' => t('Password'),
    '#description' => t(''),
);

$form['#submit'] = array_merge(array('my_default_password'), (array) $form['#submit']);

そして、このハンドラーでパスワードを元に戻します。

function my_default_password($form, &$form_state) {
    if (empty($form_state['values']['password'])) {
        $form_state['values']['password'] = variable_get('the_password');
    }
}

この方法では、既存のパスワードをユーザーに公開する必要はありません。これは、優れたセキュリティ対策とは見なされませんが、期待されるワークフローも取得できます。

デフォルトのパスワードは「the_password」変数に格納されていると想定していますが、コードでは他の場所にある可能性があります。

2
Bendoh

validation および hook_update_N を使用してこれを実現できました。私の場合、いくつかのフォーム要素を含む設定ページがあり、そのうちの1つはパスワードフィールドです。他の設定を入力してパスワードを入力せずに[保存]をクリックすると、パスワードは空の文字列に設定されます。

私の場合、mymodule.moduleで次のようにフォームを検証しました。

<?php    

function mymodule_form_callback($form, &$form_state) {
  $form = array();
  // code for other elements here...
  $form['my_password_field'] = array(
    '#type' => 'password_confirm',
    '#title' => t('Enter password'),
  );      
  return $form;
}

function mymodule_form_callback_validate($form, &$form_state) {
  if (empty($form_state['values']['my_password_field'])) {
    $form_state['values']['my_password_field'] = variable_get('my_password_field');
  }
}

次に、mymodule.installにデフォルト値を作成しました:

<?php

function mymodule_update_7001() {
  variable_set('my_password_field', 'Jabron1jabroni');
}

このデフォルトを最初に設定するには、UIでDrupal更新を実行するか、Drushを使用する場合はdrush updb -yを使用して実行する必要があります。

0
mikeDOTexe