اگر برنامه نویس جوملا باشید حتما به این مشکل برخورد می کنید که چگونه می توانید خطاهای PHP موجود را در هنگامی که با Ajax کار می کنید مشاهده و منبع خطا را پیدا کنید؛ نبودن این قابلیت در هنگام برنامه نویسی یک گزینه کاملا آزار دهنده خواهد بود به طوری که شاید حتی حاضر باشید آن قسمت از برنامه را بدون ایجکس بنویسید! اما ما در این آموزش می توانیم یک ابزار کاربری و خوب رو برای رها شدن از دردسرهای خطایابی در Ajax بهتون معرفی کنیم.

 JLog چیست ؟

شاید تا به حال نام JLog در جوملا به گوش تون خورده باشد و کنجکاو شده باشید که JLog چیست ... ؟ JLog یک کلاس از هسته جوملاست که با کمک آن شما می توانید وقایع مورد نیاز خودتان را در یک فایل ثبت کنید؛ شاید برای شما سوال بشه که چرا باید همچین کاری بکنید ؟ خب الان با چند مثال ساده خدمت تون فایده های این ابزار رو میگیم.

 احتمالا تا به حال براتون پیش آمده که توی یک برنامه تون بخواهید از تکنولوژی Ajax استفاده کنید؛ همان طور که همه ما می دانیم یکی از ضعف های استفاده از این قابلیت نداشتن یک خطایاب (دیباگر) قوی هست چرا که شما موقع اجرای درخواست Ajax هیچ گونه کنترلی روی درخواست ندارید و این درخواست بصورت خودکار ارسال و کار محول شده به آن را انجام خواهد داد دقیقا بر عکس درخواست های معمولی که در PHP انجام می شود.

 در حالت معمولی چون خود شما به همراه درخواست صفحه را مشاهده می کنید ، اگر خطایی داده شود می توانید آن را بر طرف کنید اما در تکنولوژی Ajax شما صفحه درخواست داده شده را نخواهید دید و این ضعف باعث می شود نتوانید در صورت بروز خطا آن را به راحتی حل کنید. اینجاست که می توانید با استفاده از JLog ، خطای داده شده را به راحتی مشاهده و برای رفع آن اقدام کنید.

یا به عنوان مثال فرض کنید یک برنامه ای تولید کردید که گاها دچار خطا می شود! ولی شما نمی توانید خطا رو ببینید اما می دانید که از کدام صفحه این خطا ایجاد می شود؛ در این مورد هم بهترین راه استفاده از JLog خواهد بود.

 فعال کردن گزینه ثبت وقایع

 برای ثبت وقایع باید گزینه مربوطه را در پلاگین "عیب یاب" ابتدا فعال کنیم. برای همین کار وارد بخش "مدیریت پلاگین ها" شده و پلاگین "سیستم - عیب یاب" را پیدا و وارد ویرایش آن شوید؛ روی تب واقعه نگاری کلیک کنید و گزینه ی "ثبت وقایع تقریبا همه چیز" را روی بلی قرار بدید و سپس ذخیره کنید.

 

 با انجام کار بالا تمام وقایع که با JLog همگام سازی شده باشد درون فایل لاگ جوملا ذخیره می شود. مسیر لاگ جوملا را می توانید از تنظیمات اصلی » تب سیستم » گزینه مسیر پوشه وقایع * دریافت کنید :

 

 نحوه فراخوانی و استفاده از کلاس JLog

برای استفاده از کلاس JLog باید ابتدا آن را فراخوانی و سپس از تابع add استفاده کنید :

// Import Library by jimport
jimport('joomla.log.log');

