آموزش ساخت صفحه خطای سفارشی در جوملا

چگونه یک صفحه خطای سفارشی (Custom error pages) برای وبسایت جوملا بسازیم – آموزش گام به گام ساختن صفحه خطای سفارشی برای وبسایت جوملا, آموزش ساخت صفحه خطای (Custom error pages) سفارشی برای قالب جوملا

آیا می دانید صفحه خطا (error page) یک وبسایت چیست؟ زمانی که در وبسایت یک خطا رخ می دهد، این صفحه به نمایش در می آید. در جوملا از فایل templates/system/error.php برای رسیدگی به خطاهای مختلف وضعیت HTTP از جمله خطاهای "403 Forbidden"، "404 Not Found" و خطای "500 Internal Server" استفاده می شود. در این مقاله طریقه ساخت یک صفحه خطای 404 سفارشی با هدر و فوتر و امکان درج ماژول آموزش داده می شود.

در صورت تمایل می توان صفحه خطای (error page) جوملا را به طور دلخواه و سفارشی قالب بندی کرد. بایستی بدانید که فایل error.php یک فایل مستقل در سیستم مدیریت محتوای جوملا (Joomla! CMS) است اما به پلتفرم جوملا (Joomla! Platform) وابسته است. در این فایل نمی توان پلاگین اجرا کرد. نمی توان در این فایل از ماژول یا عبارت های <jdoc:include> استفاده کرد.

سرفصل های این مقاله عبارتند از:

رونویسی نتایج خطای سیستم

قبل از هر کاری لازم است یک رونوشت از خطای سیستم ایجاد کنیم. اگر با رونویسی قالب جوملا آشنا نیستید، مقاله طریقه ساخت رونوشت در جوملا را بخوانید. برای رونویسی نتایج خطای سیستم فایل templates/system/error.php را کپی کرده و در دایرکتوری قالب جوملا (templates/<template-name> ) درج می کنیم.

اگر جوملا زمان کمپایل سایت با فایل error.php در پوشه قالب وبسایت مواجه شود، از فایل پیش فرض استفاده نمی کند. می توان این فایل را به دلخواه قالب بندی کرد و یک صفحه خطای دلخواه ایجاد کرد.

رونویسی سبک و قالب سیستم

اگر بخواهیم سبک CSS صفحه خطای جوملا را تغییر دهیم، باید از آن رونوشت بگیریم. برای اینکار فایل templates/system/css/error.css را کپی کرده و در دایرکتوری تمپلیت جوملا (templates/<template-name>/css) درج می کنیم. سپس فایل templates/<template-name>/error.php را به روز کرده و مسیر دسترسی جدید فایل CSS را به آن معرفی می کنیم. بنابراین خط کد زیر را در فایل خطا تغییر می دهیم:

<link rel="stylesheet" href="/<?php echo $this->baseurl; ?>/templates/system/css/error.css" type="text/css" />

سپس به سادگی فایل error.css را مطابق میل و نیاز خود ویرایش و تعدیل می کنیم.

سفارشی سازی پیام های خطا

می توان از عبارات شرطی PHP برای تغییر پیام با توجه به کد خطای رخ داده استفاده کرد. در اینجا یک نمونه از استفاده از عبارات شرطی برای خطای 404 (404 error) و ایجاد پیام سفارشی آمده است:

<?php  if ($this->error->getCode() == '404') { ?>
	<div id="errorboxheader">Page not found</div>
		<div id="errorboxbody"><p>Sorry! That page cannot be found.</p>
		</div>
	</div>
<?php } ?>

کد وضعیت HTTP

وقتی برای صفحه ای از سایت شما درخواستی ارسال می شود، سرور یک کدهای وضعیت HTTP در پاسخ به درخواست وب پیج بر می گرداند. جوملا کد وضعیت 200 - به معنی سرور بطور موفقیت آمیز صفحه را برگرداند – برای صفحات خطا بر می گرداند. این مسئله برای کسانی که با خدمات وبمستر گوگل کار می کنند، مشکل ساز است زیرا بایستی در سایت مپ خود مسئله را حل کنند.

اگر بخواهیم که جوملا کد وضعیتی را برای خطا برگرداند، می توانیم با اضافه کردن یک قاعده قبل از خط DOCTYPE اینکار را انجام دهیم:

<?php 
if ($this->error->getCode() == '404') {
	header("HTTP/1.0 404 Not Found");
} ?>

اطلاعات بیشتر در مورد کدهای وضعیت HTTP

مطالعه مقالات زیر می تواند به درک بهتر خطاها و کدهای وضعیت HTTP کمک کند:

طریقه استفاده از هدر و فوتر سایت در صفحه خطا

اگر می خواهید که صفحه خطای جوملا با قالب پیش فرض سایت نمایش یابد و نمی خواهید کاربر را توسط URL صفحه خطا به صفحه دیگری هدایت کنید یا کد HTML قالب صفحه خطا دوبله نباشد، می توانید با استفاده از کد زیر قالب پیش فرض وبسایت را به صفحه خطا اعمال کنید.

