メインコンテンツに移動

メインナビゲーション

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

パンくず

  • ホーム
  • Drupalのモジュール(ctools)でのajaxポップアップ(modal)作成の基本

Drupalのモジュール(ctools)でのajaxポップアップ(modal)作成の基本

drupal
customization
development
ctools
menu
modal

今回、画面でポップアップでデータ入力、ajaxでデータを更新することを試みたいですが、jQuery、Bootstrapなどのmodalライブラリで実現ができます。但しDrupalサイトでポップアップを作るとしたら、やはりctoolsのModal機能を利用してみたいです(ctools(Chaos tool suite)はDrualの開発によく利用されているAPI)。

やりたいこと:ポップアップを立ち上げて入力したデータをajaxでサーバーと交信

  • ポップアップ(modal)の作成
  • データ入力フォームの表示
  • 入力されたデータをajaxでサーバーに送信、データ更新

ポップアップ作成の流れの基本:ctoolsのmodal.jsを利用します

  • ポップアップを開くリンク/ボタンの作成
    • ctoolsのmodal.js、modal.cssをこのページに入れる(ajaxで操作するため)
  • ポップアップのリンク/ボタンがクリックされた、ポップアップが開く
  • ポップアップのフォームにデータ入力、送信ボタンクリック
    • 入力されたデータをサーバーにajaxで送信、データ更新される

ctoolsのmodal利用の問題点

  • ctoolsのmodal利用に関する紹介はウェブ上にたくさんあります。また、インストールされたctools(modules\ctools\ctools_ajax_sample\ctools_ajax_sample.module)にサンプルプログラムもあります
  • 問題点1:ポップアップに表示されるフォームはjavascriptでhtmlコードとして吐き出されています(modules\ctools\ctools_ajax_sample\js\ctools-ajax-sample.js)
    • 簡単なフォームに問題はないが、複雑なフォームに煩雑になります
  • 問題点2:ポップアップウィンドウに関する設定はphpソースコード内で定義
    • ロジックとUI設定を分離しべき、ポップアップに関する設定はcss、jsに任せるべき

ctoolsのmodal利用の改善

  • 上記問題1は、DrupalのForm APIを利用して、フォーム作成を行います
  • 上記問題2は、ポップアップの外観はサイト全体のテーマ(bootstrap)に統一し、背景、フォントサイズなどはcssファイルで個別に設定します

ポップアップの作成

  • ポップアップを起動するリンク/ボタンの作成は省略します
  • ポップアップとの通信URLをhook_menuで作成
    $items['my-module/%ctools_js/add'] = array(
    	'page callback' => 'my_module_callback',
    	'page arguments' => array(1),
    	'access callback' => TRUE,
    	'type' => MENU_CALLBACK,
    );
  • URLの設定に「%ctools_js」部分があります。ここで、'nojs'の定数を入力する必要はあります。例:http://your-site/my-module/nojs/add
  • ポップアップの起動リンク/ボタンのクラス属性: class="ctools-use-modal"をセットします(これがないと、Modalポップアップの起動はできないです)
  • ページのコールバック関数(my_module_callback)の作成
    function my_module_callback($ajax) {
        if ($ajax) {
    		// ctoolsのajax、modalに関するjsファイルをクライアントへ
            ctools_include('ajax');
            ctools_include('modal');
    		
    		//フォーム作成に関する上方
            $form_state = array(
                'ajax' => TRUE,
                'title' => t('New Group Creation'),
            );
    
    		//ポップアップフォームの作成
    		//フォームからの更新データを$form_stateにセットする
            $output = ctools_modal_form_wrapper('my_module_form', $form_state);
    
    		//新規ポップアップにajaxが有効にする
            if (!empty($form_state['ajax_commands'])) {
                $output = $form_state['ajax_commands'];
            }
    
    		//ポップアップの出力
            print ajax_render($output);
            drupal_exit();
        }
        else {
            return drupal_get_form('mymodule_form');
        }
    }
    // ポップアップにある入力フォームの定義
    function my_module_form($form, $form_state) {
        $form = array();
    
        $form['new_link_text'] = array(
            '#type' => 'textfield',
            '#title' => t('Group Name'),
        );
    
        $form['submit'] = array(
            '#type' => 'submit',
            '#value' => t('Submit'),
        );
    
        return $form;
    }
    // データ更新
    function my_module_form_submit(&$form, &$form_state) {
        // データの更新
        // ロジックは省略
    
        // ポップアップを閉じるコマンド
        $form_state['ajax_commands'][] = ctools_modal_command_dismiss();
    }
  • 注目すべき関数の役割: ctools_modal_form_wrapper
    • 定義されたフォーム(my_module_form)をレンダリング可能にする
    • ajaxからのデータ送信情報を$form_stateに設定
    • hook_form_submitなどの起動

 

 