// Start Logging
JLog::add('ThemeIran Debug Testing', JLog::ERROR, 'my-error-category');

 ابتدا با استفاده از jimport کتابخانه لاگ را فراخوانی کردیم؛

 سپس با استفاده از تابع add یک لاگ ایجاد کردیم در 3 پارامتر این تابع :

 پارامتر اول از سمت چپ : متنی که می خواهید در فایل لاگ ثبت شود.

 پارامتر دوم : اولویت لاگ خواهد بود؛ اولویت ها بصورت کلی به دسته های (JLog::EMERGENCY, JLog::ALERT, JLog::CRITICAL, JLog::ERROR, JLog::WARNING, JLog::NOTICE, JLog::INFO, JLog::DEBUG) تقسیم می شوند.

 پارامتر سوم : یک متن ساده جهت مجموعه بندی خطاها می باشند که بهترین استفاده آن برای جداسازی لاگ ها از دیگر افزونه هاست.

 هر بار که تابع add از این کلاس اجرا شود ، یک لاگ در مسیر زیر ایجاد می شود :

YOUR_LOG_PATH/everything.php

// default path
YOUR_JOOMLA_ROOT/administrator/logs/everything.php

 قبلا نحوه مشاهده مسیر واقعی لاگ در جوملا را به شما نشان داده ایم.

 نوشته ی زیر یک مثال ساده از محتویات نمونه کد اجرا شده می باشد :

#
#<?php die('Forbidden.'); ?>
#Date: 2018-12-23 08:19:23 UTC
#Software: Joomla Platform 13.1.0 Stable [ Curiosity ] 24-Apr-2013 00:00 GMT

#Fields: datetime	priority clientip	category	message
2018-12-23T08:19:23+00:00	ERROR ::1	my-error-category	ThemeIran Debug Testing

 همان طور که مشاهده می کنید در خط 7 این کد ، به ترتیب از سمت چپ : تاریخ و زمان دقیق پروسه ، اولویت ، آی پی کاربر ، مجموعه ، پیغام خطا.

 کد زیر از یک مثال واقعی استفاده در یک برنامه برای شما قرار داده خواهد شد :

Class ThemeIran {
	public function Change () {
		$controller	= JControllerLegacy::getInstance('component');
		JHtml::_('jquery.framework');
		JLoader::register('Security', JPATH_COMPONENT_ADMINISTRATOR.'/helpers/encrypt.php');
		JLoader::register('MFHelper', JPATH_COMPONENT_ADMINISTRATOR.'/helpers/helper.php');

		try {
			new MFHelper();
			$this->insertIntoImages($this->type, $this->filename);

			$controller->execute(JFactory::getApplication()->input->get('task'));
			$controller->redirect();
		} 
		catch(Exception $e) { //catch exception
			JLog::add($e->getMessage(), JLog::ERROR, 'mycomponent');
		}
	}

	public function insertIntoImages ($args1 , $args2 , $args3) {
		// DO SOME THING ...
	}
}

 کد بالا یک کلاس ساده می باشد که در در هنگام فراخوانی Ajax اجرا می شود؛ از خط 8 تا خط 17 می توانید مشاهده کنید که از قابلیت try catch استفاده کردیم تا در صورت بروز خطا بتوانیم منبع و دلیل خطا را بدست بیاوریم.

 در خط 16 می توانید مشاهده کنید که از JLog و تابع add استفاده کردیم و از منبع خطا یعنی $e متن خطا را در لاگ ذخیره می کنیم. کد بالا در PHP نسخه 7.2 خطا می دهد و متن ذخیره شده در لاگ به شرح زیر می باشد :

#
#<?php die('Forbidden.'); ?>
#Date: 2018-12-23 05:55:14 UTC
#Software: Joomla Platform 13.1.0 Stable [ Curiosity ] 24-Apr-2013 00:00 GMT

