web-dev-qa-db-ja.com

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

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

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

7
areynolds

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
        ),
    
      );
    }
    

    これは、Drupalテーマ設定システムに、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;
    }
    

    この例では、一般的なアカウント情報フィールド、ユーザーの写真アップロードフィールド(写真が有効な場合)、および送信アクションを「レンダリングされた」という変数に入れます。

  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ファイルの好きな場所に配置して、好きなマークアップを追加します。

7
areynolds

表示スイートは、編集ではなく、表示にのみ使用できます。両方に対応できれば最高でした。

1
rpataca

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

0
ACD

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

0
ergophobe