علاوه بر گزارش کمکی معرفی شده در بخش قبلی ساخت افزونه گزارش سفارشی، همچنین برای دسترسی مستقیم به پایگاه داده پشتیبانی می شود. این قسمت آخر همه چیز را از ایجاد مدل پایگاه داده خود و دسترسی به پایگاه داده گرفته تا ارسال این داده ها به views و رندر کردن آن را توضیح می دهد.
#
در حالی که از نظر فنی امکان پذیر است، اجرای پرس و جوهای مبتنی بر نوشتن و تغییر پایگاه داده TestRail با استفاده از روش های دسترسی به پایگاه داده توضیح داده شده در این مقاله پشتیبانی نمی شود. دسترسی به پایگاه داده فقط برای پرس و جوهای خواندنی مجاز است.
دسترسی به پایگاه داده #
پرس و جوهای پایگاه داده سفارشی برای افزونه های گزارش معمولاً در یک مدل قرار می گیرند تا کد پایگاه داده را از منطق گزارش واقعی جدا کند. ما در افزونه گزارش نمونه خود از همین قرارداد پیروی می کنیم و مستقیماً به کد و تغییرات لازم برای این کار می پریم:
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) استفاده کنید. Wrapper از همه دستورات SQL ممکن پشتیبانی نمیکند و توصیه میکنیم از پرسوجوهای خام برای هر چیزی که پیچیدهتر از یک انتخاب ساده است، استفاده کنید. توجه داشته باشید که چگونه پارامترهای 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 *
..
}
ارائه داده ها #
به یاد داشته باشید که داده های واقعی از طریق view ها به صفحات HTML ایستا ارائه می شوند. بخش گم شده در حال حاضر این است که داده ها را به view های خود منتقل کنیم و آن را بر اساس آن ارائه کنیم. ما قبلاً یک نمای استاندارد “شاخص” را در آن تنظیم کرده ایم قسمت ۱ ساخت پلاگین گزارش سفارشی و ما به سادگی می توانیم آن را تغییر دهیم 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
)
)
);
..
کد منبع کامل نماها در اینجا فهرست نشده است و لطفاً به آن مراجعه کنید TestRail Customizations مخزن GitHub برای این دنبال کردن آن باید آسان باشد و فقط HTML را بر اساس گزینه های گزارش و داده های ارسال شده تولید می کند.
همه در کنار هم، گزارش های رندر شده اکنون به صورت زیر هستند:


