それを明確にするために、すべてが生きている例にあります:
サイトでは、 PrivateMSGモジュールを使用します。 これにより、ユーザーは互いにプライベートメッセージを送信できます。 ビューを使用して、現在のユーザーに関する情報を表示するブロックを作成しました。
タスク: 現在のユーザーの受信トレイにある新しいメッセージの数とすべてのメッセージの数をブロックに表示します。
解決策: 必要な値をViewsコンストラクターに追加するモジュールを作成します。
残念ながら、インターネット上ではこの主題に関する情報はほとんどなく、 Views APIマニュアルはかなり複雑で理解しにくいものです。
それでは始めましょう。
- 新しいモジュールを作成します。
予想どおり、ディレクトリを作成し、将来のモジュールの名前と呼びます。 私はそれをprivatemsg_extraviewsと呼びました 。
ディレクトリに、ファイルprivatemsg_extraviews.info、privatemsg_extraviews.module、privatemsg_extraviews.views.incを作成します。 次に、さらに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はモジュールを認識できます。
- 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 .
- 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を作成します。
- 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 .
- 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ブログに移動しました。 カルマをありがとう。