علاوه بر report helper که در بخش قبلی ساخت افزونه report سفارشی معرفی شد، امکان دسترسی مستقیم به پایگاه داده هم وجود دارد. این بخش آخر توضیح میدهد چطور مدل پایگاه داده خودتان را بسازید، به پایگاه داده دسترسی بگیرید، این دادهها را به viewها بفرستید و آنها را render کنید.
#
اگرچه از نظر فنی ممکن است، اجرای queryهای نوشتنی و تغییر پایگاه داده TestRail با روشهای دسترسی به پایگاه داده که در این مقاله توضیح داده شدهاند پشتیبانی نمیشود. دسترسی به پایگاه داده فقط برای queryهای خواندنی مجاز است.
دسترسی به پایگاه داده #
queryهای سفارشی پایگاه داده برای افزونههای report معمولاً داخل یک مدل قرار میگیرند تا کد پایگاه داده از منطق اصلی report جدا بماند. در افزونه report نمونه هم از همین الگو استفاده میکنیم و مستقیم سراغ کد و تغییرات لازم میرویم:
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
{
..
}
مدل یک کلاس جداگانه است که از یک base model مشتق میشود (BaseModel). یک نمونه از این کلاس در constructor افزونه report ساخته میشود و میتوان از طریق $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 object به پایگاه داده دسترسی پیدا میکنند و میتوانند query خام اجرا کنند (مثل get_type_results) یا از یک wrapper سبک استفاده کنند (مثل get_statuses). این wrapper از همه دستورهای SQL پشتیبانی نمیکند و پیشنهاد میکنیم برای هر چیزی که از یک توالی ساده select، from، where و get پیچیدهتر است، از query خام استفاده کنید. توجه کنید که parameterهای SQL در هر دو حالت، در صورت نیاز، بهصورت خودکار quote، تبدیل و escape میشوند.
برگردیم به کلاس افزونه report؛ میتوانیم از متدهای جدید مدل به این شکل استفاده کنیم:
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 *
..
}
render کردن دادهها #
به یاد داشته باشید که دادههای واقعی از طریق viewها در صفحههای HTML ایستا render میشوند. حالا تنها بخش باقیمانده این است که دادهها را به viewها بفرستیم و آنها را مطابق نیاز render کنیم. ما قبلاً یک view استاندارد به نام «index» را در بخش ۱ ساخت افزونه report سفارشی آماده کردهایم و کافی است 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
)
)
);
..
کد کامل viewها اینجا آورده نشده است؛ برای دیدن آن به مخزن GitHub با نام TestRail Customizations مراجعه کنید. دنبال کردن کد باید ساده باشد؛ این کد فقط بر اساس گزینههای report و دادههای ارسالشده، HTML تولید میکند.
وقتی همه این بخشها را کنار هم بگذاریم، reportهای render شده به شکل زیر خواهند بود:


