テーブルなしのカスタムビューハンドラー


22

これは最初は簡単に思えたが、これで髪が抜けてしまった。

テーブルを使用しないカスタムビューハンドラを追加したいだけです。

phpが提案したビュー、hook_views_dataの$ data ['views'] ['mycustomfield']を実行しようとしましたが、それでも「mycustomfield colum not found」です。

何か助け?ありがとう!

回答:


26

実際には簡単です。で利用可能な実装ビューグローバルハンドラーを見てくださいviews.views.incください

以下は、テーブルがなくてもフィールドハンドラを追加する方法の例です。

  1. 以下のように、hook_views_dataでカスタムハンドラーを指定します。

    /**
     * Implements hook_views_data().
     */
     function my_module_views_data() {
       $data['custom']['table']['group'] = t('Custom');
       $data['custom']['table']['join'] = array(
         // #global is a special flag which let's a table appear all the time.
         '#global' => array(),
       );
    
       $data['custom']['custom_handler'] = array(
         'title' => t('Custom Handler'),
         'help' => t('Custom Handler.'),
         'field' => array(
           'handler' => 'views_handler_custom_handler',
         ),
       );
    
       return $data;
    }
  2. ハンドラー用のincファイルを作成し、そこにロジックを配置します。以下のようなものここでは、ファイル名はviews_handler_custom_handler.incになります。

    /**
     * A handler to provide a field that is completely custom by the administrator.
     *
     * @ingroup views_field_handlers
     */
     class views_handler_custom_handler extends views_handler_field {
       function query() {
         // do nothing -- to override the parent query.
       }
    
       function option_definition() {
         $options = parent::option_definition();
    
         // Override the alter text option to always alter the text.
         $options['alter']['contains']['alter_text'] = array('default' => TRUE);
         return $options;
       }
    
       function options_form(&$form, &$form_state) {
         parent::options_form($form, $form_state);
    
         // Remove the checkbox
         unset($form['alter']['alter_text']);
         unset($form['alter']['text']['#dependency']);
         unset($form['alter']['text']['#process']);
       }
    
       function render($values) {
         // Render your content.
         return 'Sample';
       }
    }
  3. モジュールの情報ファイルでこの新しいハンドラーファイルを指定します

  4. キャッシュをクリアする

これで、新しいフィールドハンドラーがフィールドリストに表示されます。


1
THX !正確に必要な2つのこと:クエリを空に指定してオーバーライドし、「#global」に参加します。
グレゴリーカプスティン

これらの結果でフィルタリングする方法はありますか?たとえば、ユーザーとエンティティとの関係に基づいて特別な「ステータス」を計算するためのカスタムフィールドハンドラーを作成しました。そのステータスでフィルタリングできるようにしたいです。何か案は?
tigertrussell

おかげで、これは私が必要なものです!しかし、このようなフィールドハンドラーのビュー関係を有効にできないようです。drupal.stackexchange.com/questions/166734/…アイデアはありますか?
ドンキホーテ

1

完了するには、hook_views_apiも追加する必要があります

function my_module_views_api() {
  return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'my_module'),
  );
}

1
完了するには:.infoファイルにハンドラーを含める必要がありますfiles [] = views_handler_custom_handler.inc
Fawwad
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.