logo


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

בניית פיצריה: עדכון ההזמנה

נותר לעבור רק על עוד שגרה אחת ב buildapizza.cgi, וזוהי השגרה output_form אשר די דומה ל output_form שראינו בדוגמת יצירת העוגיה. ובדומה לה היא גם די ארוכה.

sub output_form()
 #construct and output the pizza form HTML
 { $theform=$cgiobject->startform(-name=>'pizzaform',
                                  -method=>'get',
                                  -action=>'/cgi-bin/buildapizza.cgi');
   #create name text input field
   $theform.="Your name: ";
   $theform.=$cgiobject->textfield(-name=>'order_name',
                                   -size=>30,
                                   -default=>$name);
   
   #create phone text input field
   $theform.="<BR>Your telephone number: ";
   $theform.=$cgiobject->textfield(-name=>'order_phone',
                                   -size=>10,
                                   -default=>$phone);
   
   #create address text input field if deliver option selected
   $theform.="<BR>Deliver to address:<BR>";
   $theform.=$cgiobject->textarea(-name=>'order_address',
                                   -rows=>3,
                                   -default=>$address);

   #create delivery radio buttons
   $theform.="<BR>";
   $theform.=$cgiobject->radio_group(-name=>'order_deliver',
                                     -values=>["pickup","deliver"],
                                     -default=>$deliver);

   #create toppings checkboxes
   $theform.="<HR>Please select toppings from the list below:<BR>";
   $theform.="<SMALL>Note: Each topping costs ".
   		".50,.75,1.00,1.25 for S,M,L,XL ".
   		"pizza</SMALL>";
   $theform.=$cgiobject->checkbox_group(-name=>'order_toppings',
					-values=>['pepperoni',
						  'sausage',
						  'meatball',
						  'mushroom',
						  'peppers',
						  'pineapple',
						  'ham',
						  'shrimp',
						  'tomato',
						  'onion',
						  'anchovies',
						  'liver'],
                                        -default=>$toppings,
                                        -linebreak=>'false',
                                        -columns=>3);
   
   #create size radio buttons
   $theform.="<BR>Select a pizza size: ";
   $theform.=$cgiobject->
   		radio_group(-name=>'order_size',
			    -values=>["small",
				      "medium",
				      "large",
				      "xlarge"],
			    -labels=>\%sizelabels,
			    -default=>$size);
   
   #create hidden field for newOrderFlag
   $theform.=$cgiobject->hidden(-name=>'newOrderFlag',-value=>'1');
   
   
   #create submit and reset buttons
   $theform.="<BR><BR>";
   $theform.=$cgiobject->submit(-name=>"calculate",
                                -label=>'Calculate');
   $theform.=$cgiobject->submit(-name=>"finish",
                                -label=>'Finish Order');
   
   $theform.=$cgiobject->endform;
   print $theform
 }      

כמו שראינו קודם, שגרה זו פולטת את כל השדות. ערכי ברירת המחדל של כל שדה הם המשתנים המוכללים בתוך אובייקט ה CGI, למשל שדה ה"order_name" מתחיל מהערך ב name$, אשר מקורו במידע שנתקבל מהשדה בשליחה (submission) הקודמת (או, במידה וזהי הפעם הראשונה, מערך ברירת המחדל המסופק ע"י init).

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

-values=>["small","medium","large","xlarge"]

        

תגיות אלו, המופיעות על המסך, מוגדרות קודם לכן בהאש הנקרא sizelabels% בשגרה calcTotal.

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

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

בניית פיצריה: עדכון הזמנה
תוכן עניינים
הרהור אחרון

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