Theming user_profile_form(ユーザー編集フォーム)


7

ユーザープロファイルフォームにテーマを設定して、フォームの2列のレイアウトを設定し、特定の要素を除外できる簡単な方法を探しています。

どうすればそれを達成できますか?


この質問を作成した理由は2つあります。1つは、この問題を解決するための個人的な方法を理解するのにしばらく時間がかかり、他の人の悲しみを救いたかったためです。次に、user_profile_formだけでなくフォーム全般にテーマを設定するより良い方法があるかどうかを確認します。フォームのテーマ設定に関する良い質問へのリンクは、私が見ているとおりに投稿します。他の人も同じことを歓迎します。
レイノルズ2011

テーマノードフォームに関するDrupalのドキュメントは、フォームテーマに関する一般的な説明を始めるのに適した場所です。drupal.org
node

回答:


7

Display Suiteモジュールを使用する以外に、フォームにテーマを設定するほとんどの方法では、少しのコードを記述する必要があります。次の方法では、テンプレートファイルに出力できるフォームから変数を定義して、必要なHTML構造に適合させます。私はすべてのコードをtemplate.phpに入れましたが、これを行うためのカスタムモジュールを簡単に作成できます。

  1. 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で待機しているテンプレートファイルがあることを通知します。

  2. 次に、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"という変数に入れます。

  3. これらの変数を定義したので、テンプレートファイルに出力できます。'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ファイル内の好きな場所に配置して、好きなマークアップを追加します。


Display Suite Formsを使用しない理由はありますか?
Capi Etheriel 2012年

正直覚えてないので、久しぶりです。テンプレートファイルにフォームを出力する機能(バックエンドコードで強力で安全なフォームを生成するForms APIの機能を備えたまま)は、柔軟性とコード分離の大きな利点だと思います。Drupalが目指すべきMVCモデルにより近い。
areynolds 2013

さあ、DrupalはMVCではなく、そうである必要もありません。garfieldtech.com/blog/mvc-vs-pacを確認してください(その投稿はかなり古いですが、それでも問題を解決するのに役立ちます)。
Capi Etheriel 2013

1
確かに、MVCパラダイムを「目指すべき」と言っているのは間違いなく意見にすぎません(ちなみに、私はこの記事が好きです)。私のポイントは、Drupalが厳密なMVCガイドラインに従うべきではなく、テンプレートファイルは、多くの場合、別の抽象化レイヤー(DS)またはDrupal APIを学ぶよりも、Drupalの経験をほとんど提供しないということです。私はその見方が信頼を得ていると思います。Twigイニシアチブを備えたD8のはるかにシンプルなプレゼンテーションレイヤーを楽しみにしています。このようなコードは、基本的にそこに到達するためのばかげたハックです。
areynolds 2013


0

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']配列で不要な要素を非表示にする最良の方法だと思います。


私の古いnoobコードを確認するためにここに戻ってくれて、@ ACDに感謝します。私はあなたが提案した修正を行い、さらにいくつかの改良を加えました(つまり、フォームトークンが実際に含まれていることを確認します)。このコードがどのように機能したか、または機能したかはよくわかりません。フォームが表示されている可能性がありますが、送信できなかったはずです。
areynolds 2013

0

パネルは、プロファイル編集フォームを完全に引き継ぐことができ、少数のパッチ(現在)を使用して、パネル関係としてプロファイル2情報を取り込むことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.