Smarty 預設使用 {} 作為定界符,而 CSS 規則集同樣使用 {},若直接在模板中內嵌 <style> 區塊,會導致 Smarty 解析錯誤(「Unknown tag」)。本文提供三種解決方案,由簡至繁。
將 CSS 抽離為獨立 .css 檔案,以 <link> 引入。這是最佳實踐,優點:
{* template.tpl *}
<html>
<head>
<title>{$title}</title>
<link rel="stylesheet" href="/css/app.css?v={$version}">
</head>
<body>...</body>
</html>
{literal} 標籤包裹若必須內嵌 CSS(如關鍵 CSS 內聯、動態樣式),用 {literal}...{/literal} 告訴 Smarty 「原樣輸出,不解析」:
<style>
{literal}
.container { margin: 0 auto; max-width: 1200px; }
.btn { padding: 8px 16px; border-radius: 4px; }
{/literal}
</style>
在 PHP 程式碼中設定 left_delimiter、right_delimiter 為較罕見的字串:
$smarty = new Smarty();
$smarty->left_delimiter = '';
// 模板中改用新定界符
<title></title>
<style>
.box { color: red; } <!-- 普通大括號不再衝突 -->
</style>
Smarty 3 支援在模板中臨時變更定界符:
{* 區塊開始 *}
{ldelim}}rdelim}
{* 區塊結束,恢復預設定界符 *}
但語法較繁瑣,實務上較少用。
{literal} 包裹。{literal} 可巢狀:不支援巢狀,內層 {literal} 會被當作文字輸出。{literal} 區塊中使用變數:不會被解析,原樣輸出 {$var}。遵循「關注點分離」原則,將樣式、腳本、結構分離,是解決模板引擎語法衝突的根本之道。現代前端工程化(Webpack、Vite、CSS Modules)更進一步解決了命名衝突、依賴管理、構建優化等問題,建議專案漸進式升級。