not president's blog

脳直で書きます。自分が覚えたい事を書いているだけです。

フォームAPIの続き2

テーマフォーム(theme_form)関数の使用

フォームを好き勝手に変更(位置や内容の追加変更など)
するためのもの。
具体的には位置移動くらいしかわかってません。

まずは前回?定義したフォーム

<?php
/**
    * フォームを定義する
    */
    function simpleform_nameform(){
        $form['user_name'] = array(
        '#title' => t('あなたの名前'),
        '#type' => 'textfield',
        '#description' => t('あなたの名前を入力して下さい')
        );
        $form['animal'] = array(  
            '#prefix' => '<hr />'
            ,'#title' => t('動物')  
            ,'#type' => 'fieldset'  
            ,'#collapsible' => TRUE  
            ,'#collapsed' => FALSE
            ,'#description' => t('ここには動物しかいない!')
            ,'#suffix' => '<div class="privacy-warning">' .
                t('この情報は公共性のある情報だ') . '</div>'
        );
        $form['submit'] = array(
        '#type' => 'submit',
        '#value' => t('Submit')
        );
        return $form;
    }
?>

フォームは要素の順番に表示されるので、出力された時は以下のように見える。 f:id:orenodrupal:20150223230139j:plain そこで、テーマフォームを使用して、要素の位置を変更する。

<?php
/**
    * テーマ関数の使用
    */
     function theme_simpleform_nameform($form){

            $variables['element'] = $form;
            // 動物フィールドを上に持ってくる(divは別にいらない)
            $output = '<div>' . drupal_render($form['animal']).'</div>';
            $output .= drupal_render($form['user_name']);
            $output .= drupal_render($form['submit']);
            
             $output .= drupal_render($form['simpleform_nameform']);
             $variables['element']['#children'] = $output;
             return theme_form($variables);
     }
?>

そして表示する際に、このテーマフォーム関数を使う。

<?php
/**
   * メニューコールバック
   */
   function simpleform_page(){  
    return theme_simpleform_nameform($drupal_get_form('simpleform_nameform'));
   }
?>

するとこうなる。
f:id:orenodrupal:20150223230153j:plain ここまでやるのにずいぶん苦労しました・・・。
テーマフォーム関数を作っても、表示する際(form_page関数内のReturn時)に
テーマフォーム関数を呼んでやらなかったせいで、何度やってもフォームが
表示されなかった・・・。(当然ですが)
参考は以下
theme_form | form.inc | Drupal 7 | Drupal API

続きは次回。今回参考書1ページも進んでいない。