Gỡ lỗi mẫu Smarty
Kỹ thuật nâng cao để gỡ lỗi Smarty templates trong XOOPS themes và modules.
Sơ đồ chẩn đoán
Phần tiêu đề “Sơ đồ chẩn đoán”flowchart TD A[Template Issue] --> B{Syntax Error?} B -->|Yes| C[Check Braces] B -->|No| D{Variable Issue?}
C --> C1[Match all braces] C1 --> C2[Check tag format] C2 --> C3[View error log]
D -->|Undefined| E[Check Assignment] D -->|Wrong Value| F[Log Variable]
E --> E1[Verify PHP code] E1 --> E2[Assign variable] E2 --> E3[Clear cache]
F --> F1[Enable debug mode] F1 --> F2[Dump variable] F2 --> F3[Check logic]
C3 --> G{Issue Fixed?} E3 --> G F3 --> G
G -->|No| H[Enable Debug Console] G -->|Yes| I[Problem Solved]
H --> J[Check compiled template] J --> K[Review output] K --> GKích hoạt Chế độ gỡ lỗi Smarty
Phần tiêu đề “Kích hoạt Chế độ gỡ lỗi Smarty”Cách 1: Bảng quản trị
Phần tiêu đề “Cách 1: Bảng quản trị”Quản trị viên XOOPS > Cài đặt > Hiệu suất:
- Kích hoạt “Đầu ra gỡ lỗi”
- Đặt “Mức gỡ lỗi” thành 2
Cách 2: Cấu hình mã
Phần tiêu đề “Cách 2: Cấu hình mã”<?php// In mainfile.php or module coderequire_once XOOPS_ROOT_PATH . '/class/smarty/Smarty.class.php';
$tpl = new XoopsTpl();
// Enable debug mode$tpl->debugging = true;
// Optional: Set custom debug template$tpl->debug_tpl = XOOPS_ROOT_PATH . '/class/smarty/debug.tpl';
// Render template$tpl->display('file:template.html');?>Cách 3: Gỡ lỗi Popup trên trình duyệt
Phần tiêu đề “Cách 3: Gỡ lỗi Popup trên trình duyệt”{* Add to template to enable debug in footer *}{debug}Điều này hiển thị một cửa sổ bật lên với tất cả các biến được chỉ định.
Các kỹ thuật gỡ lỗi Smarty phổ biến
Phần tiêu đề “Các kỹ thuật gỡ lỗi Smarty phổ biến”Kết xuất tất cả các biến
Phần tiêu đề “Kết xuất tất cả các biến”<?php// In PHP code$tpl = new XoopsTpl();
// Get all assigned variables$variables = $tpl->get_template_vars();
echo "<pre>";print_r($variables);echo "</pre>";?>Trong mẫu:
{* Display debug info *}<div style="border: 1px red solid; background: #ffffcc; padding: 10px;"> <h3>Debug Info</h3> {debug}</div>Biến cụ thể của nhật ký
Phần tiêu đề “Biến cụ thể của nhật ký”<?php$tpl = new XoopsTpl();
// Check if variable exists$user = $tpl->get_template_var('user');
if ($user === null) { error_log("Variable 'user' not assigned to template");} else { error_log("User data: " . json_encode($user));}?>Kiểm tra biến trong mẫu
Phần tiêu đề “Kiểm tra biến trong mẫu”{* Dump variable for debugging *}<pre>{$variable|print_r}</pre>
{* Or with label *}<pre>User Data:{$user|print_r}</pre>
{* Check if variable exists *}{if isset($user)} <p>User: {$user.name}</p>{else} <p style="color: red;">ERROR: user variable not set</p>{/if}Xem các mẫu đã biên dịch
Phần tiêu đề “Xem các mẫu đã biên dịch”Smarty biên dịch templates thành PHP để tăng hiệu suất. Gỡ lỗi bằng cách xem mã đã biên dịch:
# Find compiled templatesls -la xoops_data/caches/smarty_compile/
# View compiled templatecat xoops_data/caches/smarty_compile/filename.php<?php// Create debug script to view latest compiled template$compile_dir = XOOPS_CACHE_PATH . '/smarty_compile';
// Get latest compiled file$files = glob($compile_dir . '/*.php');usort($files, function($a, $b) { return filemtime($b) - filemtime($a);});
if ($files) { echo "<h1>Latest Compiled Template</h1>"; echo "<pre>"; echo htmlspecialchars(file_get_contents($files[0])); echo "</pre>";}?>Phân tích quá trình biên dịch mẫu
Phần tiêu đề “Phân tích quá trình biên dịch mẫu”<?php// Create modules/yourmodule/debug_smarty.php
require_once '../../mainfile.php';require_once XOOPS_ROOT_PATH . '/vendor/autoload.php';
$tpl = new XoopsTpl();$ray = ray(); // If using Ray debugger
$ray->group('Smarty Configuration');
// Get Smarty paths$ray->label('Compile Dir')->info($tpl->getCompileDir());$ray->label('Cache Dir')->info($tpl->getCacheDir());$ray->label('Template Dirs')->dump($tpl->getTemplateDir());
// Check compiled templates$compile_dir = $tpl->getCompileDir();$compiled_files = glob($compile_dir . '*.php');$ray->label('Compiled Templates')->info(count($compiled_files) . " files");
// Show compilation stats$total_size = 0;foreach ($compiled_files as $file) { $total_size += filesize($file);}$ray->label('Compiled Cache Size')->info(round($total_size / 1024 / 1024, 2) . " MB");
// Check cache directory$cache_dir = $tpl->getCacheDir();$cache_files = glob($cache_dir . '*.php');$ray->label('Cached Templates')->info(count($cache_files) . " files");
$ray->groupEnd();?>Gỡ lỗi các vấn đề cụ thể
Phần tiêu đề “Gỡ lỗi các vấn đề cụ thể”Vấn đề 1: Biến hiển thị trống
Phần tiêu đề “Vấn đề 1: Biến hiển thị trống”<?php$tpl = new XoopsTpl();
// Check what's assigned$user = $tpl->get_template_var('user');
if ($user === null) { error_log("ERROR: 'user' not assigned");} elseif (empty($user)) { error_log("WARNING: 'user' is empty");} else { error_log("user data: " . json_encode($user));}
// Also check in template?>Gỡ lỗi mẫu:
{if !isset($user)} <span style="color: red;">ERROR: user variable not set</span>{elseif empty($user)} <span style="color: orange;">WARNING: user is empty</span>{else} <p>User: {$user.name}</p>{/if}Vấn đề 2: Không tìm thấy khóa mảng
Phần tiêu đề “Vấn đề 2: Không tìm thấy khóa mảng”{* Use safe array access *}
{* WRONG - causes undefined index notice *}{$array.key}
{* CORRECT - check first *}{if isset($array.key)} {$array.key}{else} <span style="color: red;">Key 'key' not found in array</span>{/if}
{* Or use default *}{$array.key|default:'key not found'}Gỡ lỗi trong PHP:
<?php$array = $tpl->get_template_var('array');
if (!isset($array['key'])) { error_log("Missing key in array: " . json_encode(array_keys($array)));}?>Vấn đề 3: Không tìm thấy Plugin/Modifier
Phần tiêu đề “Vấn đề 3: Không tìm thấy Plugin/Modifier”<?phpfunction smarty_modifier_debug($var) { return '<pre style="background: #ffffcc; border: 1px solid red;">' . htmlspecialchars(json_encode($var, JSON_PRETTY_PRINT)) . '</pre>';}?>Đăng ký bằng mã:
<?php$tpl = new XoopsTpl();$tpl->addPluginDir(XOOPS_ROOT_PATH . '/modules/yourmodule/plugins');$tpl->register_modifier('debug', 'smarty_modifier_debug');?>Sử dụng trong mẫu:
{$data|debug}Vấn đề 4: Hiển thị mảng lồng nhau
Phần tiêu đề “Vấn đề 4: Hiển thị mảng lồng nhau”{* Debug nested arrays *}<div style="background: #f5f5f5; padding: 10px; border: 1px solid #ccc;"> <h3>Data Debug</h3> <pre>{$data|@json_encode}</pre></div>
{* Or iterate and show *}<h3>User Data:</h3>{foreach $user as $key => $value} <p><strong>{$key}:</strong> {$value|escape}</p>{/foreach}
{* Check for specific keys *}<h3>Verification:</h3><ul> <li>Has 'name': {if isset($user.name)}✓{else}✗{/if}</li> <li>Has 'email': {if isset($user.email)}✓{else}✗{/if}</li> <li>Has 'id': {if isset($user.id)}✓{else}✗{/if}</li></ul>Tạo mẫu gỡ lỗi
Phần tiêu đề “Tạo mẫu gỡ lỗi”{* Create themes/mytheme/debug.html *}{strip}
<div style="background: #fff3cd; border: 2px solid #ff0000; padding: 20px; margin: 20px 0;"> <h2 style="color: #ff0000;">🔍 SMARTY DEBUG MODE</h2>
<h3>Assigned Variables:</h3> <div style="background: white; padding: 10px; border: 1px solid #999; overflow-x: auto; max-height: 400px;"> {* Show all variables *} {debug output='html'} </div>
<h3>Template Information:</h3> <table style="width: 100%; border-collapse: collapse;"> <tr> <td style="border: 1px solid #999; padding: 5px;"><strong>Current Template:</strong></td> <td style="border: 1px solid #999; padding: 5px;">{$smarty.template}</td> </tr> <tr> <td style="border: 1px solid #999; padding: 5px;"><strong>Smarty Version:</strong></td> <td style="border: 1px solid #999; padding: 5px;">{$smarty.version}</td> </tr> <tr> <td style="border: 1px solid #999; padding: 5px;"><strong>Current Time:</strong></td> <td style="border: 1px solid #999; padding: 5px;">{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}</td> </tr> </table>
<p style="color: #ff0000;"><strong>⚠️ Remove this debug code before going to production!</strong></p></div>
{/strip}Gỡ lỗi hiệu suất
Phần tiêu đề “Gỡ lỗi hiệu suất”Đo kết xuất mẫu
Phần tiêu đề “Đo kết xuất mẫu”<?php$start = microtime(true);
$tpl->display('file:template.html');
$render_time = (microtime(true) - $start) * 1000;
error_log("Template rendered in: {$render_time}ms");
if ($render_time > 100) { error_log("WARNING: Slow template rendering");}?>Kiểm tra hiệu quả bộ đệm
Phần tiêu đề “Kiểm tra hiệu quả bộ đệm”<?php$compile_dir = XOOPS_CACHE_PATH . '/smarty_compile';$cache_dir = XOOPS_CACHE_PATH . '/smarty_cache';
// Count files$compiled = count(glob($compile_dir . '*.php'));$cached = count(glob($cache_dir . '*.php'));
// Size$compile_size = 0;foreach (glob($compile_dir . '*') as $file) { $compile_size += filesize($file);}
$cache_size = 0;foreach (glob($cache_dir . '*') as $file) { $cache_size += filesize($file);}
echo "Compiled: $compiled files (" . round($compile_size/1024/1024, 2) . "MB)";echo "Cached: $cached files (" . round($cache_size/1024/1024, 2) . "MB)";
// Age of files$oldest_compile = min(array_map('filemtime', glob($compile_dir . '*')));$oldest_cache = min(array_map('filemtime', glob($cache_dir . '*')));
echo "Oldest compiled: " . date('Y-m-d H:i:s', $oldest_compile);echo "Oldest cached: " . date('Y-m-d H:i:s', $oldest_cache);?>Xóa và xây dựng lại bộ đệm
Phần tiêu đề “Xóa và xây dựng lại bộ đệm”<?php// Force rebuild of all templates
$tpl = new XoopsTpl();
// Clear cache$tpl->clearCache();$tpl->clearCompiledTemplate();
// Force recompilation$tpl->force_compile = true;
// Render all module templates$modules = ['mymodule', 'publisher', 'downloads'];
foreach ($modules as $module) { $template = "file:" . XOOPS_ROOT_PATH . "/modules/$module/templates/index.html";
try { $tpl->display($template); error_log("Compiled: $module"); } catch (Exception $e) { error_log("Error compiling $module: " . $e->getMessage()); }}
// Disable force compile after done$tpl->force_compile = false;?>Quy trình gỡ lỗi
Phần tiêu đề “Quy trình gỡ lỗi”Quy trình gỡ lỗi từng bước
Phần tiêu đề “Quy trình gỡ lỗi từng bước”graph TD A[Template Not Working] --> B["Step 1: Check Syntax"] B --> C["Step 2: Enable Debug"] C --> D["Step 3: Check Variables"] D --> E["Step 4: View Compiled"] E --> F["Step 5: Verify Output"]
B --> B1["✓ Match braces"] C --> C1["✓ Enable debug mode"] D --> D1["✓ Dump variables"] E --> E1["✓ Review PHP code"] F --> F1["✓ Check HTML output"]Chức năng trợ giúp gỡ lỗi
Phần tiêu đề “Chức năng trợ giúp gỡ lỗi”<?php// Create class/TemplateDebugger.php
class TemplateDebugger { private static $tpl = null; private static $debug_info = [];
public static function init(&$smarty) { self::$tpl = $smarty; }
public static function dumpVar($name) { $var = self::$tpl->get_template_var($name);
if ($var === null) { self::$debug_info[] = "Variable '$name' not found"; return; }
self::$debug_info[] = "$name: " . json_encode($var); }
public static function checkVar($name, $keys = []) { $var = self::$tpl->get_template_var($name);
if ($var === null) { return "ERROR: Variable '$name' not assigned"; }
if (!is_array($var)) { return "$name is not an array"; }
$missing = []; foreach ($keys as $key) { if (!isset($var[$key])) { $missing[] = $key; } }
if ($missing) { return "Missing keys in '$name': " . implode(', ', $missing); }
return "OK: Variable '$name' has all required keys"; }
public static function getReport() { return implode("\n", self::$debug_info); }
public static function logAll() { $vars = self::$tpl->get_template_vars(); error_log("Template Variables: " . json_encode($vars)); }}?>Cách sử dụng:
<?phpTemplateDebugger::init($tpl);TemplateDebugger::dumpVar('user');TemplateDebugger::checkVar('articles', ['id', 'title', 'author']);error_log(TemplateDebugger::getReport());?>Tài liệu liên quan
Phần tiêu đề “Tài liệu liên quan”- Kích hoạt chế độ gỡ lỗi
- Lỗi mẫu
- Sử dụng trình gỡ lỗi Ray
- Tạo khuôn Smarty
#xoops #templates #thông minh #gỡ lỗi #khắc phục sự cố