not president's blog

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

フォームAPIの続き4

form_alterへの復讐

hook_form_alterの実装を試します。
作成されたFormに変更を加える技です。
本来は既存のFormを変更する際に使われますが、
ここでは新しく作ったFormにわざと変更を加えます。

既存のForm情報を表示

1.formファンクションの最後でdebug($form)にてform内容表示。
(ちなみにこのDebugファンクションは適当なソース上に書いても
、配列を引数にしても中身をきれいに表示してくれる、
ものすごく優秀な子です)

<?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>');
    $allowed_keys = array(t('家のカギ'), t('会社のカギ'), t('銀行のカギ'));
    $form['keys'] = array('#type' => 'textfield', '#title' => 'カギ', '#allowed_keys' => $allowed_keys, '#element_validate' => array('simpleform_keys_validate'));
    $form['homestay'] = array('#title' => t('とまる場所'), '#type' => 'textfield', '#description' => t('泊まる場所を記す場所'));
    $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));    
 // フォーム内容を表示
    debug($form);    
    return $form;
}
?>

f:id:orenodrupal:20150329223630j:plain フォームに用意されているフィールド、submit、validateの情報が 表示される。 keysフィールドにはsimpleform_keys_validateが設定されている。

2.hook_form_alterを実装
フォームID_form_alterで実装すると、そのフォームIDが呼び出される際だけ このファンクションも呼ばれる・・・らしい。

<?php
/**
 * hook_form_alter実装
 */
function simpleform_form_alter(&$form, &$form_state, $form_id) {
 // validateを追加
     $form['#validate'][] = 'simpleform_test_alter_validate';
}
/*
 *  Validate
 */
function simpleform_test_alter_validate($form, &$form_state){
        if(!isset($form_state['values']['homestay'][0]['value']) && 
        empty($form_state['values']['homestay'][0]['value'])){
            form_error($form,'test alterエラーのテスト');
        }
  return $form;
}
?>

これでSubmitしてみると。
f:id:orenodrupal:20150329223653j:plain ちなみにさきほど追加したValidateの中でDebug( debug($form['#validate']);)をしてみると、 Validateが追加されているのが確認できる。 f:id:orenodrupal:20150329223705j:plain