メインコンテンツに移動

メインナビゲーション

  • ホーム
  • サイトマップ
  • ビデオ
  • ご連絡

パンくず

  • ホーム
  • フォームのカスタマイズ時にform_idの取得方法

フォームのカスタマイズ時にform_idの取得方法

drupal
drupal
form
development

フォーム(form)をカスタマイズ時に、hook_form_alter、hook_form_FORM_ID_alter、hook_form_BASE_FORM_ID_alterの何れかを実装して行います。ここで、既存のフォームを特定するために、そのform_idが必要となってきまして、どこでカスタマイズ先のフォームIDを取得するのかは戸惑いました。

例えば、LDAPモジュールをインストールして、認証関連設定ページ(Home » Administration » Configuration » People » LDAP Configuration のAUTHENTICATIONタブ)で、その設定フォームのform_idを見てみましょう。

  • ソースコードをよく読んでみましたが、form_idに関する記述はどこにも記述してないようで、どのようなIDを利用すればよいかはさっぱりわかりませんでした。
  • Develモジュール(7.x-1.5)がインストールされていた前提で、hook_form_alter(&$form, &$form_state, $form_id)関数に、渡された引数$formの中身を出力( dpm($form) )してみました。
  • ここで、三つのform_idが出てきました、どれを利用するのでしょうか。
    • #form_id = ldap_authentication_admin_form
    • form_id -> #id = edit-ldap-authentication-admin-form
    • #id = ldap-authentication-admin-form
  • ブラウザーでこの設定画面のform_idを探してみました、上記#id(ldap-authentication-admin-form)は設定フォームの属性IDに使用されていることが分かりました
  • form_id -> #id (edit-ldap-authentication-admin-form)のタイプが「hidden」なので、クライアントとサーバーとのデータ交信用だと思います
  • hook_form_alterで使用すべきのは#form_id = ldap_authentication_admin_formだと思います。このIDは、実際にhook_formを実装する関数名でした
  • Drupalがフォームをビルドするとき、上記IDを生成して、各IDにそれぞれの意味があり、間違わないよう使用しなければならないです。
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
customization
development
menu

hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。

やりたいこと

  • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)へのユーザー権限管理実装
  • 管理者がユーザーのロールよりカスタマイズしたページへのアクセス管理ができます

アクセス権限:既存とカスタム2種類

  • 'access callback'と'access arguments'設定より特定なユーザーアクセスを制御します
    • 'access callback' => 'user_access'、 'access arguments' => array('access content') コンテンツの参照権限(すべてのユーザがこの権限を有するべき)
    • 'access arguments'の設定値はアクセス権限一覧を参考してください
  • hook_permissionを実装して、権限管理ページ(Home » Administration » People » Permissions)でアクセス権限を管理します
    • ​下記の例で詳細に実装方法を説明します

'access callback'と'access arguments'の違い

  • 'access callback': 関数名(例:'user_view_access')として設定、関数('user_view_access')が呼び出され、ユーザーがこのページにアクセス権限があるか否かを判断する機能となります
    • 初期値('access callback'が定義されていない場合): 'user_access'
    • 例:'access callback' => TRUE が設定された場合、すべてのユーザーがアクセス可能、この時'access arguments'の設定は不要
    • '例:'access callback' => 'user_is_logged_in' の場合、関数user_is_logged_inが呼び出され、True/Falseの判断結果を 'access callback'に返します
  • 'access arguments': 配列構造、特定の権限/ロールを'access callback'に設定された関数に、引数として渡す機能となります
    • ​'access callback' => 'user_access' , 'access arguments' => array('administer users') で設定した場合以下の権限設定となります
      • ​create entries
      • delete any entry
      • delete own entries
      • edit any entry
      • edit own entries
    •  配列に整数の設定(例:'access arguments' => array(1))ができます。この場合、URLのパラメータを参照して、​'access callback'に設定された関数に渡します
      • ​URL例: 'foo/bar/user'
      • array(0)は'foo'、array(1)は'bar'、array(2)は'user'を引数として'access callback'に設定された関数渡します

「access arguments」設定とhook_permissonでアクセス権限を制御

  • 「access arguments」関数に、hook_permissionを実装したファンクションを渡すこともできます
    • 例: 'access arguments'  => array('authorize fbauth_connect') 
    • hook_permissionを実装したファンクションは以下のようで(実に簡単の数行だけ)
      /**
       * Implements hook_permission().
       */
      function [my-module-name]_permission() {
        return array(
            'authorize fbauth_connect' => array(
                'title' => t('Connect Facebook account and store access token'),
            ),
        );
      }
      
    • ​アクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)に、このページへのアクセス権限管理が現れます
    • アクセス権限管理ページで、ユーザーのロールより定義したページへのアクセス管理ができます。
drupal
drupal
form
development

フォーム(form)をカスタマイズ時に、hook_form_alter、hook_form_FORM_ID_alter、hook_form_BASE_FORM_ID_alterの何れかを実装して行います。ここで、既存のフォームを特定するために、そのform_idが必要となってきまして、どこでカスタマイズ先のフォームIDを取得するのかは戸惑いました。

例えば、LDAPモジュールをインストールして、認証関連設定ページ(Home » Administration » Configuration » People » LDAP Configuration のAUTHENTICATIONタブ)で、その設定フォームのform_idを見てみましょう。

  • ソースコードをよく読んでみましたが、form_idに関する記述はどこにも記述してないようで、どのようなIDを利用すればよいかはさっぱりわかりませんでした。
  • Develモジュール(7.x-1.5)がインストールされていた前提で、hook_form_alter(&$form, &$form_state, $form_id)関数に、渡された引数$formの中身を出力( dpm($form) )してみました。
  • ここで、三つのform_idが出てきました、どれを利用するのでしょうか。
    • #form_id = ldap_authentication_admin_form
    • form_id -> #id = edit-ldap-authentication-admin-form
    • #id = ldap-authentication-admin-form
  • ブラウザーでこの設定画面のform_idを探してみました、上記#id(ldap-authentication-admin-form)は設定フォームの属性IDに使用されていることが分かりました
  • form_id -> #id (edit-ldap-authentication-admin-form)のタイプが「hidden」なので、クライアントとサーバーとのデータ交信用だと思います
  • hook_form_alterで使用すべきのは#form_id = ldap_authentication_admin_formだと思います。このIDは、実際にhook_formを実装する関数名でした
  • Drupalがフォームをビルドするとき、上記IDを生成して、各IDにそれぞれの意味があり、間違わないよう使用しなければならないです。
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
drupal
form

Drupalのフォーム(From API)が各要素の動作制御(JavaScript)が可能です

  • FormAPIで簡単に要素間の動作制御(JavaScriptの拡張)ができます。
  • 例えば、2選択肢の一方が選択された、その選択肢に応じるよう別の要素を表示させたい場合、Javascriptで実現する必要があります。ここで、Drupalのform配列にJavaScriptの拡張を記述する「states」を利用すれば良いです

 

FormAPIでフォーム作成記述に「#states」でjavascriptの拡張を自動的に行います

  • 上記コードは以下のとなります
/**
 * Implement hook_form
 */
