
この記事は、最も単純なモジュールの作成にすでに精通しており、FAPI( Drupal Forms API )の原理を「指で」理解したい人を対象としています。 その中で、Drupalフォームプログラミングインターフェイスの基本を分析し、AHAHと呼ばれるDrupal ajaxエンジンを使用して、入力された名前を返す小さなモジュールを作成します。 この単純なフォームのために、FAPIが必要になります。
なぜこのトピックに関する記事ですか? ネットワーク、特にHabréでは、FAPI を使用したモジュールの例がいくつかあります。 過去の私にとって、フォームがどのように作成されるかを理解することは一定の困難でした。 過去に戻ることはできませんが、同様の困難を経験している人々を助けることができます。
この記事は、Drupalの6.xバージョンに準拠しています。 この記事ではバージョン7を並行して取り上げることを計画しましたが、APIの違いは大きいため、記事のパート2でAPIのバージョン7の同じ機能を説明します。
FAPIフォームを使用する理由
当然、フォームをHTMLの形式で記述し、ページに印刷するか、インクルードファイルとしてモジュールに添付することができます。 ただし、FAPIを使用すると、次の利点が表示されます。
- このフォームでは、検証、Drupalのテーマ設定、AHAHシステム(Ajax、Drupalのバージョン7以降)のテーマを使用できます。
- フォームは、 t()関数を使用して翻訳インターフェースを実行することで翻訳できます。
- フックを介して他のモジュールを編集するためのフォームを提供できます。
- そして、重要なことに、フォームはDrupalフォームの一般的なルールに従ってフォーマットされます。これにより、その後のテーマに合わせて「ネイティブ」になります。
最も単純なモジュールを作成する
モジュールにfastcontactという名前を付けましょう。 フォルダ/サイト/すべて/モジュール/ fastcontactを作成します-これがモジュールのルートフォルダになります。 その中に、 fastcontact.infoとfastcontact.moduleの 2つのファイルを作成します-これで十分です。
.infoで -ファイルを作成します。
; "" name = Fast Contact ; description = Test module for learning FAPI ; version = "6.x-1.0" ; core = "6.x" ; "" project = "fastcontact" ; package = "Other" ; datestamp = "1294001844"
これで、フォームを記述するコードに渡すことができます。
FAPIフォームのフォームと要素
各フォームは関数として記述されます。 この関数は、フォーム要素を含む配列を返します。 配列の各要素はフォーム要素に対応し、名前を持ち、この要素の属性の配列を含みます。 要素とその属性の概要表は 、Drupal API Webサイトで確認できます。
1つのテキストボックスを持つ単純なフォームを作成します。
function fc_form() { $form = array(); // 'name' $form['name'] = array( // '#type' => 'textfield', // '#description' => t(' '), // '#size' => '25', ); // 'submit' $form['submit'] = array( // Submit ( ) '#type' => 'submit', // '#value' => 'Submit', // AHAH ( 6) '#ahah' => array( // click ( JQuery) 'event' => 'click', // , 'path' => 'fastcontact/js', // 'wrapper' => 'fc-form', // ( JQuery) 'method' => 'append', // JQuery 'effect' => 'fade', // 'progress' => array('type' => 'throbber'), ), ); return $form; }
したがって、テキストボックスとAjax(AHAH)で実行される送信ボタンを含むフォームが作成されます。
リクエスト処理
次に、ANANリクエストを処理するための機能を作成する必要があります。 これを行うには、 ahah要素のpath属性で指定されたパスを作成する必要があります(パス'fastcontact / js'を指定した形式で)。 これはhook_menu()を介して行われます。
Drupalは、「メニュー」に何も入力されない場合でも、 メニューモジュールを使用します 。 ただし、ページのパスは保存されます。 メニュー項目も配列を介して作成されます。
/** * hook_menu() */ function fastcontact_menu() { // $items['fastcontact/js'] = array ( // , "" 'page callback' => 'fastcontact_ajax', // 'access arguments' => array('access content'), // 'type' => MENU_CALLBACK, ); return $items; }
メニュー項目のタイプとしてMENU_CALLBACKを指定しました。 これは、このパスの後にサイトメニューからのリンクが続かないようにするためです(これがリクエストを処理する方法です)。
リクエスト処理関数はフォームの作業に直接関係していないため、改良することなく、AHAHを介して単純に返して、モジュールが機能していることを示します。
/* */ function fastcontact_ajax() { // $_POST // check_plain() $name=check_plain($_POST['name']); // ( fc-form) $output = ' <i>'.$name.'</i>.'; // drupal_json(array('status' => TRUE, 'data' => $output)); }
フォーム表示
現在、フォームを収集し、レンダリングに必要なすべての操作を行う必要があります。 まず、フォームを表示する関数を作成します。 このために、 drupal_get_form()が使用されます。
/* */ function render_fc_form() { // $out = drupal_get_form('fc_form'); return $out; }
hook_block()を介してブロックを作成できますが、複雑にならないようにするために、入力フィルターを使用してブロックを作成し、 PHPコードを介してフォームを表示できます。
echo render_fc_form();
モジュールの期待される結果
コードが正常に機能する場合、入力フォームの下に「You Enter a name ...」というフレーズが表示されます。ここでは、ページをリロードせずに、省略記号の代わりに入力した名前になります。