פרק 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 כפי שהודגם כאן, מונע מאתנו את הצורך להתעסק עם עוגיות. בניית
פיצריה: עדכון הזמנה
|