function your_custom_form($node, &$form_state) {
  $form['type'] = array(
    '#type' => 'radios',
    '#options' => array(
      'agree' => t('賛成'),
      'disagree' => t('反対'),
    ),
    '#title' => t('投票してください'),
  );
  $form['survey'] = array(
    '#type' => 'fieldtext',
    '#title' => t('反対意見'),
    '#states' => array(
      'visible' => array(
        ':input[name="type"]' => array('value' => 'disagree'),
      ),
    ),
  );
}
  • 実際に、「states」部分の記述はjQueryのセレクターを利用して、参照先の動きをキャッチし、要素の属性を制御します。
  • jQueryのセレクターとその属性のキャッチ方法は以下のようなに行います
  • 「states」の記述で二つの要素(ラジオボタンと入力テキストボックス)の制御ができるようになります。
  • 以下の要素属性が「states」に記述することが可能です:
    • enabled
    • disabled
    • required
    • optional
    • visible
    • invisible
    • checked
    • unchecked
    • expanded
    • collapsed
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:FormAPIよい定義されたフォームを必要な時にphpコードより呼び出したいです

  • 環境:Drupal7.54
  • FormAPIでフォームを定義すると、通常はhook_menuよりページとして呼び出されます(一般的な使い方)
  • Drupalのモジュールを改造するときに、HTMLタグでフォームを作成するより、FormAPIでフォームを生成するのは楽で、修正にも簡単でできます

関数:drupal_get_formでFormAPIより定義したフォームを簡単に呼び出し、レンダリングすることができます

  • 例:Panelsでページを構成するときに、PanelsPHPを利用してフォームを作成したいです
    drupalの関数(drupal_get_form)の使用
  • カスタムモジュールのどこか(module_load_includeでフォーム定義のファイルをロード)にフォームが定義すれば呼び出すことができます
      module_load_include('inc', 'node', 'node.pages');  // フォームの定義場所指定    
      $form = drupal_get_form('text_module_form');
      print drupal_render( $form );

     

drupal
development
form
ajax

やりたいこと:DrupalのAJAXでマルチステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIのAJAXを利用して、マルチステップフォームの作成
  • FormAPIでマルチステップフォームの作成ができます(DrupalのFormAPIでマルチステップフォーム作成の基本 )
  • マルチステップフォームの作成には、AJAXの方が有利です
    • フォームHTMLの部分を置換すればよいので、全体的なページの更新必要はありません(パフォーマンスが良い)
    • AJAXがサーバーサイトとの交信URLが隠されています
    • DrupalのAJAXフレームワークを直接の利用で、簡単に実現できます(各ステップのフォームを直接に指定することができ、考え方が明確的)

DrupalのAJAXのdrupal_command_replace関数でフォームを置換してマルチステップフォームを作成します

  • DrupalのAJAXの利用は:Drupalのフォーム(FromAPI)でのajaxの実装 を参考してください
  • 各ステップのフォームがAJAXのコールバック関数内で定義しますので、FormAPIの実装方法より明確的になります
    DrupalのAJAXでマルチステップフォームの作成
  • AJAXで実装したマルチステップフォーム(ステップ1とステップ2の交替表示)例
    /**
     *  メニューでURLの定義
     */
    function your_module_menu() {
      $items['form/multiple-step'] = array(
          'title' => t('Multiple Step Form Test'),
          'page callback' => 'drupal_get_form',
          'page arguments' => array('page_one_form'),
          'access arguments' => array('access content'),
      );
      return $items;
    }
    
    /**
     *  ステップ1 フォームの定義
     */
    function page_one_form( $form, &$form_state ){
    
      $form['message_field'] = array(
          '#type' => 'markup',
          '#markup' => 'Form Step 1',
      );
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_1_ajax_callback',
          ),
      );
    
      return $form;}
    }
    
    /**
     *  ステップ2 フォームの定義
     */
    function page_two_form( $form, &$form_state ){
    
      $form['test_form']=array(
          '#type' => 'item',
          '#title' => 'Multiple Step Form',
          '#markup' => '<p>Step 2</p>',
      );
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
    	  '#ajax' => array(
            'callback' => 'card_2_ajax_callback',
          ),
      );
    
      return $form;
    }
    
    /**
     *  ステップ1のコールバック関数
     */
    function card_1_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_two_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main',
    		'<section class="block block-system clearfix" 
    				 id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    
    /**
     *  ステップ2のコールバック関数
     */
    function card_2_ajax_callback($form, &$form_state){
     // 次のステップのフォームの用意
      $form =  drupal_rebuild_form( 'card_one_form', $form_state );
     // フォームのHTML部分の置換コマンド用意
      $commands[]=ajax_command_replace( '#block-system-main','<section class="block block-system clearfix" id="block-system-main">'.render($form).'</section>' );
    
      return array('#type' => 'ajax', '#commands' => $commands);
    }
    

     

