ユーザープロファイルフォームにテーマを設定して、フォームの2列のレイアウトを設定し、特定の要素を除外できる簡単な方法を探しています。
どうすればそれを達成できますか?
ユーザープロファイルフォームにテーマを設定して、フォームの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
),
);
}
これは、DOUpalテーマシステムに、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;
}
この例では、一般的なアカウント情報フィールド、ユーザーの写真のアップロードフィールド(写真が有効な場合)、および送信アクションを "rendered"という変数に入れます。
これらの変数を定義したので、テンプレートファイルに出力できます。'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のコードのいくつかの修正:
'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']配列で不要な要素を非表示にする最良の方法だと思います。