Skip to content

13. تمرین IMPOTS با XML

در این تمرین که قبلاً بارها آن را مطالعه کرده‌ایم، سرور نتایج را به شکل یک جریان XML به کلاینت بازمی‌گرداند.

13.1. سرور (impots_05B_web)

وب سرویس محاسبه مالیات که قبلاً توصیف شد، دارای معماری لایه‌ای است:

در مثال قبلی، سرویس وب یکی از دو خط زیر را به مشتریان خود ارسال می‌کرد:

<erreur>message d'erreur</erreur>
<impot>montant de l'impôt</impot>

این یک سند XML صحیح نیست زیرا فاقد تگ ریشه است. سرویس وب جدید پاسخ خود را در قالب زیر بازخواهد گرداند:

<reponse><erreur>message d'erreur</erreur></reponse>

یا

<reponse><impot>montant de l'impôt</impot></reponse>

در هر دو حالت، پاسخ یک سند XML خوش‌ساخت است که می‌تواند توسط ماژول [simpleXML] پردازش شود.

در طرح سه‌لایه، تنها لایه [web] نیاز به اصلاح دارد. کد آن، [impots_05B_web]، به صورت زیر درمی‌آید:


<?php

// لایه کسب‌وکار
require_once "impots_05_metier.php";

// پردازش خطا
ini_set("display_errors", "off");

// سربرگ UTF-8
header("Content-Type: text/plain; charset=utf-8");

// ------------------------------------------------------------------------------
// وب سرویس مالیاتی
// تعریف ثابت‌ها
$HOTE = "localhost";
$PORT = 3306;
$BASE = "dbimpots";
$USER = "root";
$PWD = "";
//داده‌های مورد نیاز برای محاسبه مالیات در جدول mysqL $TABLE قرار داده شده‌اند.
//متعلق به پایگاه داده $BASE است. جدول دارای ساختار زیر است
//محدودیت decimal(10,2)، coeffR decimal(6,2)، coeffN decimal(10,2)
//پارامترهای اشخاص مشمول مالیات (وضعیت تأهل، تعداد فرزندان، حقوق سالانه)
//توسط کلاینت در قالب پارامترها=وضعیت تأهل، تعداد فرزندان، حقوق سالانه ارسال می‌شوند
//نتایج (وضعیت تأهل، تعداد فرزندان، حقوق سالانه، مالیات پرداختی) به مشتری بازگردانده می‌شوند
// در قالب <tax>tax</tax>
//یا در قالب <error>error</error>، اگر پارامترها نامعتبر باشند
//لایه [métier] در جلسه بازیابی می‌شود
session_start();
if (!isset($_SESSION['metier'])) {
// نمونه سازی لایه [dao] و لایه [métier]
  try {
    $_SESSION['metier'] = new ImpotsMetier(new ImpotsDaoWithMySQL($HOTE, $PORT, $BASE, $USER, $PWD));
  } catch (ImpotsException $ie) {
    print "<reponse><erreur>Erreur : " . utf8_encode($ie->getMessage() . "</erreur></reponse>");
    exit;
  }
}
$metier = $_SESSION['metier'];

//خط ارسال‌شده توسط کلاینت را بازیابی می‌کند
$params = utf8_encode(htmlspecialchars(strtolower(trim($_POST['params']))));
//print "پارامترهای دریافتی --> $params\n";
$items = explode(",", $params);
//باید فقط ۳ پارامتر وجود داشته باشد
if (count($items) != 3) {
  print "<reponse><erreur>[$params] : nombre de paramètres invalides</erreur></reponse>\n";
  exit;
}//اگر
//پارامتر اول (وضعیت تأهل) باید بله/خیر باشد
$marié = trim($items[0]);
if ($marié != "oui" and $marié != "non") {
  print "<reponse><erreur>[$params] : 1er paramètre invalide</erreur></reponse>\n";
  exit;
}//اگر
// پارامتر دوم (تعداد فرزندان) باید یک عدد صحیح باشد
if (!preg_match("/^\s*(\d+)\s*$/", $items[1], $champs)) {
  print "<reponse><erreur>[$params] : 2ième paramètre invalide</erreur></reponse>\n";
  exit;
}//اگر
$enfants = $champs[1];
//پارامتر سوم (حقوق) باید یک عدد صحیح باشد
if (!preg_match("/^\s*(\d+)\s*$/", $items[2], $champs)) {
  print "<reponse><erreur>[$params] : 3ième paramètre invalide</erreur></reponse>\n";
  exit;
}//اگر
$salaire = $champs[1];
// مالیات محاسبه می‌شود
$impôt = $metier->calculerImpot($marié, $enfants, $salaire);
// نتیجه را بازگردانید
print "<reponse><impot>$impôt</impot></reponse>\n";
//پایان
exit;

قالب پاسخ سرویس وب در خطوط ۳۵، ۴۷، ۵۳، ۵۸، ۶۴ و ۷۱ اصلاح شده است.

13.2. کلاینت (client_impots_05b_web)

کلاینت برای در نظر گرفتن فرمت جدید پاسخ اصلاح شده است. از [simpleXML] برای پردازش این مورد استفاده می‌شود:


<?php

//مالیات مشتری
// مدیریت خطا
ini_set("display_errors", "off");

// ---------------------------------------------------------------------------------
// یک کلاس از توابع کمکی
class Utilitaires {
...
}

// main -----------------------------------------------------
// تعریف ثابت‌ها
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
// داده‌های سرور
$HOTE = "localhost";
$PORT = 80;
$urlServeur = "/exemples-web/impots_05B_web.php";

...
exit;

function calculerImpot($HOTE, $PORT, $urlServeur, &$cookie, $params) {
  // کلاینت را به ($HOTE, $PORT, $urlServeur) متصل می‌کند
// کوکی $cookie را در صورتی که خالی نباشد ارسال می‌کند. $cookie به صورت ارجاعی پاس می‌شود
//خط نتیجه را به سرور ارسال می‌کند
//خط نتیجه را پردازش می‌کند
...
  //خط نتیجه را می‌خواند
  $ligne = fgets($connexion, 1000);
  //اتصال بسته می‌شود
  fclose($connexion);
  //نتیجه را محاسبه می‌کند
  $xml = new SimpleXMLElement($ligne);
  $erreur = isset($xml->erreur) ? $xml->erreur : "";
  $impôt = isset($xml->impot) ? $xml->impot : "";
  //بازگشت
  return array($erreur, $impôt);
}
  • خط ۳۲: پاسخ سرور خوانده می‌شود. این یک سند XML است.
  • خط ۳۶: یک شیء SimpleXML از سند دریافت‌شده XML ساخته می‌شود.
  • خط ۳۷: هر پیام خطا
  • خط ۳۸: هر مبلغ مالیاتی