web-dev-qa-db-ja.com

カスタムフォームを作成し、フォームデータをデータベースに保存する

ほんの数日前にDrupalで作業を開始します。私はDrupalで本当にアマチュアです。Drupalテキストボックスまたはチェックボックスでフォームを作成し、値を保存する方法を知りたいだけです。データベース内のフォーム。

PHPの登録フォームスクリプトのように

1
Subhajyoti De

モジュール構造の作成モジュール作成の最初のステップは、モジュールのフォルダーを作成することです。これは_"sites/all/modules/{name of your module}."_に入れる必要があります。「{モジュールの名前}」と言うときはいつでも、モジュールの名前を挿入する必要があることに注意してください。たとえば、モジュールディレクトリ_"sites/all/modules/form_example."_を使用します

次に、_"{name of your module}.module"_および_"{name of your module}.info."_という2つの空のテキストファイルを作成します。

これらの2つのファイルは、モジュールで必要です。 .infoファイルにはモジュールの機能に関する情報が含まれ、.moduleファイルにはフックを含む実際のコードが含まれます。フックは、アクションが発生したときにDrupalによって呼び出される特別な名前を持つ関数です。たとえば、"form_example_menu()"は、メニュー情報が収集されるときに呼び出されます。多くの例では、名前が表示されます。 "hook_menu()"または"my_theme_menu()"などの場合、これらの場合、_"my_theme"_および_"hook"_は、モジュールまたはテーマの名前に置き換える必要があります。

基本モジュールファイルをビルドする

これがform_example.infoファイルに入れるものです。これは、モジュールについてDrupalおよびユーザーに通知します。

_core = "7.x"
description = "An example module used to learn module development and forms creation."
name = "Form Example Module"
_

.infoファイルに追加できるオプションは他にもありますが、上記のオプションを追加する必要があります。

これがform_example.moduleファイルの始まりです。これにより、1つのフィールド(送信ボタン)のみを持つ非常に基本的なフォームが作成されます。

_<?php
function form_example_form($form, &$form_state) {

  $form['submit_button'] = array(
    '#type' => 'submit',
    '#value' => t('Click Here!'),
  );

  return $form;
}
?>
_

注:PHPコードの最後の「?>」部分は含めず、ファイルの最後に空白行を残してください。これはDrupalです。 =標準。

モジュールには現在、フォームを作成する関数が1つ含まれています。関数は入力$ formと参照&$ form_stateを受け取ることに注意することが重要です。この関数は、Drupalがフォーム_"form_example_form."_を構築しようとしたときに呼び出されます

フォームを作成するプロセスは、主に2つのステップです。 1つ目は、すべてのフィールドを含む連想配列$ formを作成することです。 2番目のステップは、その$ form変数を返すことです。

フィールドを追加するには、変数$ form [{フィールドの名前}] = array();を設定します。各フィールドは、_"#type"_や_"#value."_などのいくつかの属性を持つことができます。これらの属性のほとんどには、先頭に「#」記号が付いています。

上記で追加したフィールドは、「ここをクリック!」というテキストの送信ボタンです。ボタンに。 t()はテキストを出力し、Drupal関数であり、Niceを翻訳で再生します。

これでフォームができたので、form_example_form_validateとform_example_form_submitという2つの関数を追加する必要があります。これらの2つの関数は、Drupalがフォームを検証するとき、およびフォームを送信するときに(検証されていると仮定して)呼び出されるフック関数です。

form_example.module:

_<?php
function form_example_form($form, &$form_state) {

  $form['submit_button'] = array(
    '#type' => 'submit',
    '#value' => t('Click Here!'),
  );

  return $form;
}
function 

form_example_form_validate($form, &$form_state) {
}
function 

form_example_form_submit($form, &$form_state) {
}
?>
_

これらの3つの関数は同じ変数を取ることに注意してください。 $ formは元のフォーム情報であり、フォームの元の構造と見なすことができます。 $ form_stateは、送信されたすべての値とその他の情報を保持します。それらの一部は自分で追加できます。これらの2つの関数は、他のフォームと同様に名前を付ける必要がありますが、最後に「検証」と「送信」があります。

フォームを見たい!!!このフォームにメニューリンクを追加します。

_form.example.module

<?php
function form_example_menu() {
  $items = array();


$items['examples/form-example'] = array( //this creates a URL that will call this form at "examples/form-example"
    'title' => 'Example Form', //page title
    'description' => 'A form to mess around with.',
    'page callback' => 'drupal_get_form', //this is the function that will be called when the page is accessed.  for a form, use drupal_get_form
    'page arguments' => array('form_example_form'), //put the name of the form here
    'access callback' => TRUE
  );
  return 

$items;
}
function 

