レポート:カスタム レポート プラグインの作成 (3)

レポート:カスタム レポート プラグインの作成 (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 *
 
	..
 
}

データのレンダリング

実際のデータはビューによって静的な HTML ページにレンダリングされることを思い出してください 。まだ完成していないのは、データをビューに渡して適切にレンダリングする部分です。パート1ですでに標準の「インデックス」ビューを設定してあるので、render_page の呼び出しを次のように変更してデータを渡すことができます。


..
 
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 を生成しているだけです。

まとめると、レポート フォームは次のようになります。