ユーザープロファイルフォームにテーマを設定する簡単な方法を探しています。これにより、フォームの2列のレイアウトを設定し、特定の要素を除外できます。
どうすればそれを達成できますか?
Display Suiteモジュールを使用する以外に、フォームにテーマを設定するほとんどの方法では、少しのコードを記述する必要があります。次の方法では、テンプレートファイルに出力できるフォームから変数を定義して、必要なHTML構造に適合させます。私はすべてのコードをtemplate.phpに入れましたが、これを行うためのカスタムモジュールを簡単に作成できます。
Hook_theme()実装を追加する
function YOURTHEME_theme($existing, $type, $theme, $path){
return array(
'user_profile_form' => array(
'render element' => 'form',
'template' => 'user-profile-form',
'path' => drupal_get_path('theme', 'YOURTHEME') . '/templates',
//add '/templates' only if you store template files in an additional folder
),
);
}
これは、Drupalテーマ設定システムに、YOURTHEME/templatesで待機しているテンプレートファイルがあることを通知します。
次に、hook_preprocess_HOOK関数でテンプレートに渡す変数をいくつか定義します。 $ variables ['form']でフォームの構造化配列を見つけ、フォーム要素をtpl.phpファイルの周りにスローしたい変数に割り当てます。
function YOURTHEME_preprocess_user_profile_form(&$variables) {
$form_inputs = array(
'account' => $variables['form']['account'],
'picture' => $variables['form']['picture'],
'actions' => $variables['form']['actions'],
);
$variables['rendered'] = _YOURTHEME_form_variables_render_all($form_inputs);
}
function _YOURTHEME_form_variables_render_all($elements) {
//Create array to return, with element name as key and element as value
$elements_array = array();
//For each element, render it and add it to the array
foreach ($elements as $key => $element) {
$elements_array[$key] = render($element);
}
//Return array
return $elements_array;
}
この例では、一般的なアカウント情報フィールド、ユーザーの写真アップロードフィールド(写真が有効な場合)、および送信アクションを「レンダリングされた」という変数に入れます。
これらの変数を定義したので、テンプレートファイルに出力できます。 'YOURTHEME/templates'にuser-profile-form.tpl.phpという名前のテンプレートファイルを作成します。これはデモの例です:
<div id="new-form">
<?php echo $rendered['picture']; ?>
<?php echo $rendered['account']; ?>
<?php echo $rendered['actions']; ?>
<input type="hidden" name="form_id" value="<?php print $form['#form_id']; ?>" />
<input type="hidden" name="form_build_id" value="<?php print $form['#build_id']; ?>" />
<input type="hidden" name="form_token" value="<?php print $form['form_token']['#default_value']; ?>" />
</div>
最後の非表示のフォームフィールドに注意してください。これらには、重要なDrupalトークンが含まれており、フォームを攻撃から保護するのに役立ちます。これらのトークンがないと、フォームは機能しません。
ユーザー編集ページにアクセスすると、一部の一般的なアカウント情報フィールドと画像フィールドのみが表示されます。前処理関数でさまざまな変数を作成してフォーム要素を分離し、user-profile-form.tpl.phpファイルの好きな場所に配置して、好きなマークアップを追加します。
表示スイートは、編集ではなく、表示にのみ使用できます。両方に対応できれば最高でした。
areynolds'sコードの修正:
'render要素のアンダースコアの修正
function YOURTHEME_theme($existing, $type, $theme, $path){
return array(
'user_profile_form' => array(
'render element' => 'form',
'template' => 'user-profile-form',
'path' => drupal_get_path('theme', 'YOURTHEME') . '/templates',
//add '/templates' only if you store template files in an additional folder
),
);
}
データの上書き(アカウント->画像)およびアクション要素の追加(フォームボタン)からの前処理関数を修正します。
function YOURTHEME_preprocess_user_profile_form(&$variables) {
$required_elements[]=$variables['form']['account'];
$required_elements[]=$variables['form']['picture'];
$required_elements[]=$variables['form']['actions'];
$variables['rendered'] = drupal_render($required_elements);
}
しかし、このすべての操作はフォームの外観のみを提供します。しかし、フォームは検証、送信ハンドラーなどの他の要素を必要とするため、適切に機能しません。したがって、必要なすべてのフォームメタデータを残して、$ variables ['form']配列で不要な要素を非表示にする最善の方法だと思います。
パネルはプロファイル編集フォームを完全に引き継ぐことができ、少数のパッチ(現在)を使用して、パネル関係としてプロファイル2情報を取り込むことができます。