not president's blog

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

フォームAPIの続き3

検証関数内での値保存

検証関数内で値を保存する方法の一つとして、form_set_value関数が使用できる。
まずはフォームで入力ボックスを定義。

<?php
    /**
    * フォームを定義する
    */
    function simpleform_nameform(){
            // ~ここまで省略
        // 検証関数で保存
        $form['homestay'] = array(
            '#title' => t('とまる場所')
            ,   '#type' => 'textfield'
            ,   '#description' => t('泊まる場所を記す場所')
        );
        // ~ここからも省略
    }
?>

上の検証関数を定義する。
値がある時だけ、$form_stateに値を保存する。

<?php
    /**
    * フォームを検証する
    */
     function simpleform_nameform_validate($form,&$form_state){
        // #parentプロパティに配列を持たせる
        $form['homestay']['#parents'] = array('homestay');
        // 値がある時だけ
        if(!is_null($form_state['values']['homestay']))
        {
            // 変数に値を入れる
            $homestay_value = $form_state['values']['homestay'];
        }else
        {
            $homestay_value =  0;
        }
        // 値があるときだけ
        if($homestay_value){
            // $form_stateに値を保存
            // homestay配列の0番目Valueに値を入れる
            form_set_value(
                $form['homestay']
                , array(
                    0 => array(
                        'value' => $homestay_value
                    )
                )
            , $form_state);
        }else{
            form_set_error('homestay',
            t('泊まる場所を書いてくれ'));       
        }
     }
?>

Submitを定義する。
ここで$form_stateの値が使える。
form_set_valueで保存したデータは
$form_state['values'}配列に入っている。

<?php
     function simpleform_nameform_submit($form,&$form_state){
        
        // ~ここまで省略
        // $form_stateから値を取得
        drupal_set_message(t('使ったカギは,%key',
        array('%key' => $form_state['values']['homestay'][0]['value'])));
        return;
      }
?>

これで泊まる場所テキストボックスに値を入れてSubmitすると f:id:orenodrupal:20150302225937j:plain こうなる f:id:orenodrupal:20150302225945j:plain 参考はDrupalAPI
[URL]

Drupal API

フォーム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ページも進んでいない。

正直にも生きたい

Wikipediaから

http://ja.wikipedia.org/wiki/%E6%AD%A3%E7%9B%B4(url)

  • 概要
    日本人の伝統的な徳目の一つである

フォームAPIの続き

  • フォームID
    フォームは一意で識別される必要がある。
    例として
    drupal_get_form('simpleform_nameform')
    で定義される。
    このフォームIDはHTMLのFormタグのIDとして記述される。

f:id:orenodrupal:20150216224151j:plain

  • フィールドセット
    HTML内の仕切りをDrupalで実装する。
    $fromのTypeにfieldsetを指定すると、仕切りができるようになる。
<?php
$form['animal'] = array(  
    '#title' => t('動物')  
    ,'#type' => 'fieldset'  
    ,'#weight' => 5  
    ,'#collapsible' => TRUE  
    ,'#collapsed' => FALSE
    ,'#description' => t('ここには動物しかいない!')
);  
?>

こんな感じになる。 f:id:orenodrupal:20150216223826j:plain
タイトルを選択すると閉じる。
f:id:orenodrupal:20150216223848j:plain

Android開発環境構築

環境のメモ

とりあえずAndroidプリプロジェクトが作成可能になるところまで見て、
終了。

こちらを参考にさせていただきました。
http://nobuo-create.net/android-develop/(URL)

NDKについてはこちらを参考にさせていただきました。
(途中であきらめたけど)
http://blog.kotemaru.org/2014/04/02/android-ndk-setup.html(URL)

[補足]

EclipseをDLした後、解凍しようとするとエラーが出た。
が、解凍後正常にEclipseを起動できたため、気にしない。

[補足2]

EclipseにNDKプラグインを入れようとしたが、新規ソフトウェア
インストールでURLを入れても表示されなかった。
→手動でDLしてExe実行すればいいみたい
 作成されたフォルダは適当において、
 Eclipse→ウィンドウ→設定→Android→NDKでパス指定。

[補足3]

参考サイト(http://blog.kotemaru.org/2014/04/02/android-ndk-setup.html(URL))
を見ながらサンプル実行しても、うまくいかなかった。
→Includeでエラーが出ているので、ライブラリが足りていない?
 →新規ソフトウェアインストール時に、
  「C/C++ ライブラリーAPIライブラリー~」が出てこなかった。
  よくわからないのでいったんNDKはあきらめる。
  (Java開発の勉強予定でもあるし・・・)

丁寧に生きたい

Goo辞書から

http://dictionary.goo.ne.jp/leaf/jn2/150309/m0u/

(url)
1 細かいところまで気を配ること。注意深く入念にすること。また、そのさま。「アイロンを―にかける」「壊れやすいので―に扱う」
2 言動が礼儀正しく、配慮が行き届いていること。また、そのさま。丁重(ていちょう)。「―な言葉遣い」
3 文法で、話し手が聞き手に対して敬意を表す言い方。→丁寧語

コトバンクから 

https://kotobank.jp/word/%E4%B8%81%E5%AF%A7-574644

(url)
[名・形動]
1 細かいところまで気を配ること。注意深く入念にすること。また、そのさま。「アイロンを―にかける」「壊れやすいので―に扱う」
2 言動が礼儀正しく、配慮が行き届いていること。また、そのさま。丁重(ていちょう)。「―な言葉遣い」
3 文法で、話し手が聞き手に対して敬意を表す言い方。→丁寧語

Wikipediaから 

http://ja.wikipedia.org/wiki/%E4%B8%81%E5%AF%A7_(%E5%8D%93%E7%90%83%E9%81%B8%E6%89%8B)

(url)

丁寧(てい ねい、ディン ニン、Ding Ning 1990年6月20日-)は、中国黒竜江省大慶市出身の卓球選手。身長172cm。2014年12月時点の世界ランクは1位。

※参考書のサンプルを編集して載せていましたが、
あんまりよくなさそうなので、一旦消しました。
次回以降、載せるものは考えます。

フォームAPIの始まりの続き

2.フォーム処理について~の続き

⑪フォームのテーマ関数検出
 $form['#theme']に既存関数が設定されていれば、それをフォームの
 テーマ化に使用する。
 なければ、このフォームIDに対尾するエントリをテーマレジストリから
 調べる。エントリが検出されれば、フォームIDが$form['#theme']に代入
 され、レンダリングする際にそのIDに基づいてテーマ関数を探す。

⑫モジュールによるレンダリング前のフォーム変更
 $form['#pre_render']プロパティに定義されたあらゆる関数は、コールされ、
 レンダリングされているフォームが渡される。

⑬フォームのレンダリング
 drupal_render()をコールする。
 1.$childeren要素が定義されているか判定
 2.要素が未レンダリングの場合、#typeのデフォルトテーマ関数を
   コールする。
 3.要素が生成されていて、1つ以上の関数名が#post_renderプロパティ
   にある場合は各関数をコールし、コンテンツと要素を渡します。
   #post_render関数は、最終的なコンテンツを返す必要がある。
 4.コンテンツの先頭に#prefixを、末尾に#suffixを付加し、関数から
   それを返します。

 →最終的に生成されたHTMLは、drupal_get_form()コール元に返される。
 

ここまで書いてみるに、内容が全然頭に入ってません。