จาก forum ที่ถามเรื่องการใช้ Smarty + Ajax ทำให้ผมจับประเด็นได้อย่างหนึ่ง สำหรับคนที่เพิ่งเริ่มใช้ smarty หรือยังสแกนอ่าน manual ไม่หมด ทำให้ไม่รู้ว่าใน smarty นั้นมี function {literal} เอาไว้สำหรับให้ smarty ข้าม code ที่อยู่ใน {literal} นี้ ในกรณีที่เราอยากจะเขียน code ต่างๆ ที่อาจจะไป match กับ syntax ของ smarty แต่ไม่อยากให้ smarty มา compile เช่นการเขียน code java script ใน smarty template เป็นต้น
ปกติ basic syntax ของ smarty template นั้น tag ของ smarty จะขึ้นต้นด้วย { และจบด้วย } (นอกจากคุณจะเซตให้เป็นอย่างอื่น) ตัวอย่างเช่น
ตัวอย่างที่ 1: Smarty Template อย่างง่าย
<title>Hello Smarty!</title> </head> {if $name} Hello, K.{$name}. {else} Hello, K.Noname. {/if} </body> </html>
แต่กรณีที่ใน smarty template ของคุณมี code ของ java script เช่น
ตัวอย่างที่ 2: มี code java script ใน Smarty Tempalte
<title>Hello Smarty!</title> <script type="text/javascript"> function myAlert(name) { if(name) { alert("Hello again, K." name "."); } else { alert("Hello again, K.Noname."); } } </script> </head> {if $name} Hello, K.{$name}. {else} Hello, K.Noname. {/if} <script type="text/javascript"> myAlert("{$name}"); </script> </body> </html>
ในตัวอย่างที่ 2 นี้ ถ้านำ template นี้ไปใช้เลย ก็จะเจอ Error
Fatal error: Smarty error: [in tplName.html line 6]: syntax error: unrecognized tag: if(name) ...
นั่นเพราะว่า smarty กำลังจะ compile code java script ของเรา ซึ่งแน่นอน ไม่เกิด error ที่ใด ก็ต้องที่หนึ่งค่อนข้างแน่
วิธีแก้ไข
ก็คือ ไม่ต้องให้ smarty compile code ตรงส่วนนี้ โดยใส่ {literal} คล่อม ตรง code ที่ไม่ต้องการให้ compile เช่น
<title>Hello Smarty!</title> {literal} <script type="text/javascript"> function myAlert(name) { if(name) { alert("Hello again, K." + name + "."); } else { alert("Hello again, K.Noname."); } } </script> {/literal} </head> {if $name} Hello, K.{$name}. {else} Hello, K.Noname. {/if} <script type="text/javascript"> myAlert("{$name}"); </script> </body> </html>
สังเกตุดูตรง line ที่ 4 และ 18 ว่าเราคล่อม code java script ด้วย {literal} ไว้แล้ว และเราไม่ไปคล่อมใน line ที่ 28-30 ซึ่งก็เป็น code java script เช่นกัน เพราะว่า ใน line 29 นั้น มี smarty tag อยู่ ซึ่งเราอยากให้ smarty compile ให้ และทั้งนี้ ทั้งนั้น ใน line ที่ 28-30 ไม่มี code ที่ผิด syntax ของ smarty ด้วย
และมาดูอีกกรณีหนึ่ง
ตัวอย่างที่ 3: มี code smarty ปนกันกับ code java script
<title>Hello Smarty!</title> <script type="text/javascript"> {literal} function myAlert() { {/literal} var name = "{$name}"; {literal} if(name) { alert("Hello again, K." + name + "."); } else { alert("Hello again, K.Noname."); } } {/literal} </script> </head> {if $name} Hello, K.{$name}. {else} Hello, K.Noname. {/if} <script type="text/javascript"> myAlert(); </script> </body> </html>
สังเกตุตัวอย่างที่ 3 นี้ การที่มี code smarty ปนกับ code java script อย่างนี้ ซึ่งเราต้องการให้ compile บาง line และบาง line ไม่ต้องการให้ compile เราทำได้โดยใช้ {literal} คล่อมส่วนที่เราไม่ต้องการให้ conpile ดังตัวอย่างที่ 3 เราจะไม่ คล่อม code java script ทั้งหมด แต่คล่อมเป็นส่วนๆ แทน
- roteee's blog
- Login to post comments
- 1124 reads
เป็นประโยชน์มาก ๆ ครับ
ผมเองก็ข้ามในส่วนนี้ โดยการจับจาวาสคริปต์ไปไว้ใน .js ทั้งหมด เพื่อเลี่ยงปัญหาที่ว่าคอมไพล์ไม่ผ่านแหละครับ
เสร็จแล้วก็ทิ้ง ไม่ได้กลับไปศึกาารายละเอียดอีกเลย
ขอบคุณครับ