drupal
development
form

やりたいこと:一つのURLで複数のステップフォームを作成したいです

  • 背景:Drupal7.54、FormAPIでマルチステップフォームの作成
  • FormAPIで簡単にフォームを作成します(例:Drupalの関数(drupal_get_form)を利用してFormAPIで作成したフォームを任意の場所でPHPに呼び出されることができます )
  • 一つのURLで複数のステップフォームを作成する要望があります

FormAPIでマルチステップフォーム作成の要点:「$form_state」でステップの定義、「form_submit()」関数内でステップの判別とフォームの再構築

  • FormAPIでマルチステップフォームを作成時に二つの要点ああります
  • 「$form_state」オブジェクトに任意のステップ識別変数を追加します(例:$form_state['pager'])
    • もちろん、$form_state['storage']の利用も可能です
    • 各ステップのフォームで識別文字列を定義します(例:$form_state['pager']='page_1')
  • 各ステップフォームの送信/次へボタンが押されたら、イベントをキャッチするform_submit()関数内でステップの判別、フォームの再構築を行います
    • ステップの判別: if($form_state['pager']=='page_1')
    • 次のステップのフォーム定義: $form_state['pager']=='page_2'
    • フォームの再構築: $form_state['rebuild']==TRUE
      DrupalのFormAPIでマルチステップフォームの要点
    • マルチステップのサンプルプログラム(送信ボタンを押すとステップ1とステップ2を交替で表示する)
      /**
       *  メニューでURLの定義
       */
      function your_module_menu() {
        $items['form/multiple-step'] = array(
            'title' => t('Multiple Step Form Test'),
            'page callback' => 'drupal_get_form',
            'page arguments' => array('multiple_step_form'),
            'access arguments' => array('access content'),
        );
        return $items;
      }
      
      /**
       *  マルチステップフォームの定義
       */
      function multiple_step_form($form, &$form_state){
      	switch( $form_state['pager'] ) {
              case  'page_1'  :
              return page_one_form();
              break;
      
              case  'page_2'  :
              return page_two_form();
              break;
      	}
      }
      
      /**
       *  ステップ1 フォームの定義
       */
      function page_one_form( $form, &$form_state ){
       // ステップの定義
        $form_state['pager'] = "page_1";
       // 任一のメッセージ表示
        $form['message_field'] = array(
            '#type' => 'markup',
            '#markup' => 'Form Step 1',
        );
        // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_one_form_submit';
      
        return $form;}
      }
      
      /**
       *  ステップ2 フォームの定義
       */
      function page_two_form( $form, &$form_state ){
        // ステップの定義
       $form_state['pager'] = "page_two";
       // 任一のメッセージ表示
        $form['test_form']=array(
            '#type' => 'item',
            '#title' => 'Multiple Step Form',
            '#markup' => '<p>Step 2</p>',
        );
       // サブミットボタン
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => '送信',
        );
       // サブミットボタンのイベントハンドラー
        $form['#submit'][] = 'page_two_form_submit';
        return $form;
      }
      
      /**
       *  ステップ1のボタンイベントハンドラー
       */
      function page_one_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_two";
        $form_state['rebuild'] = true;
        return ;
      }
      
      /**
       *  ステップ2のボタンイベントハンドラー
       */
      function page_two_form_submit($form, &$form_state){
        $form_state['pager']['card_page']= "page_one";
        $form_state['rebuild'] = true;
        return ;
      }

       
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
development
form