form_example_form($form, &$form_state) {

  $form['submit_button'] = array(
    '#type' => 'submit',
    '#value' => t('Click Here!'),
  );

  return $form;
}
function 

form_example_form_validate($form, &$form_state) {
}
function 

form_example_form_submit($form, &$form_state) {
}
?>
_

モジュールを有効にして、リンクへのアクセスを試みます。おそらくキャッシュをクリアする必要があります。

フォームに機能を追加します。

次に、もう1つのフィールドをフォームに追加します。

_form_example.module

<?php
function form_example_menu() {
  $items = array();


$items['examples/form-example'] = array( //this creates a URL that will call this form at "examples/form-example"
    'title' => 'Example Form', //page title
    'description' => 'A form to mess around with.',
    'page callback' => 'drupal_get_form', //this is the function that will be called when the page is accessed.  for a form, use drupal_get_form
    'page arguments' => array('form_example_form'), //put the name of the form here
    'access callback' => TRUE
  );
  return 

$items;
}
function 

form_example_form($form, &$form_state) {

 $form['price'] = array(
    '#type' => 'textfield', //you can find a list of available types in the form api
    '#title' => 'What is Your Price?',
    '#size' => 10,
    '#maxlength' => 10,
    '#required' => TRUE, //make this field required 
  );


$form['submit_button'] = array(
    '#type' => 'submit',
    '#value' => t('Click Here!'),
    ),
  );

  return $form;
}
function 

form_example_form_validate($form, &$form_state) {
}
function 

form_example_form_submit($form, &$form_state) {
}
?>
_

ここで、新しいテキストフィールドを追加し、必須にしました。最大長も設定しました。フォームを送信しようとすると、Drupalは、ユーザーが必須フィールドに入力しなかった場合、自動的にエラーを生成します。さらに検証を追加します。次のステップ。

検証を追加

_form_example.module

<?php
function form_example_menu() {
  $items = array();


$items['examples/form-example'] = array( //this creates a URL that will call this form at "examples/form-example"
    'title' => 'Example Form', //page title
    'description' => 'A form to mess around with.',
    'page callback' => 'drupal_get_form', //this is the function that will be called when the page is accessed.  for a form, use drupal_get_form
    'page arguments' => array('form_example_form'), //put the name of the form here
    'access callback' => TRUE
  );
  return 

$items;
}
function 

form_example_form($form, &$form_state) {

 $form['price'] = array(
    '#type' => 'textfield', //you can find a list of available types in the form api
    '#title' => 'What is Your Price?',
    '#size' => 10,
    '#maxlength' => 10,
    '#required' => TRUE, //make this field required 
  );


$form['submit_button'] = array(
    '#type' => 'submit',
    '#value' => t('Click Here!'),
    ),
  );

  return $form;
}
function 

form_example_form_validate($form, &$form_state) {
  if (!($form_state['values']['price'] > 0)){
    form_set_error('price', t('Price must be a positive number.'));
  }
}
function 

form_example_form_submit($form, &$form_state) {
}
?>
_

価格が正の数でない限り、フォームが送信されないことがわかります。これを行うには、$ form_state ['values'] [{フィールドの名前}]で、priceの値を確認します。すべてのフィールドに同様の変数があります。

次に、form_set_errorでエラーを設定します。このエラーを追加すると、フォームが検証に合格しなかったことを警告しますDrupal.

フォームが送信されたらどうしますか?この時点から、フォームデータを保存するか、電子メールを送信するか、いくつかの情報を表示します。現時点では、このハウツーの範囲を超えています。

上記の方法を使用していくつかのモジュール「ツール」または「電卓」を構築し、送信機能に計算手順を含めました。変数「$ form_state ['rebuild'] = TRUE;」を設定できます。 Drupalはフォームをクリアしないように、送信関数で使用します。したがって、$ form_stateを編集して、「マークアップ」フィールドタイプを変更して出力することができます。

これはAJAX=でも実行できるため、フォームにページの読み込みなしで計算値が表示されます。これは少し複雑になり、別のハウツーとして追加できます。

結論うまくいけば、これがモジュールの記述やモジュールへのフォームの追加に興味がある人々にとって役立つでしょう。

参照: フォームとメニューリンクを持つ単純なモジュールを作成する方法

4
user36960