jiyuu-מחשבות פתוחות

שימוש ב-HTML_QuickForm בשילוב עם Smarty

08/05/2008 22:24 ע"י כתריאל טראום

מכיוון ששתי אלו "טכנולוגיות" שאני משתמש בהם ב-Jiyuu בכל מקרה, חשבתי אולי אכתוב איזה מדריכון על איך לשלב בין השתיים.

הקדמה

לדעתי, 2 מהדברים הכי מייגעים בבנית כל אפליקציית Web הוא כתיבת טפסים ועיצוב הפלט.

  • השילוש הקדוש של יצירה\עריכה\מחיקה הוא אחד מהדברים האחרונים שאני תמיד כותב.
  • עיצוב העמודים, אם יש משהו שאני לא אוהב זה המגושמות של שילוב של HTML בתוך PHP או להפך.

2 הפתרונות שמצאתי, אשר עוזרים ומקלים עלי הם HTML_QuickForm ו-Smarty. שניהם פתרונות שבנויים כ-Class אשר מאפשרים שימוש נוח ואפילו הרחבה בעת הצורך.

HTML_QuickForm

HTML_QuickForm היא הרחבת PEAR שמאפשרת בניית טפסים בצורה מונחת עצמים ונוחה. דוגמה קטנה:

require_once('HTML/QuickForm.php');
$form = new HTML_QuickForm('formName','post');

$form->addElement('text','name','Name');
$form->addElement('text','address','Address');
$form->addElement('text','email','E-Mail');
$form->addElement('submit','send','Send');

$form->addRule('name','Please enter name','required');

if ($form->validate()) {
  // save data
} else {
  $form->display();
}

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

$form->addElemnt('text','name','Name');
$form->addElement('text','address','Address');

//Fetch data from DB

foreach ($resultSet as $key => $val) {
 if ($form->elementExists($key)) {
  $form->setDefaults(array($key=>$val));
 }
}

הפלט שמייצר HTML_QuickForm נראה סביר, אבל משתמש בשיטות בניית HTML שקצת פסו מן העולם: טבלאות.

Smarty

ה"שנאה" השניה שלי היא בניית דפי HTML דרך שילוב PHP בתוך הדף או שליחת פלט HTML-י דרך קוד PHP. לאחר בחינת כמה חלופות, בחרתי ב-Smarty. המנוע מאפשר בניית דפי HTML ו"שתילת" משתנים ופונקציות שמוחלפות בזמן עיבוד ה-Template. שימוש ב-Smarty אולי לא נראה נחוץ ואפילו קצת Over-Kill באפליקציות קטנות כמו Jiyuu. אבל גם כאן, אני חושב שכל אפליקציה יכול להרוויח מההפרדה בין HTML ל-PHP. דוגמה לקוד שמשתמש ב-Smarty:

$smarty = new Smarty();

$smarty->assign('itemList',fetchItemList());
$smarty->register_function('formatTimeString','_formatTimeString');

$smarty->display('template.tpl');

והשבלונה אשר אותה מציג הקוד:

<ol>
{foreach from=$itemList item=$item}
 <li>{formatString param=$item}</li>
{/foreach}
</ol>

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

שילוב בין השתיים

כמו שכבר ציינתי, פלט ברירת המחדל של HTML_QuickForm הוא טבלאי ולא ממש גמיש. לשמחתי, ל-QuickForm יש תמיכה ב-Renderers שונים שמאפשרים לשנות את הפלט של הטופס, אחד מהם הוא SmartyArray. שימוש ב-SmartyArray מאפשר שיוך של Array ל-Template ושימוש באותו ה-Array, אשר מכיל את כל המידע של הטופס בתוך ה-Template. את הדוגמא הראשונה של בניית הטופס נצטרך לשנות מעט:

require_once('HTML/QuickForm.php');
require_once('HTML/QuickForm/Renderer/ArraySmarty.php');
$form = new HTML_QuickForm('formName','post');
$tpl = new Smarty();
$renderer =& new HTML_QuickForm_Renderer_ArraySmarty($tpl);

$form->addElement('text','name','Name');
$form->addElement('text','address','Address');
$form->addElement('text','email','E-Mail');
$form->addElement('submit','send','Send');

$form->addRule('name','Please enter name','required');

if ($form->validate()) {
 // save data
} else {
 $form->accept($renderer);
 $tpl->assign('form', $renderer->toArray());
 $tpl->display('form.tpl');
}

וה-Template יראה כך:

<form {$form.attributes}>
  {$form.hidden}
  {$form.name.label} {$form.name.html}<br />
  {$form.address.label} {$form.address.html}<br />
  {$form.email.label} {$form.email.html}<br />
  {$form.send.html}     
</form>

פלט לדוגמא של הטופס ניתן לראות בכתובת הבאה


 

תגובות ל: "שימוש ב-HTML_QuickForm בשילוב עם Smarty" | הוסף תגובה

 

ע"י ליאור קפלן

09/05/2008 01:31
החסרון בתבניות האלה הם שלא ניתן לערוך אותם בעורכי HTML/PHP וזאת בגלל שהם לא יודעים איך להתמודד עם כל המשתנים האלה. למעט הבעיה הזאת השימוש בתבניות הוא אכן חשוב וחוסך הרבה כאבי ראש של הצימוד בין הלוגיקה (קוד ה-PHP) לבין המראה (קוד ה-HTML).