ノード編集フォームで、特定のフィールドをすべてのユーザーが編集できないようにしますが、フィールドに格納されている値はフォームに表示されます。私の考えは、HTMLフォーム要素ではなく、テキストとして出力することでした。これを達成するための最良の方法は何ですか?
いくつかのコンテキストを提供するために、これらの値は移行を介して入力されるため、サイトで編集しないでください。
フォームフィールドをマークアップ要素に変更すると、フォーム検証ハンドラーまたはフォーム送信ハンドラーによってフォームフィールドがチェックされる場合に問題が発生します。#markup
要素は、現在の値を含む$form_state['values']
配列で渡されませんフォームフィールドに関連付けられています(これは、フォームハンドラー(検証ハンドラーと送信ハンドラーの両方)によって使用される配列です)。 #element_validate
は#element_validate
フォームフィールドからも使用されるため、このメソッドは#markup
を使用するフォームフィールドで機能します。
表示するだけのフォームフィールドの値をチェックするフォーム検証ハンドラがないことが確実な場合は、この方法を採用できます。サードパーティのモジュールがこれらのフィールドにフォーム検証ハンドラーを追加できるため、フォームフィールドが作成したカスタムモジュールによって作成され、他の開発者が追加したフォームフィールドを変更しない場合は、それを採用することはお勧めしませんコード(またはコードによって作成されたフォームを変更)。
#attributes
を使用してフィールドを読み取り専用にすることは、安全な方法ではありません(Berdirが指摘したとおり)。フォームフィールドの値が変更されていないことを確認するには、フォームに表示される前に値を比較する必要があります(つまり、$form
配列に含まれる値を確認します)。他のモジュールはこれらの値が読み取り専用ではないため、このメソッドはフォーム検証ハンドラー(およびフォーム送信ハンドラー)にまだ問題があります。これらの値は読み取り専用であるため、コードのみが動作します。このメソッドを採用しないもう1つの理由は、フォームフィールドに#disable
属性を追加する方が「簡単」であることです。
別の方法は、フォームフィールドタイプを#hidden
に変更することです。この方法を選択した場合は、#prefix
および#suffix
を使用してフォームフィールド値もレンダリングする必要があります。
$form['field']['#type'] = 'hidden';
$form['field']['#prefix'] = '<strong>' . t("Field title: ") . '</strong>' .
check_plain($form['field']['#default_value']);
補足として、これらのフォームフィールドをユーザーに表示する必要はないが、$form_state
配列に存在する必要がある場合、他のモジュール(フォームを作成したモジュールを含む)がフォームハンドラーを実装しているため、次のことができます。フォームフィールドタイプを#value
に変更します。
yourmodule_form_alter
フィールドを変更する#type
テキストフィールドからマークアップへ。