drupal
development
ajax

やりたいこと:Drupalのプログラムレベルで簡単にajaxを利用してクライアント側でデータ交信をしたいです

  • 環境:Drupal7.54
  • DrupalのFormAPIで簡単にajaxの実装ができます(Drupalのフォーム(FromAPI)でのajaxの実装 )
  • FormAPIだけではなく、Drupalをカスタマイズ時にいろいろなところでajaxを実装したいことがあります

ポイント1:Drupalでajaxに必要なライブラリをロードし、クライアント側にjquery.form.jsファイルをセット

  • サーバー側でdrupal.ajaxのライブラリをロードする必要があります
  • クライアント側にjquery.form.jsファイルを設置する必要があります
  • この処理はajax処理するページをロード時に行えれば良いです。
    • 例:hook_init()内で処理する
      /**
       * Implements hook_init().
       */
      function YOUR_MODULE_NAME_init()
      {
        drupal_add_js('misc/jquery.form.js');
        drupal_add_library('system','drupal.ajax');
      }
  • クライアント側のブラウザのプロパティでjquery.form.jsがセットされたことの確認ができます

ポイント2:クライアント側のajax起動リンク内にajax対応可否のパラメーター「nojs」とクラス属性「use-ajax」のセット

  • ajaxの起動リンクの作成基本パターン: 
    <a href="text/ajax/nojs/1234" class="use-ajax">ajaxリンク</a>
    • hrefにある「nojs」が決まりの文字
    • hrefにある「1234」はサーバー側に転送したい必要なパラメーター
    • class="use-ajax"はこのリンクがajax用に決める
  • クライアント側のjsで使用しているブラウザがajax対応可能かを判断して、ajax起動リンクに「nojs」のパラメーターを書き換え(利用可能:nojs⇒ajax)てサーバー側に転送
  • サーバー側がajax利用可否よりクライアント側にajax対応有無の結果を返します
    Drupalのajaxフレームワークの利用
  • 上記例のプログラムは以下のようで
    /**
     * Implements hook_init().
     */
    function test_module_init()
    {
      drupal_add_js('misc/jquery.form.js');
      drupal_add_library('system','drupal.ajax');
    }
    
    /**
     *  Implementation of hook_menu()
     */
    function test_module_menu() {
      $items['test/ajax/%/%']=array(     // URLの2,3番目がクライアント側で生成
          'page callback' => 'ajax_node_response',
          'page arguments' => array(2,3),   // URLの2,3番目の引数をコールバック関数に渡す
          'access callback' => 'user_access',
          'access arguments' => array('access content'),
          'type' => MENU_CALLBACK,
      );
      return $items;
    }
    
    function ajax_node_response($type="ajax", $nid=0){
      $node = node_load( $nid, NULL, false );
      $vnode = node_view($node);
      $output = theme('node', $vnode);
      if( $type="ajax" ){
        $commands=array();
        $commands[]=ajax_command_replace( '#block-system-main','<section id="block-system-main">'.$output.'</section>' ) ;
        $page = array(
          '#type' => 'ajax',
          '#commands' => $commands,
        );
        ajax_deliver( $page ) ;   // ajax対応ブラウザの結果
      } else {
        $output = '<div id="content">'.$output.'</div>';  // ajax非対応ブラウザの結果
        return $output;
      }
    }
    

ポイント3:クライアント側で実行させたい部分はajax_commandを使用します

  • クライアント側で処理結果をどこに入り替えはajax_command_replaceで指定します
  • 結果の挿入、入れ替え、削除、css処理などがいろいろあります。詳細は本家のajax_command一覧を参考してください

 

ホーム

古松

検索

Article Category

  • apache(7)
  • css(19)
  • drupal(295)
  • Electron(4)
  • html(34)
  • javascript(27)
  • laravel(4)
  • linux(5)
  • macOS(2)
  • mysql(13)
  • php(19)
  • python(4)
  • SEO(12)
  • video(72)
  • Visual Studio Code(4)
  • windows(13)
  • wordpress(32)