logo


פרק 3: שמירת מצב

דוגמאות לעוגיות חלק ראשון: אחזור עוגיה

בואו נתאר תסריט: אנו בונים קוד לחזית מנוע חיפוש, שמכיל מספר שדות טופס, כמו שניתן לראות למטה:

 

Search term:
Results type: brief verbose
Results per page:


בתור תוספת, נשתמש בעוגיות בשביל "לזכור" את הערכים של שדות אלו, עבור הביקור הבא של המשתמש. כך, אם משתמש מסוים מעדיף רשימות של 100 תוצאות לעמוד, האתר שלנו יזכור את זה לביקור הבא, עד אשר ההעדפה תשונה ע"י המשתמש. זה, שוב, סוג של שמירת מצב בין גלישות.

הקוד לתסריט זה מצריך למעשה שני סקריפטיCGI : הסקריפט שמוצא את העוגיה ויוצר את הטופס שראינו למעלה (drawform.cgi) , והסקריפט שבונה את העוגיה ומבצע את החיפוש (dosearch.cgi). כמובן, אנו לא מתכוונים לכתוב מנוע חיפוש, אבל מעט הקוד שמגדיר את העוגיה יחיה בתוך סקריפט למנוע חיפוש דמיוני.

תוך כדי שאנו עוברים על הקוד ל drawform.cgi, אתם כנראה תרצו להיכנס לעמוד המכיל את כל הסקריפט. אנו מתחילים ע"י הכנה של סביבת העבודה ל CGI לשימוש עבור סקריפט perl .

#drawform.cgi
#!/usr/local/bin/perl
#output form fields that "remember" last state
of being.
use CGI;
$cgiobject=new CGI;
$cgiobject->use_named_parameters;

אחרי שיצרנו אובייקט CGI חדש, אנו מפעילים את use_named_parameters”", המספק דרך פשוטה יותר לקריאה מתודות של אובייקט ה CGI – דבר שנראה בעוד רגע.

#retrieve cookie data
$cookie_data=$cgiobject->cookie("searchform");
if ($cookie_data)
{ $crumble_cookie;
  $greeting="Welcome back!" }
else {  &init;
	$greeting="Hello First Timer!" }

כאן אנו מנסים לאחזר את העוגיה שאוחסנה בעבר על גבי מחשב המשתמש. מתודת ה CGI הנקראת ()cookie מקבלת את שם העוגיה (שנקבעה כאשר נוצרה העוגיה), במקרה זה “searchform”. אם העוגיה בשם “searchform”, שנוצרה ע"י האתר הזה, קיימת על גבי מחשב המבקר אזי המידע שבה מוקצה למשתנה cookie_data$. אם שום עוגיה לא הוגדרה- המשמעות היא שהמשתמש לא ביקר באתר בעבר או שהעוגיה נמחקה- ולכן שום מידע לא יוחזר. משפט התנאי if מעריך את שתי האפשרויות האלו: אם העוגיה קיימת, המידע שבה ינותח ע"י השיגרה crumble_cookie ותשלח הודעה מתאימה. אם העוגיה ריקה, משתני הטופס נקבעים כברירת המחדל המוגדרת ב init ומוצגת הודעה אחרת.

למרות שנדון בשגרה crumble_cookie רק בהמשך, מספיק להגיד שהוא מפצל את המידע בעוגיה לערכים שהחסנו בתוך העוגיה, במקרה זה, השמנו שלשה משתנים ושלשה ערכים שמיצגים את המצב של שדות הטופס, לתוך העוגיה.

print $cgiobject->header;
print $cgiobject->start_html(-title=>'Search form',-bgcolor=>'white');
print "<H2>$greeting</H2>";
&output_form;
print $cgiobject->end_html;

החלק העיקרי של הקוד נמצא בפלט הנוצר ע"י סקריפט זה. ראשית, header סטנדרטי נשלח לדפדפן כדי להכין אותו לקבלת HTML. לאחר מכן, המתודה start_html של אובייקט ה CGI יוצרת את תגי הכותרת של מסמך ה HTML, שימו לב שסיפקנו שני פרמטרים: title ו bgcolor שאיתם המתודה יוצרת את התגים <TITLE> <BODY>. מבנה הפרמטר 'parameter=>'value' אולי נראה מוזר, אבל הוא מאפשר קוד קריא, ולכן קראנו קודם לכן גם למתודה use_named_parameters.

אובייקט ה CGI תומך במספר רב של מתודות המשמשות להוצאת תגים של HTML, ונראה כמה מהם בקצרה. אבל באופן כללי, מתודות אלו משמשות לכתיבת HTML בצורה יותר נוחה, אבל בהחלט תוכלו, אם תרצו, לשלוח את הHTML כפשוטו, כמו כן, כמו שתראו בשורה הבאה בקוד בדוגמה שבה הוצאו לפלט "<H2>$greeting</H2>".

תת השגרה output_form תעשה את העבודה השחורה של יצירת שדות טופס, לאחד את ההגדרות המאוחסנות בעוגיה (אם יש). לאחר שתעשה זאת, נסגור את פלט ה HTML בעזרת הפקודה end_html.

sub init()
#initialize form field values
{ $search_term="Enter search term here.";
  $result_style="brief";
  $result_perpage=50;
}

אם אין שום עוגיה, תת השגרה init תכניס מספר ערכי ברירת מחדל עבור שלשת ההגדרות: שם החיפוש, עיצוב התוצאה, ומספר התוצאות לעמוד. שוב, שימו לב שזהו מנוע חיפוש דמיוני אבל הוא בהחלט נראה כמו תפאורה שניתן להשתמש בה.

