it-swarm-ja.com

ユーザー登録フォームのテーマ

Drupal 7で新しいマークアップを追加するなどして、ユーザー登録フォームのテーマを設定します。方法を理解できないようです。

私は、template.phpでhook_themeを呼び出して、対応するテーマ関数を使用できることを示唆するいくつかのチュートリアルに従ってきました。

_function mytheme_theme(){
  return array(
    'user_register' => array(
      'arguments' => array('form' => NULL),
    ),
  );
}

function mytheme_user_register($form) {
  // print, die, etc
}
_

しかし、これは、theme_user_register()関数で何をしたか、または何回キャッシュをクリアしたかに関係なく、何もしていません。

D7でこれを行う方法について何か考えはありますか?

7
ebeyrent

変更の組み合わせが必要なことがわかりました。

モジュールにhook_form_alter()を実装し、フォームの#themeプロパティを設定する必要がありました。

function mymodule_form_user_register_form_alter(&$form, &$form_state, $form_id) {
  $form['#theme'] = 'user_register';
}

そして、template.php:

function mytheme_theme($existing, $type, $theme, $path){
  return array(
    'user_register' => array(
      'render element' => 'form',
      'template' => 'templates/user-register',
    ),
  );
}

function mytheme_preprocess_user_register(&$variables) {
  $variables['rendered'] = drupal_render_children($variables['form']);
}

次に、必要なマークアップを含むuser-register.tpl.phpを追加し、

<?php echo $rendered; ?> 

フォームを印刷します。

9
ebeyrent

hook_theme() の実装から与えられるテーマ関数の定義は間違っています:

  • Drupal 7では、配列インデックス「引数」は使用されなくなりました。「この場合のように」「レンダリング要素」または「変数」を使用する必要があります。
  • テーマ関数は、Drupal 7の場合、&$variables;あなたの場合は、$form = $variables['form']、以前のポイントでレポートした配列インデックスを使用してテーマ関数を定義すると、 theme_locale_date_format_form()locale_theme() で定義される locale_date_format_form() で定義されるフォームに使用されるテーマ関数で何が行われるかを確認します。または theme_status_report() で、これは system_theme() で定義されています。
3
kiamlaluno

これは、モジュールを実行しなくても可能だと思います。ユーザー登録ページには組み込みのテーマ提案があり、それはpage--user--register.tpl.phpです。

2
Carlos Muñiz

hook_form_alter フォーム要素を変更し、マークアップフォーム要素を追加してカスタムマークアップを追加します。使用するテーマ関数を設定して、独自のカスタムテーマ関数にすることもできます。

詳細は [〜#〜] fapi [〜#〜] を参照してください。

2
googletorp

正確な関数は次のとおりです。

@see hook_form_FORM_ID_alter

function hook_form_user_login_alter(&$form, &$form_state, $form_id) {
  // Modification for the form with the given BASE_FORM_ID goes here. For
  // example, if BASE_FORM_ID is "node_form", this code would run on every
  // node form, regardless of node type.

  // Add a checkbox to the node form about agreeing to terms of use.
  $form['terms_of_use'] = array(
    '#type' => 'checkbox', 
    '#title' => t("I agree with the website's terms and conditions."), 
    '#required' => TRUE,
  );
}
1
Adam S