ビューモジュール-API。 基本

確かに、Drupalで作業する多くの人々はViewsモジュールに精通しています。 Drupaler.ruが言うように、Viewsモジュールは、サイト上の任意のタイプのコンテンツの表示を設定および制御しています 。 ページ、ブロック、ノードのコンテンツ、ユーザーページなどを作成し、サイト上の利用可能なフィールドからコンテンツを作成できます。 しかし、サードパーティのモジュールによって提供される情報を表示する必要があり、Viewsからアクセスできない場合はどうすればよいでしょうか?

それを明確にするために、すべてが生きている例にあります:

サイトでは、 PrivateMSGモジュールを使用します。 これにより、ユーザーは互いにプライベートメッセージを送信できます。 ビューを使用して、現在のユーザーに関する情報を表示するブロックを作成しました。

タスク: 現在のユーザーの受信トレイにある新しいメッセージの数とすべてのメッセージの数をブロックに表示します。

解決策: 必要な値をViewsコンストラクターに追加するモジュールを作成します。

残念ながら、インターネット上ではこの主題に関する情報はほとんどなく、 Views APIマニュアルはかなり複雑で理解しにくいものです。

それでは始めましょう。
  1. 新しいモジュールを作成します。
    予想どおり、ディレクトリを作成し、将来のモジュールの名前と呼びます。 私はそれをprivatemsg_extraviewsと呼びました
    ディレクトリに、ファイルprivatemsg_extraviews.info、privatemsg_extraviews.module、privatemsg_extraviews.views.incを作成します。 次に、さらに2つのファイルを作成する必要がありますが、それについては後でさらに説明します。
  2. privatemsg_extraviews.info
    このファイルには、モジュールに関する情報が含まれています。 モジュールを認識するためにDrupalが必要です。
    name = privatemsg_extraviews
    description = views Private Messages
    core = 6.x
    package = Mail
    version = "6.x-1.1"


    * This source code was highlighted with Source Code Highlighter .

    これで、Drupalはモジュールを認識できます。
  3. privatemsg_extraviews.module
    メインモジュールファイル。 モジュールの構造全体、すべてのフック、および一般的にすべてを書き込みます。
    モジュールがビューで機能することを示すだけです。
    <?php

    /**
    * Implementation of hook_views_api().
    */
    function privatemsg_extraviews_views_api() {
    return array(
    'api' => 2, // API
    'path' => drupal_get_path( 'module' , 'privatemsg_extraviews' ), // Views
    );
    }


    * This source code was highlighted with Source Code Highlighter .

  4. privatemsg_extraviews.views.inc
    最も興味深いこと。 このファイルには、ビューを操作するシステム全体を記述します。 モジュール自体がそれを見つけるでしょう、なぜなら 上記のフックでディレクトリを指定しました。
    必要なメインフックはhook_views_data()です。 その中で、追加するデータベーステーブルと返す情報を決定します。
    <?php
    function privatemsg_extraviews_views_data() {
    // Views
    $data[ 'privatemsg' ][ 'table' ][ 'group' ] = t( 'Private Messages' );
    //
    $data[ 'privatemsg' ][ 'table' ][ 'join' ] = array(
    // users -
    'users' => array(
    //
    'left_field' => 'uid' ,
    'field' => 'uid' ,
    ),
    );
    // count - ,
    $data[ 'privatemsg' ][ 'count' ] = array(
    'title' => t( ' ' ),
    'help' => t( ' ""' ),
    //
    'field' => array(
    //
    'handler' => 'privatemsg_extraviews_handler_field_count' ,
    //
    'click sortable' => TRUE,
    ),
    );
    //
    $data[ 'privatemsg' ][ 'count_new' ] = array(
    'title' => t( ' ' ),
    'help' => t( ' ""' ),
    'field' => array(
    'handler' => 'privatemsg_extraviews_handler_field_count_new' ,
    'click sortable' => TRUE,
    ),
    );
    return $data;
    }


    * This source code was highlighted with Source Code Highlighter .


    次に、フィールドハンドラを初期化するためにhook_views_handlers()が必要です
    function privatemsg_extraviews_views_handlers() {
    return array(
    //
    'handlers' => array(
    'privatemsg_extraviews_handler_field_count' => array(
    // ,
    'parent' => 'views_handler_field_numeric' ,
    //
    'path' => drupal_get_path( 'module' , 'privatemsg_extraviews' ),
    ),
    //
    'privatemsg_extraviews_handler_field_count_new' => array(
    'parent' => 'views_handler_field_numeric' ,
    'path' => drupal_get_path( 'module' , 'privatemsg_extraviews' ),
    ),
    ),
    );
    }


    * This source code was highlighted with Source Code Highlighter .


    上で述べたように、さらに2つのファイルを作成する必要があります-これらは単なるフィールドハンドラです。 モジュールのディレクトリにファイルprivatemsg_extraviews_handler_field_count.incおよびprivatemsg_extraviews_handler_field_count_new.incを作成します。
  5. privatemsg_extraviews_handler_field_count.inc
    「メッセージ数」フィールドのハンドラー。
    <?php
    // , " "
    class privatemsg_extraviews_handler_field_count extends views_handler_field_numeric {
    //
    function query() {
    //
    $table = $ this ->query->ensure_table( 'pm_index' );
    //
    $sql = "SELECT COUNT(DISTINCT thread_id) FROM {pm_index} p WHERE p.deleted = 0 AND p.uid = users.uid" ;
    //
    $ this ->query->add_field( '' , "($sql)" , 'count' );
    $ this ->field_alias = 'count' ;
    }
    //
    function render($values) {
    $txt = $values->count;
    if ($txt) {
    return $txt;
    }
    else {
    return parent::render($values);
    }
    }
    }

    * This source code was highlighted with Source Code Highlighter .

  6. privatemsg_extraviews_handler_field_count_new.inc
    「新規メッセージの数」フィールドのハンドラー。 (同様に)
    <?php

    class privatemsg_extraviews_handler_field_count_new extends views_handler_field_numeric {
    function query() {
    $table = $ this ->query->ensure_table( 'pm_index' );
    $sql = "SELECT COUNT(DISTINCT thread_id) FROM {pm_index} p WHERE p.deleted = 0 AND p.is_new = 1 AND p.uid = users.uid" ;
    $ this ->query->add_field( '' , "($sql)" , 'count_new' );
    $ this ->field_alias = 'count_new' ;
    }

    function render($values) {
    $txt = $values->count_new;
    if ($txt) {
    return $txt;
    }
    else {
    return parent::render($values);
    }
    }
    }


    * This source code was highlighted with Source Code Highlighter .



それがすべて行われた後、ビューはタイプのリクエストを形成します
SELECT users.uid AS uid,
( SELECT COUNT ( DISTINCT thread_id) FROM pm_index p WHERE p.deleted = 0 AND p.uid = users.uid) AS count ,
( SELECT COUNT ( DISTINCT thread_id) FROM pm_index p WHERE p.deleted = 0 AND p.is_new = 1 AND p.uid = users.uid) AS count_new
FROM users users
WHERE users.uid = 1


* This source code was highlighted with Source Code Highlighter .

そして必要な値を返します。

この指示が誰かに役立つことを願っています。 興味がある場合は、ビューについてさらに詳しく書くことができますが、フィールドには独自の設定を作成する方法、フィルターと並べ替えで使用可能なフィールドを作成する方法、引数と関係など、さらに多くの興味深いことがあります。

UPD: Drupalブログに移動しました。 カルマをありがとう。

Source: https://habr.com/ru/post/J80663/


All Articles