sub output_form()
#construct and output the form HTML
{  $theform=$cgiobject->startform(-name=>'searchform',
   -method=>'get',
   -action=>'/cgi-bin/dosearch.cgi');
   #create text input field
   $theform.="Search: ";
   $theform.=$cgiobject-&gt;textfield(-name=&gt;'search_term',
   -size=>30,
   -default=>$search_term);


   #create two radio buttons
   $theform.="<BR>Results type:";
   $theform.=$cgiobject->radio_group(-name=>'result_style',
			  	   -values=>["brief","verbose"],
			  	   -default=&gt;$result_style);


   #create select box
   $theform.="<BR>Results per page:<BR>";
   $theform.=$cgiobject->scrolling_list(-name=>'result_perpage',
				        -values=>[25,50,100],
				        -default=>$result_perpage,
				        -size=>3,
 				        -multiple=>'false');
   #create submit and reset buttons
   $theform.="<BR><BR>";
   $theform.=$cgiobject->submit(-label=>'Submit');
   $theform.=$cgiobject->reset(-label=>'Clear');


   $theform.=$cgiobject->endform;
   print $theform
} 

בתת השגרה output_form אנו שולחים ברציפות כל סוג של אלמנט טופס שיופיע בעמוד, תוך שימוש במתודות שונות של אוביקט ה CGI. כל מתודה לוקחת פרמטרים מסוימים בתלות בסוג שדה הטופס. פרמטרים אלה חופפים, בערך, את התכונות שאדם יגדיר אם ירצה לכתוב טפסים אלו ב HTML. שימו לב שאנו יכולים להשתמש במשתני Perl בחלק מטפסים אלה—לכן, הערך של שדה הטקסט default הוא search_term$, בעוד שברירת המחדל לכפתור הבחירה היא result_style$. לבסוף, עבור שדה הרשימה הנגללת (scrolling list field) המייצגת "תוצאות לעמוד", המשתנה result_perpage$ יגדיר איזה פריט יבחר ראשון.

זה די ברור, לכן, איך שהשמת ערכים לשלשה משתנים אלו משפיע על האופן בו הטופס ישלח לעמוד. ולכן, השמת ערכים אלו לתוך עוגיה בין גלישות מאפשרת לך לשחזר את הטופס ומכך לשמור מצב.

sub crumble_cookie()
#parses cookie data into variables and values
{ @vars=split(/\|/,$cookie_data);
  foreach $var (@vars)
    { @pair=split(/=/,$var);
      $evalstr='$'.$pair[0].'=';
      $evalstr.="\"$pair[1]\"";
      eval ($evalstr);
    }
}

לבסוף אנו רואים את תת השגרה החשובה crumble_cookie. בגלל שעוגיה היא בסך הכל גוש נתונים, מבנה הנתונים הוא שרירותי לחלוטין. כפי שנראה בסקריפט בהמשך, כשניצור את העוגיה, נמציא שיטה פשוטה לאריזת שלשת משתנים אלו וערכיהם לתוך העוגיה, בצורה:

variable1=value1|variable2=value2|variable3=value3

סימן השוויון מפריד בין שם המשתנה וערכו והקו האנכי משמש כתוחם. כאשר העוגיה מאוחזרת, המשתנה $cookie_data עשוי להכיל ערך כמו:

search_term=green|result_style=brief|result_perpage=50

ולכן התפקיד של crumble_cookie הוא לפצל מחרוזת נתונים זו לחלקיה משתנים וערכים, ולבצע את ההשמה ביניהם. הערך של cookie_data$ מפוצל, בכל מופע של הקו האנכי (|), לתוך המערך vars@. זה ייצור לכל פריט מהמערך את הזוג variable=value . אז אנו לוקחים כל פריט מערך ומחלקים אותו שוב סביב סימן השוויון, בעשותנו זאת, אנו בונים מחרוזת, שמוכנסת ל evalstr$ כמו:

$search_term="green"

הפונקציה ()eval ב Perl מריצה את המרוזת כאילו היא שורת פקודה של Perl, ביצוע הפונקציה על המחרוזת למעלה יוצר השמה של “green” לתוך המשתנה search_term$.

אחרי שסיימנו, ל crumble_cookie יש סדרה של שלשה משתנים עם עריכהם השמורים, ולכן כאשר הטופס נשלח לפלט ע"י output_form העריכים שבשימוש הם אלו "שזכרנו" מהגלישה הקודמת.

עוגיות: חברותינו המושמצות
תוכן עניינים
דוגמאות לעוגיות חלק שני: יצירת העוגיה

אודות
תוכן עניינים
פרק 1: ה Perl שאתם צריכים לדעת
פרק 2: קישור Perl לעמודי הרשת
פרק 3: שמירת מצב
שמירת מצבים  
עוגיות; חברותנו המושמצות  
דוגמאות לעוגיות חלק ראשון: אחזור עוגיה  
דוגמאות לעוגיות חלק שני: יצירת העוגיה  
מחשבה אחרונה על עוגיות  
שמירת מצב חד פעמית או תסריט "בניית הפיצריה"  
בניית פיצריה: לקיחת ההזמנה  
בניית פיצריה: חישוב המחיר  
בניית פיצריה: השלמת ההזמנה  
בניית פיצריה: עדכון הזמנה  
הרהור אחרון  
פרק 4: HTML בחטף ותבניות (Templates) רשת
פרק 5: עיבוד וניתוח של עמודי רשת
פרק 6: להשתעשע עם בסיסי נתונים מקוונים:אקסס
פרק 7: המודל MySQL
פרק 8: להשתעשע בבסיסי נתונים - GUFE - החזית הכללית והשימושית
פרק 9: המילניום - ניהול זמן ותאריך
פרק 10: ניהול רשימות והאשים (Hashs)
פרק 11: הפניה להפניה
פרק 12: הכרות עם mod_perl