کد زیر را در فایل templates/<template-name>/error.php درج کنید:

<?php
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

include dirname(__FILE__) . "/index.php";
?>

سپس فایل ایندکس قالب خود در مسیر templates/<template-name>/index.php را به صورت زیر ویرایش کنید:

1- کد زیر را در فایل index.php پیدا کنید

<jdoc:include type="head" />

حال کد فوق را با قطعه کد زیر جایگزین کنید:

<?php if (!$this->error->getCode()) : ?>
<jdoc:include type="head" />
<?php else : ?> 
<title><?php echo $this->error->getCode() ?> - <?php echo $this->title; ?></title>
<?php endif; ?>

2- کد زیر را در فایل index.php پیدا کنید

<jdoc:include type="component" />

حال این کد را با قطعه کد زیر جایگزین کنید:

<?php if ($this->error->getCode()) : /* check if we are on error page, if yes - display error message */ ?>
  <p><strong><?php echo $this->error->getCode() ?> - <?php echo $this->error->message ?></strong></p>
  <p><strong><?php echo JText::_('JERROR_LAYOUT_NOT_ABLE_TO_VISIT'); ?></strong></p>
  <ol>
    <li><?php echo JText::_('JERROR_LAYOUT_AN_OUT_OF_DATE_BOOKMARK_FAVOURITE'); ?></li>
    <li><?php echo JText::_('JERROR_LAYOUT_SEARCH_ENGINE_OUT_OF_DATE_LISTING'); ?></li>
    <li><?php echo JText::_('JERROR_LAYOUT_MIS_TYPED_ADDRESS'); ?></li>
    <li><?php echo JText::_('JERROR_LAYOUT_YOU_HAVE_NO_ACCESS_TO_THIS_PAGE'); ?></li>
    <li><?php echo JText::_('JERROR_LAYOUT_REQUESTED_RESOURCE_WAS_NOT_FOUND'); ?></li>
    <li><?php echo JText::_('JERROR_LAYOUT_ERROR_HAS_OCCURRED_WHILE_PROCESSING_YOUR_REQUEST'); ?></li>
  </ol>
  <p><strong><?php echo JText::_('JERROR_LAYOUT_PLEASE_TRY_ONE_OF_THE_FOLLOWING_PAGES'); ?></strong></p>

  <ul>
  <li><a href="/<?php echo $this->baseurl; ?>/index.php" title="<?php echo JText::_('JERROR_LAYOUT_GO_TO_THE_HOME_PAGE'); ?>"><?php echo JText::_('JERROR_LAYOUT_HOME_PAGE'); ?></a></li>
  </ul>

  <p><?php echo JText::_('JERROR_LAYOUT_PLEASE_CONTACT_THE_SYSTEM_ADMINISTRATOR'); ?>.</p>
<?php else : ?>
  <jdoc:include type="component" />
<?php endif; ?>

حالا قالب پیش فرض سایت به صفحه خطا نیز اعمال می شود.

توجه: ماژول های گنجانده شده در قالب در صفحه خطایی که به این شکل ساخته شده است، نمایش نمی یابد (اما در صفحات دیگر مثل قبل درست کار می کنند).

طریقه استفاده از ماژول در صفحات خطای جوملا

ماژول را نمی توان به شیوه قالب و ویرایش فایل index.php در صفحات خطا گنجاند، زیرا نمی توان از عبارت <jdoc:include> برای اینکار استفاده کرد. راه بدیل اینکار استفاده از JModuleHelper است.

برای گنجاندن یک ماژول منفرد از طریق عنوان ماژول می توان از کد زیر استفاده کرد:

if (JModuleHelper::getModule('menu')) { 
    echo $doc->getBuffer('module', 'menu');
}

برای درج چند ماژول در صفحه خطا از طریق پوزیشن قرار گیری ماژول ها، می توان از کد زیر استفاده کرد:

$modules = JModuleHelper::getModules( 'footer_3' );
$attribs['style'] = 'xhtml';
foreach ($modules AS $module ) {
    echo JModuleHelper::renderModule( $module, $attribs );
}

جلوگیری از ایندکس شدن صفحه خطای 404 توسط موتورهای جستجوگر

راه های مختلفی برای جلوگیری از ایندکس شدن یک وب پیج در جوملا وجود دارد. می توانید در مدیر مقاله جوملا در آدرس Manager > Edit Article صفحه ویرایش مقاله را باز کرده و گزینه Robots را به Noindex ست کنید. ساده ترین راه اضافه کردن کد زیر به فایل Robot.txt است که در دایرکتوری ریشه وبسایت قرار دارد. بجای index.php?option.. مکان یا URL مقاله 404 خود را بگذارید:

Disallow: /index.php?option=com_content&view=article&id=75

اگر در اجرای این راهنما به مشکل برخورد کردید و سایر سئوالات و پیشنهادات خود را در بخش سئوالات عمومی انجمن پلکسا مطرح نمایید. گروه توسعه وب پلکسا به سئوالات شما پاسخ خواهند داد.