フィードを取得する前に認証呼び出しを行うカスタムフィードフェッチャークラスを作成しました。その設定では、フォームにユーザー名とパスワードのフィールドがあります。フィールド#type
をpassword
に設定しようとしましたが、#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
フィールドタイプを使用できなくなりますか?
#attributes
オプションを使用して、デフォルト値を直接追加することができます。
$form['password'] = array(
'#type' => 'password',
'#title' => t('Password'),
'#description' => t(''),
'#attributes' => array('value' => $this->config['password']),
);
validate
とsubmit
callbackでその値を取得できるかどうかわからない場合は、確認する必要があります。
パスワードフィールドにデフォルト値を設定することはできません。これは意味がありません。これは、属性にプレーンテキストで書き込まれるため、パスワード固有のものはすべて無意味になります(*、コピー防止など)。
デフォルト値を持つ通常のテキストフィールドを使用するか(ほとんどのフォームではそうだと思います)、空のままにし、空でない場合にのみ既存の値を上書きする特別なコードを追加し、対応する説明を追加します。
これはかなり一般的な使用例ですが、パスワードフィールドのデフォルト値を設定して、クライアントにパスワードを再公開する必要はありません。したがって、ユーザーはパスワード入力を更新してパスワードを変更するか、フィールドを空白のままにして変更しないでおくことができます。
これをコードで実装するには、フォームに別の送信ハンドラを追加します。
$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」変数に格納されていると想定していますが、コードでは他の場所にある可能性があります。
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
を使用して実行する必要があります。