@שמואל-ש
האובייקט $_SESSION
ב PHP הוא אובייקט שמקושר לסשן החיבור שמבצע משתמש כל שהוא לשרת, והוא מתנהג כאובייקט json לכל דבר, ניתן לאחסן בו נתונים, לקרוא ממנו, וגם להסיר נתונים.
זה לא מאפשר לדעת 'איפה אני אוחז', כיון שPHP היא שפה אסינכורנית, אבל זה כן מקל על כל התהליך של התקשורת מול המאזין בשימוש בשפת PHP במודול API, ובעיקר, מאפשר גם להסיר את ההקשות הקודמות של המשתמש, כך שאפשר לבצע את אותה פעולה כמה פעמים והמערכת לא 'תזכור' את הבחירה הקודמת.
להלן הסבר כללי על האובייקט, עם דגש על השימוש במודול API:
בכל דף שרוצים להשתמש ולאחזר את נתוני הסשן צריך לקרוא תחילה לפוקנציה שנקראת session_start()
, בנוסף, מכיון שהקריאות של ימות המשיח יוצרות כל פעם סשן חדש, יש להגדיר מזהה ייחודי לסשן באמצעות פונקציית session_id()
, כדי שכל פעם תתייחס לסשן הספציפי הזה. כיון שאנחנו מקבלים בימות את ה CallId
רצוי להגדיר את מזהה הסשן למזהה השיחה.
אם כן, ההגדרות הראשוניות לשימוש בסשן הם כדלהלן.
$CallId = $_GET['ApiCallId'];
session_id($CallId);
session_start();
לאחר מכן ניתן להתחיל להשתמש באובייקט $_SESSION
, כאמור, הוא אובייקט מסוג json ולכן הקריאה והכתיבה אליו היא כמו כל אובייקט json אחר
כתיבה
$_SESSION['amount'] = 300;
קריאה
$amount = $_SESSION['amount'];
החידוש הגדול הוא, שבשונה מ $_GET
הנפוץ, שאפשר להסיר ממנו פריטים על ידי פונקציית unset
הסרה
unset($_SESSION['amount']);
כדי להשמיש את האובייקט במודול API של ימות יש צורך לקלוט את כל הפרמטרים שנשלחים על ידי ימות לתוך אובייקט הסשן. לאחר מכן עבור כל פרמטר יש לבדוק האם הפרמטר מופיע באובייקט הסשן, ואם לא - לקבל אותו.
אני בניתי בשביל זה מיני מחלקה שמפשטת את כל העסק, כשאני משתמש בה אני מרגיש כמו שפה סינכורנית, להלן דוגמית:
<?php
// מאתחל את הסשן ומקבל את ערכי הפרמטרים
initialization_session();
// מקבל פרמטר כמות, אם לא קיים - מבקש, אם קיים - מחזיר את הערך
// מקבל כפרמטר את רוב האופציות של read
$amount = read('t-אנא הקש כמות', 'amount');
// מבצע בדיקה של הפרמטר ובמידה ואינו מאושר מסיר את קליטת הפרמטר ומפעיל את השלוחה מחדש
if ($amount > 100) reload_module('t-לא ניתן להקיש כמות מעל 100', 'amount');
//בדיקת הפרמטר על ידי פרמטר נוסף
$approval_amount = read("t-הכמות שהתקבלה היא.n-$amount.t-לאישור הקש 1 לביטול הקש 2", 'amount,approval_amount', '12');
if ($approval_amount == 2) reload_module(null, 'amount,approval_amount');
go_to_folder('/', 't-הנתונים התקבלו בהצלחה');
####################################################
function read($voice, $param, $keys = '', $max_taps = 1, $min_taps = 1, $sulamit = null, $cochavit = true, $read_as = 'No')
{
if (!isset($_SESSION[$param])) {
echo "read=$voice=$param,,$max_taps,$min_taps,,$read_as,,,,$keys";
if ($cochavit && $keys != '') echo '*';
if ($sulamit) echo ",,Ok,$sulamit";
exit();
}
return $_SESSION[$param];
}
function initialization_session()
{
$CallId = $_GET['ApiCallId'];
session_id($CallId);
session_start();
$QUERY_STRING = $_SERVER['QUERY_STRING'];
$last_param = substr($QUERY_STRING, strrpos($QUERY_STRING, '&') + 1);
$param = explode('=', $last_param);
$_SESSION[$param[0]] = $_GET[$param[0]];
}
function unset_session_values($keys)
{
$keys = explode(',', $keys);
foreach ($keys as $key) {
$key = explode(":", $key);
unset($_SESSION[$key[0]]);
}
}
function reload_module($voice = null, $unset = null)
{
if ($voice) echo "id_list_message=$voice&";
if ($unset) unset_session_values($unset);
echo 'go_to_folder=/' . $_GET['ApiExtension'];
exit();
}
function go_to_folder($folder = '/', $voice = null)
{
if ($voice) echo "id_list_message=$voice&";
echo "go_to_folder=$folder";
exit();
}
קרדיט ל @לעזור-לכולם שכיוון אותי לשימוש יעיל בזה