メインコンテンツに移動
ホーム

古松

メインナビゲーション

  • ホーム
  • ビデオ
  • ご連絡

パンくず

  • ホーム
  • Drupalのモジュール(Views)でサイト言語に従って検索結果をそれぞれの言語で表示させる方法

Drupalのモジュール(Views)でサイト言語に従って検索結果をそれぞれの言語で表示させる方法

やりたいこと:モジュール(Views)でサイト言語に従ってそれぞれの言語フィールドで表示させたいです

  • 例:中国語単語に、中国語/日本語/英語説明フィールドがDBテーブルにあります
  • モジュール(Views)で中国単語と説明一覧を表示します
  • 多言語サイト(中国語/日本語/英語)でユーザーが自由に言語選択ができます
  • 言語選択に従って中国語の中国語/日本語/英語説明フィールドを表示します
    Viewsでサイト言語選択に従ってそれぞれの言語説明フィールドを表示させます

hook_views_data()で選択された言語に従う言語の説明フィールドを選択してダミーフィールドとして表示させます

  • hook_views_data()実装でモジュール(Views)に様々なカスタマイズができます
    • Drupalのモジュール(Views)のチェックボックスのようなダミーカスタムフィールド作成
  • 上記例と同様にダミーフィールド(description)を追加します
    • 選択されたサイト言語を検出します
    • サイト言語と同じ説明フィールドをクエリにセットします
      /**
       * Implements hook_views_data_alter().
       */
      function drills_ch_vocabulary_views_data_alter(&$data)
      {
        // ダミーフィールド(Description)をViewsに追加
          $data['drills_ch_vocabulary']['description'] = array(
              'title' => t('Description'),
              'help' => t('Description depend on selected language'),
              'field' => array(
                  'handler' => 'field_handler_description',
                  'click sortable' => FALSE,
              ),
          );
      
      }
      
      // サイト言語より説明フィールドを選択し、クエリにセット
      class field_handler_description extends views_handler_field{
          Function query()
          {
              $this->ensure_my_table();
              $params = $this->options['group_type'] != 'group' ? array('function' => $this->options['group_type']) : array();
      
              // サイトの言語検出
              global $language;
              if( $language->language == 'en' ){ // 英語の場合
                  $field_name = "en_desc" ;
              } else if( $language->language == 'ja' ){ // 日本語の場合
                  $field_name = "ja_desc";
              } else {
                  $field_name = "ch_desc" ; // 中国語の場合
              }
      
              // 取得したフィールド名をクエリにセット
              $this->field_alias = $this->query->add_field($this->table_alias, $field_name, NULL, $params);
      
              $this->add_additional_fields();
          }
      }
      
  • 簡単にサイト言語より説明フィールドの選択ができ、クエリにセットすることができます


 

Drupalのモジュール(Views)のチェックボックスのようなダミーカスタムフィールド作成

やりたいこと:モジュール(Views)の検索、表示結果にボタン/チェックボックスのようなダミーフィールドを追加します

  • モジュール(Views)の検索結果のデータに対して何か加工したいことがあります
    • 例:モジュール(Flag)のように選択したノード/ユーザーにフラグを立てたいです
    • そのデータを別のテーブルに追加したり、削除したりすることがあります
  • 今回の実装例は単語検索一覧から自分の単語帳にコピーするロジックをモジュール(Views)に追加します
    モジュール(Views)が検索した結果にチェックボックスのようなフィールドを追加

hook_views_data_alter()の実装でダミーフィールド(チェックボックス)を検索結果に追加

  • 検索結果一覧に何かを追加するにはViewsにカスタムフィールドを追加する必要があります
  • カスタムフィールド追加するには、hook_views_data_alter()を実装すれば良いです
    /**
     * Implements hook_views_api().
     */
    function YOUR_MODULE_NAME_views_api()
    {
        return array(
            'api' => 3,
            'path' => drupal_get_path('module', 'YOUR_MODULE_NAME') . '/views',
        );
    }
    
    /**
     * Implements hook_views_data_alter().
     */
    function YOUR_MODULE_NAME_views_data_alter(&$data)
    {
        $d = $data;
        $data['ch_vocabulary']['add_to_my_vocabulary'] = array(
            'title' => t('Add to My Vocabulary'),
            'help' => t('Add this vocabulary to My Vocabulary'),
            'field' => array(
                'handler' => 'add_vocabulary_to_my_vocabulary_handler',
            ),
        );
    }
    
    /**
     * チェックボックス作成用のハンドル
     */
    class add_vocabulary_to_my_vocabulary_handler extends views_handler_field{
        function render($value){
            $form['add_to_my_vocabulary'] = array(
                '#type' => 'checkbox',
                '#title' => 'Add',
                '#ajax' => array(
                    'callback' => 'add_to_my_vocabulary',
                    'effect' => 'fade',
                    … // ajaxの処理
                ),
            );
            return render($form) ;
        }
    }
    
  • カスタムフィールドをViewsに追加するには、3ステップでできます
    • hook_views_api()の実装でViewsのカスタマイズ開始を宣言します
    • hook_views_data_alter()実装でカスタムフィールド(チェックボックス)を追加します
    • views_handler_fieldの実装でフィールド(チェックボックス)のレンダリングを行います

ダミーフィールド作成時にDBへのクエリを行わないことが記述する必要があります

  • 上記ロジックで実装して、Viewsの設定画面でカスタムフィールド追加後に、DBエラーが発生します
    カスタムフィールドのDBクエリが止めていないため、実テーブルにデータ取得時にエラー発生
  • hook_views_data_alter()でカスタムフィールド追加するときに、実テーブルのフィールドに関連付け設定が必要です("real field")。
  • ダミーフィールドなので、当然実フィールドがないです。定義することはできません。Viewsが実行時にそのカラムが見つからないエラーが発生します
  • ここで、Viewsの実行時にこのフィールドをクエリに加えないよう設定する必要があります
    class add_vocabulary_to_my_vocabulary_handler extends views_handler_field{
        function query()
        {
            // 何もないで、このフィールドをクエリに加えない
        }
    
        function render($value){
            $form['add_to_my_vocabulary'] = array(
                '#type' => 'checkbox',
                '#title' => 'Add',
                '#ajax' => array(
                    'callback' => 'add_to_my_vocabulary',
                    'effect' => 'fade',
                    …
                ),
            );
            return render($form) ;
        }
    }
  • views_handler_fieldの「function query()」をオーバーライドして、何も書かずにすればよいです

検索フォーム

カテゴリ別

  • laravel
  • drupal
  • javascript
  • windows
  • html
  • mysql
  • php
  • apache
  • css
  • SEO
  • video
  • wordpress
  • linux
  • python
  • Electron
  • Visual Studio Code

google ads