レポート:カスタム レポート プラグインの作成 (3)
前のパートで紹介したレポート ヘルパーに加えて、データベースへの直接アクセスもサポートされています。この最後のパートでは、独自のデータベース モデルを作成するところから、データベースへのアクセス、データをビューに渡してレンダリングするまでのすべてについて説明します。
このページで説明しているデータベース アクセス メソッドを使用して書き込みクエリーを実行し、TestRail のデータベースを変更することは、技術的には可能ですが、サポートされていません。読み取りクエリーのためにデータベースにアクセスすることだけが許可されています。
データベース アクセス
通常、データベース コードと実際のレポート ロジックを分離するために、レポート プラグインのカスタム データベース クエリーはモデルにバンドルされます。サンプル レポート プラグインでもこの原則に従い、report.php のコードと必要な変更を確認します。
class Tests_property_results_report_plugin extends Report_plugin
{
private $_model;
..
public function __construct()
{
parent::__construct();
$this->_model = new Tests_property_results_summary_model();
$this->_model->init();
$this->_controls = $this->create_controls(
self::$_control_schema
);
}
..
}
class Tests_property_results_summary_model extends BaseModel
{
..
}
モデルは、基本モデル (BaseModel) から派生する独立したクラスです。このクラスのインスタンスは、レポート プラグインのコンストラクターで作成され、$this→_model によってアクセスできます。モデルに最初のメソッドを追加することができます。
class Tests_property_results_summary_model extends BaseModel
{
public function get_statuses()
{
$this->db->select('*');
$this->db->from('statuses');
$this->db->where('is_active', true);
$this->db->order_by('display_order');
return $this->db->get_result();
}
public function get_types()
{
$this->db->select('*');
$this->db->from('case_types');
$this->db->where('is_deleted', false);
$this->db->order_by('name', 'asc');
return $this->db->get_result();
}
public function get_type_results($run_ids, $type_id)
{
$query = $this->db->query(
'SELECT
tests.status_id,
COUNT(*) as status_count
FROM
tests
JOIN
cases
on
cases.id = tests.content_id
WHERE
tests.run_id in ({0}) and
cases.type_id = {1}
GROUP BY
tests.status_id',
$run_ids,
$type_id
);
$results = $query->result();
return obj::get_lookup_scalar(
$results,
'status_id',
'status_count'
);
}
/* Skipped for priorities */
..
}
ここで説明するべきポイントがいくつかあります。モデルは $this→_db オブジェクトを介してデータベースにアクセスし、(get_type_results のように) 直接クエリーを発行するか、(get_statuses のように) 軽量のラッパーを使用します。ラッパーはすべての SQL コマンドをサポートしているわけではないので、単純な select、from、where、get sequence 以外の複雑なクエリーには直接クエリーを使用することをお勧めします。どちらの場合も、必要に応じて SQL パラメータが自動的に引用、変換、およびエスケープされることに注意してください。
レポート プラグイン クラスに戻り、次のように新しいモデル メソッドを利用できます。
public function run($context, $options)
{
..
// Get all active statuses from the database.
$statuses = $this->_model->get_statuses();
$status_ids = obj::get_ids($statuses);
// Read the case types and priorities from the database.
$types_include = $options['types_include'];
$types = array();
$types_results = array();
if ($types_include && $run_ids)
{
$types = $this->_model->get_types();
foreach ($types as $type)
{
$types_results[$type->id] =
$this->_model->get_type_results(
$run_ids,
$type->id
);
}
}
/* Skipped for priorities *
..
}
..
return array(
'resources' => self::$_resources,
'html_file' => $this->render_page(
'index',
array(
'report' => $context['report'],
'project' => $project,
'runs' => $runs,
'run_rels' => $run_rels,
'statuses' => $statuses,
'types_include' => $types_include,
'types' => $types,
'types_results' => $types_results,
'priorities_include' => $priorities_include,
'priorities' => $priorities,
'priorities_results' => $priorities_results
)
)
);
..
ビューのソース コード全体は、ここには掲載されていません。これについては GitHub リポジトリ を参照してください。処理を追うのは簡単です。単にレポート オプションと渡されたデータに基づいて HTML を生成しているだけです。
まとめると、レポート フォームは次のようになります。
