จาก 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 อย่างง่าย

 

  1. <title>Hello Smarty!</title>
  2. </head>
  3.  
  4. {if $name}
  5. Hello, K.{$name}.
  6. {else}
  7. Hello, K.Noname.
  8. {/if}
  9. </body>
  10. </html>

 

แต่กรณีที่ใน smarty template ของคุณมี code ของ java script เช่น

ตัวอย่างที่ 2: มี code java script ใน Smarty Tempalte

 

  1. <title>Hello Smarty!</title>
  2. <script type="text/javascript">
  3. function myAlert(name)
  4. {
  5. if(name)
  6. {
  7. alert("Hello again, K." name ".");
  8. }
  9. else
  10. {
  11. alert("Hello again, K.Noname.");
  12. }
  13. }
  14. </script>
  15. </head>
  16.  
  17. {if $name}
  18. Hello, K.{$name}.
  19. {else}
  20. Hello, K.Noname.
  21. {/if}
  22.  
  23. <script type="text/javascript">
  24. myAlert("{$name}");
  25. </script>
  26. </body>
  27. </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 เช่น

 

  1. <title>Hello Smarty!</title>
  2. {literal}
  3. <script type="text/javascript">
  4. function myAlert(name)
  5. {
  6. if(name)
  7. {
  8. alert("Hello again, K." + name + ".");
  9. }
  10. else
  11. {
  12. alert("Hello again, K.Noname.");
  13. }
  14. }
  15. </script>
  16. {/literal}
  17. </head>
  18.  
  19. {if $name}
  20. Hello, K.{$name}.
  21. {else}
  22. Hello, K.Noname.
  23. {/if}
  24.  
  25. <script type="text/javascript">
  26. myAlert("{$name}");
  27. </script>
  28. </body>
  29. </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

 

  1. <title>Hello Smarty!</title>
  2. <script type="text/javascript">
  3. {literal}
  4. function myAlert()
  5. {
  6. {/literal}
  7. var name = "{$name}";
  8. {literal}
  9. if(name)
  10. {
  11. alert("Hello again, K." + name + ".");
  12. }
  13. else
  14. {
  15. alert("Hello again, K.Noname.");
  16. }
  17. }
  18. {/literal}
  19. </script>
  20. </head>
  21.  
  22. {if $name}
  23. Hello, K.{$name}.
  24. {else}
  25. Hello, K.Noname.
  26. {/if}
  27.  
  28. <script type="text/javascript">
  29. myAlert();
  30. </script>
  31. </body>
  32. </html>

สังเกตุตัวอย่างที่ 3 นี้ การที่มี code smarty ปนกับ code java script อย่างนี้ ซึ่งเราต้องการให้ compile บาง line และบาง line ไม่ต้องการให้ compile เราทำได้โดยใช้ {literal} คล่อมส่วนที่เราไม่ต้องการให้ conpile ดังตัวอย่างที่ 3 เราจะไม่ คล่อม code java script ทั้งหมด แต่คล่อมเป็นส่วนๆ แทน