web-dev-qa-db-ja.com

フォーム要素の値をテキストとして出力する方法は?

ノード編集フォームで、特定のフィールドをすべてのユーザーが編集できないようにしますが、フィールドに格納されている値はフォームに表示されます。私の考えは、HTMLフォーム要素ではなく、テキストとして出力することでした。これを達成するための最良の方法は何ですか?

いくつかのコンテキストを提供するために、これらの値は移行を介して入力されるため、サイトで編集しないでください。

3
markdorison

フォームフィールドをマークアップ要素に変更すると、フォーム検証ハンドラーまたはフォーム送信ハンドラーによってフォームフィールドがチェックされる場合に問題が発生します。#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に変更します。

4
kiamlaluno

yourmodule_form_alterフィールドを変更する#typeテキストフィールドからマークアップへ。

1
Rafael Caceres