#Fields: datetime	priority clientip	category	message
2018-12-23T05:56:01+00:00	CRITICAL ::1	error	Uncaught \Throwable of type ArgumentCountError thrown. Stack trace: #0 D:\wamp64\www\joomla\administrator\components\com_mycomponent\controllers\product.php(145): ThemeIran->insertIntoImages(1, '6752c8.jpg')
#1 D:\wamp64\www\joomla\libraries\src\MVC\Controller\BaseController.php(710): ThemeIran->saveImage()
#2 D:\wamp64\www\joomla\administrator\components\com_mycomponent\mycomponent.php(22): Joomla\CMS\MVC\Controller\BaseController->execute('saveimage')
#3 D:\wamp64\www\joomla\libraries\src\Component\ComponentHelper.php(382): require_once('D:\\wamp64\\www\\j...')
#4 D:\wamp64\www\joomla\libraries\src\Component\ComponentHelper.php(357): Joomla\CMS\Component\ComponentHelper::executeComponent('D:\\wamp64\\www\\j...')
#5 D:\wamp64\www\joomla\libraries\src\Application\AdministratorApplication.php(101): Joomla\CMS\Component\ComponentHelper::renderComponent('com_mycomponent')
#6 D:\wamp64\www\joomla\libraries\src\Application\AdministratorApplication.php(159): Joomla\CMS\Application\AdministratorApplication->dispatch()
#7 D:\wamp64\www\joomla\libraries\src\Application\CMSApplication.php(195): Joomla\CMS\Application\AdministratorApplication->doExecute()
#8 D:\wamp64\www\joomla\administrator\index.php(51): Joomla\CMS\Application\CMSApplication->execute()
#9 {main}

همان طور که در متن خطا بالا مشاهده می کنید یک خطا از نوع اولویت CRITICAL و شناسه آی پی ::1 (چون کاربر در لوکال می باشد) یک خطا ایجاد شده است. (خط 7)

 متن دلیل خطا ایجاد شده : Uncaught \Throwable of type ArgumentCountError thrown (اگر همین خطا را در گوگل جستجو کنید کاملا دلیل ایجاد شدن آن را می توانید بخوانید)

 در ادامه همان خط  یک مسیری را به شما نشان می دهد که به فایل product.php منتهی می شود؛ در مقابل آن عدد 145 درون یک پرانتز قرار گرفته که به معنای شماره خطی که در product.php باعث خطا شده ، می باشد.

 بعد از آن هم دقیقا تابع ی باعث ایجاد خطا را می نویسد تا دقیقا شما متوجه خط ایجاد کننده خطا شوید.

 اگر کمی به عقب تر و به مثال PHP که در بالا برای شما زدیم ، برگردیم می توانیم حتی با چشم هم متوجه خطا شویم؛ خطا به دلیل تعداد کم پارامترها در زمان صدا کردن تابع insertIntoImages می باشد. در خط 145 و موقع صدا کردن تابع ، 2 پارامتر ارسال شده است در صورتی که تابع با 3 پارامتر تعریف شده است.

 ذخیره لاگ (Log) در یک فایل سفارشی

 در جوملا شما می توانید در صورت تمایل لاگ های خودتان را در یک فایل مجزا و بصورت سفارشی شده ذخیره کنید؛ برای اینکار باید قبل از فراخوانی تابع add از تابع addLogger جهت مشخص نمودن مسیر و فایل لاگ استفاده کنید. به مثال زیر دقت کنید :

JLog::addLogger(
    array(
            // Set the name of the log file
            'text_file' => 'test.log.php',
            // (optional) you can change the directory
            'text_file_path' => 'tmp'
     )
);

// start logging...
JLog::add('Starting to log - Themeiran.Com'); 

 تابع addLogger یک پارامتر اصلی از نوع array دریافت می کند که 2 تا از مقادیر مهم این آرایه را می توانیم به text_file و text_file_path اشاره کنیم.

 text_file : نام فایلی که می خواهید لاگ ها در آن ذخیره شود.

 text_file_path : مسیری که می خواهید فایل لاگ در آن ایجاد شود؛ دقت کنید در صورتی که در مدیریت این تابع اجرا شود ، مسیر از پوشه administrator محاسبه می شود؛ در واقع کد بالا فایل text.log.php را در مسیر administrator/tmp ایجاد می کند.

خب دیدیم که می توانیم خیلی راحت و ساده از کلاس JLog برای راحتی کار خودمون استفاده کنیم و بهترین راه حل برای خطایابی PHP در کدهای Ajax خواهد بود.

 

این آموزش بصورت خلاصه بیان شده که بتواند درک و مفهوم را ساده تر به خواننده برساند؛ مبحث JLog بسیار پیچیده تر و بزرگ تر می باشد که سعی می شود در آینده درصورت درخواست کاربران ، مقاله بروزرسانی گردد.