やりたいこと:Drupalのフォーム(FormAPI)でajaxを実装して各フォーム要素を動的に制御したいです

  • 環境:Drupal7.54
  • フォーム(FormAPI)で各要素の表示/非表示などの制御が簡単にできます(Drupalのフォーム(Form API)の「#states」で各フォーム要素の動作制御が可能)。
    • フォームを作成時にJavascriptを意識しなくてよい
    • 事前にフォームの要素を用意して表示/非表示のようなお動作制御
    • データ取得するなどの動作制御はできません
  • ajaxで高等な動作(データ取得など)制御ができるので、FormAPIもこれ基盤を用意して、簡単に実装できます。

FormAPIで「#ajax」の記述(ポイント:callback、wrapper)だけで良いのでJavascriptの意識必要はありません

  • FormAPIがajaxのインターフェースを用意しています。Form記述で「#ajax」要素を追加すれば、Javascriptなどのコーティングはいらないです
    • callbak:ajaxのリクエストが来た時に呼び出される関数
    • wrapper:ajaxのサーバー処理完了後に結果を画面に表示させる場所の指定
  • 簡単の例:テキスト入力フォームを生成して、入力したメッセージを画面のどこかに再表示させるajax処理
    FormAPIのajaxの実装方法
  • ajaxの記述はFormAPIの実装時に追加します。
    /**
     *  Implementation of hook_menu()
     *  新規フォームを表示するページのメニュー設定
     */
    function my_module_name_menu() {
      $items['test/form'] = array(
          'title' => 'Ajaxテスト',
          'page callback' => 'drupal_get_form',
          'page arguments' => array('my_sample_form'),
          'access arguments' => array('access content'),
      );
    }
    
    /**
     * フォームの各要素の記述
     */
    function my_sample_form($form, &$form_state){
      // メッセージ入力フィールド
      $form['message'] = array(
          '#type' => 'textfield',
          '#title' => t('メッセージを入力'),
      );
    
      // 入力されたメッセージをajaxで表示する場所
      $form['msg_wrapper'] = array(
          '#type' => 'markup',
          '#markup' => "",
          '#prefix' => '<div id="msg-wrapper">',
          '#suffix' => '</div>',
      );
    
      // サブミットボタン
      $form['submit'] = array(
          '#type' => 'submit',
          '#value' => '送信',
          '#ajax' => array(
              'callback' => 'test_sample_form_ajax_callback',
              'wrapper' => 'msg-wrapper',
              'effect' => 'fade',
          ),
      );
    
      return $form;
    }
    
    /**
     * ajaxに呼び出される関数
     */
    function test_sample_form_ajax_callback($form, $form_state) {
      // 入力されたメッセージを指定した場所にセット
      $form['msg_wrapper']['#markup'] = '入力されたメッセージ:' .
                  check_plain($form_state['values']['message']) ;
      // 置換する部品を返す
      return $form['msg_wrapper'] ;
    }

     
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
drupal
customization
drupal
form

drupal_get_formがよく見かける

  • hook_menu()のプロパティ’page callback’がよく’drupal_get_form’を呼び出します
    function node_menu() {
      $items['admin/content'] = array(
        'title' => 'Content', 
        'description' => 'Find and manage content.', 
        'page callback' => 'drupal_get_form', 
        'page arguments' => array('node_admin_content'), 
        'access arguments' => array('access content overview'), 
        'weight' => -10, 
        'file' => 'node.admin.inc',
      );
    
      // …
    
      return $items;
    }
  • ほかにdrupal_prepare_form, drupal_retrieve_form関数がよく見かけますが、drupal_get_fromとの違いは?

drupal_get_formがretrieving、processing過程を含め、HTMLフォームの取得に対して、drupal_retrieve_formはフォームの構造のみを取得する

  • drupal_get_formが最初にキャッシュにこのフォームがあるか否かをチェックして、フォームを取得する
    • もしキャッシュにある場合、form_get_formを呼び出してフォームを返す。
    • もしキャッシュにない場合、drupal_retrieve_formを呼び出してフォームの構造(array、HTMLではない)を取得し、drupal_prepare_formでフォームを返す
  • Drupal7のForm APIのワークフローの詳細説明
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクシ