Přeskočit na obsah

Chyby šablony

Chyby šablony (ladění Smarty)

Sekce “Chyby šablony (ladění Smarty)”

Běžné problémy se šablonami Smarty a techniky ladění pro motivy a moduly XOOPS.


Diagnostický vývojový diagram

Sekce “Diagnostický vývojový diagram”
flowchart TD
A[Template Error] --> B{Error Visible?}
B -->|No| C[Enable Template Debug]
B -->|Yes| D[Read Error Message]
C --> E{Type of Error?}
E -->|Syntax| F[Check Template Syntax]
E -->|Variable| G[Check Variable Assignment]
E -->|Plugin| H[Check Smarty Plugin]
D --> I{Parse Error?}
I -->|Yes| J[Check Braces Matching]
I -->|No| K{Undefined Variable?}
K -->|Yes| L[Check Variable in PHP]
K -->|No| M{File Not Found?}
M -->|Yes| N[Check Template Path]
M -->|No| O[Clear Cache]
F --> P[Fix Syntax]
G --> Q[Verify PHP Code]
H --> R[Install Plugin]
J --> P
L --> Q
N --> S[Verify paths]
O --> T{Error Resolved?}
P --> T
Q --> T
R --> T
S --> T
T -->|No| U[Enable Debug Mode]
T -->|Yes| V[Problem Solved]
U --> D

Běžné chyby šablony Smarty

Sekce “Běžné chyby šablony Smarty”
pie title Template Error Types
"Syntax Errors" : 25
"Undefined Variables" : 25
"Missing Plugins" : 15
"Cache Issues" : 20
"Encoding Problems" : 10
"Path Issues" : 5

Příznaky:

  • Zprávy “Smarty syntaktická chyba”.
  • Šablony se nezkompilují
  • Prázdná stránka bez výstupu

Chybové zprávy:

Syntax error: unrecognized tag 'myfunction'
Unexpected "}" near end of template

Běžné problémy se syntaxí

Sekce “Běžné problémy se syntaxí”

Chybí uzavírací značka:

{* WRONG *}
{if $user}
User: {$user.name}
{* Missing {/if} *}
{* CORRECT *}
{if $user}
User: {$user.name}
{/if}

Nesprávná syntaxe proměnné:

{* WRONG *}
{$user->name} {* Use . not -> *}
{$array[key]} {* Use quoted keys *}
{$func()} {* Can't call functions directly *}
{* CORRECT *}
{$user.name}
{$array.key}
{$array['key']}
{$user|@function} {* Use modifiers instead *}

Neodpovídající uvozovky:

{* WRONG *}
{if $name == 'John} {* Mismatched quotes *}
{assign var="user' value="John"}
{* CORRECT *}
{if $name == 'John'}
{assign var="user" value="John"}

Řešení:

{* Always balance braces *}
{if condition}
...
{elseif condition}
...
{else}
...
{/if}
{* Verify tag format *}
{foreach $items as $item}
...
{/foreach}
{* Check all variables are defined *}
{if isset($variable)}
{$variable}
{/if}

2. Nedefinované chyby proměnných

Sekce “2. Nedefinované chyby proměnných”

Příznaky:

  • Varování “Nedefinovaná proměnná”.
  • Proměnné se zobrazí jako prázdné
  • Upozornění PHP v protokolu chyb

Chybové zprávy:

Notice: Undefined variable: myvar
Smarty notice: variable "$user" not available

Skript ladění:

<?php
// In your template file or PHP code
// Create modules/yourmodule/debug_template.php
require_once '../../mainfile.php';
// Get template engine
$tpl = new XOOPSTpl();
// Check what variables are assigned
echo "<h1>Template Variables</h1>";
echo "<pre>";
print_r($tpl->get_template_vars());
echo "</pre>";
// Or dump Smarty object
echo "<h1>Smarty Debug</h1>";
echo "<pre>";
$tpl->debug_vars();
echo "</pre>";
?>

Oprava v PHP:

<?php
// Ensure variables are assigned before rendering
$xoopsTpl = new XOOPSTpl();
// WRONG - variable not assigned
$xoopsTpl->display('file:templates/page.html');
// CORRECT - assign variables first
$user = [
'name' => 'John',
'email' => 'john@example.com'
];
$xoopsTpl->assign('user', $user);
$xoopsTpl->display('file:templates/page.html');
?>

Oprava v šabloně:

{* Check if variable exists before using *}
{if isset($user)}
<p>User: {$user.name}</p>
{else}
<p>No user data</p>
{/if}
{* Use default values *}
<p>Name: {$user.name|default:"No name"}</p>
{* Check array key exists *}
{if isset($array.key)}
{$array.key}
{/if}

3. Chybějící nebo nesprávné modifikátory

Sekce “3. Chybějící nebo nesprávné modifikátory”

Příznaky:

  • Data se neformátují správně
  • Text se zobrazí jako HTML
  • Nesprávné case/encoding

Chybové zprávy:

Warning: undefined modifier 'stripslashes'

Běžné modifikátory:

{* String operations *}
{$text|upper} {* Uppercase *}
{$text|lower} {* Lowercase *}
{$text|capitalize} {* First letter capital *}
{$text|truncate:20:"..."} {* Truncate to 20 chars *}
{$text|strip_tags} {* Remove HTML tags *}
{* HTML/Formatting *}
{$html|escape} {* HTML escape *}
{$html|escape:'html'}
{$url|escape:'url'} {* URL escape *}
{$text|nl2br} {* Newlines to <br> *}
{* Arrays *}
{$array|@count} {* Array count *}
{$array|@implode:', '} {* Join array *}
{* Default values *}
{$var|default:"No value"}
{* Date formatting *}
{$date|date_format:"%Y-%m-%d"} {* Format date *}
{* Math operations *}
{$number|math:'+':10} {* Math operations *}

Zaregistrovat vlastní modifikátor:

<?php
// Register in your module
$xoopsTpl = new XOOPSTpl();
$xoopsTpl->register_modifier('mymodifier', 'my_modifier_function');
function my_modifier_function($string) {
return strtoupper($string);
}
?>

4. Problémy s mezipamětí

Sekce “4. Problémy s mezipamětí”

Příznaky:

  • Změny šablony se nezobrazují
  • Starý obsah se stále zobrazuje
  • Zastaralé zahrnuje nebo zdroje

Řešení:

Terminál
# Clear Smarty cache directories
rm -rf /path/to/xoops/xoops_data/caches/smarty_cache/*
rm -rf /path/to/xoops/xoops_data/caches/smarty_compile/*
# Clear specific module cache
rm -rf /path/to/xoops/xoops_data/caches/smarty_cache/modules/*

Vymazat mezipaměť v kódu:

<?php
// Clear all Smarty caches
$xoopsTpl = new XOOPSTpl();
$xoopsTpl->clear_cache();
$xoopsTpl->clear_compiled_tpl();
// Clear specific template cache
$xoopsTpl->clear_cache('file:templates/page.html');
// Clear all cached files
require_once XOOPS_ROOT_PATH . '/class/xoopsfile.php';
$dh = opendir(XOOPS_CACHE_PATH . '/smarty_cache');
while (($file = readdir($dh)) !== false) {
if (is_file(XOOPS_CACHE_PATH . '/smarty_cache/' . $file)) {
unlink(XOOPS_CACHE_PATH . '/smarty_cache/' . $file);
}
}
closedir($dh);
?>

5. Chyby nenalezen plugin

Sekce “5. Chyby nenalezen plugin”

Příznaky:

  • “Neznámý modifikátor” nebo “Neznámý plugin”
  • Vlastní funkce nefungují
  • Chyby kompilace s pluginy

Chybové zprávy:

Fatal error: Call to undefined function smarty_modifier_custom
Unknown modifier 'myfunction'

Vytvořit vlastní plugin:

modules/yourmodule/plugins/modifier.custom.php
<?php
/**
* Smarty {$var|custom} modifier plugin
*/
function smarty_modifier_custom($string, $param = '') {
// Your custom code
return strtoupper($string) . $param;
}
?>

Zaregistrovat plugin:

<?php
// In your module's init code
$xoopsTpl = new XOOPSTpl();
// Add plugin directory to Smarty
$xoopsTpl->addPluginDir(
XOOPS_ROOT_PATH . '/modules/yourmodule/plugins'
);
// Or manually register
$xoopsTpl->register_modifier(
'custom',
'smarty_modifier_custom'
);
?>

Typy pluginů:

modifier.name.php
<?php
function smarty_modifier_name($string) {
return $string;
}
// Block plugin: block.name.php
function smarty_block_name($params, $content, &$smarty, &$repeat) {
if (!isset($smarty->security_settings['IF_FUNCS'])) {
$smarty->security_settings['IF_FUNCS'] = [];
}
return $content;
}
// Function plugin: function.name.php
function smarty_function_name($params, &$smarty) {
return 'output';
}
// Filter plugin: filter.name.php
function smarty_filter_name($code, &$smarty) {
return $code;
}
?>

6. Problémy se šablonou Include/Extends

Sekce “6. Problémy se šablonou Include/Extends”

Příznaky:

  • Zahrnuté šablony se nenačtou
  • Nadřazená šablona nebyla nalezena
  • CSS/JS se nenačítá

Chybové zprávy:

Template file 'file:path/to/template.html' not found
Can't find template file 'header.html'

Správná syntaxe Include:

{* Include template *}
{include file="file:templates/header.html"}
{* Include with variables *}
{include file="file:templates/header.html" title="My Page"}
{* Template inheritance *}
{extends file="file:templates/base.html"}
{* Named blocks *}
{block name="content"}
Page content here
{/block}
{* Static resources *}
<link rel="stylesheet" href="{$xoops_url}/themes/{$xoops_theme}/style.css">
<script src="{$xoops_url}/modules/{$xoops_module_dir}/js/script.js"></script>

Zkontrolujte cestu šablony:

Terminál
# Verify template file exists
ls -la /path/to/xoops/themes/mytheme/templates/
ls -la /path/to/xoops/modules/mymodule/templates/
# Check permissions
stat /path/to/xoops/themes/mytheme/templates/header.html

7. Proměnný přístup Array/Object

Sekce “7. Proměnný přístup Array/Object”

Příznaky:

  • Nelze získat přístup k hodnotám pole
  • Vlastnosti objektu se nezobrazují
  • Komplexní proměnné selžou

Chybové zprávy:

Undefined variable: user.profile.name

Správná syntaxe:

{* Array access *}
{$array.key} {* Use . for keys *}
{$array['key']}
{$array.0} {* Numeric indexes *}
{$array.$variable_key} {* Dynamic keys *}
{* Nested arrays *}
{$user.profile.name}
{$data.items.0.title}
{* Object properties *}
{$object.property}
{$object.method|escape} {* Method calls *}
{* Safe access with isset *}
{if isset($array.key)}
{$array.key}
{/if}
{* Check length *}
{if count($array) > 0}
Items found
{/if}

8. Problémy s kódováním znaků

Sekce “8. Problémy s kódováním znaků”

Příznaky:

  • Zkomolený text v šablonách
  • Nesprávné zobrazení speciálních znaků
  • UTF-8 znaků je přerušeno

Řešení:

Kódování souboru šablony:

{* Set charset in meta tag *}
<meta charset="UTF-8">
{* Or in HTML head *}
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
{* Proper PHP declaration *}
header('Content-Type: text/html; charset=utf-8');

PHP Kód:

<?php
// Set output encoding
header('Content-Type: text/html; charset=utf-8');
// Ensure database uses UTF-8
$conn = new mysqli('localhost', 'user', 'pass', 'db');
$conn->set_charset('utf8mb4');
// Or in SQL
SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
// Assign data properly
$text = mb_convert_encoding($text, 'UTF-8', 'UTF-8');
$xoopsTpl->assign('text', $text);
?>

Konfigurace režimu ladění

Sekce “Konfigurace režimu ladění”

Povolit ladění šablon:

<?php
// In mainfile.php
define('XOOPS_DEBUG_LEVEL', 2);
// In Smarty configuration
$xoopsTpl->debugging = true;
$xoopsTpl->debug_tpl = SMARTY_DIR . 'debug.tpl';
// Or in module
$tpl = new XOOPSTpl();
$tpl->debugging = true;
?>

Výstup ladicí konzoly:

<?php
// Create modules/yourmodule/debug_smarty.php
require_once '../../mainfile.php';
require_once XOOPS_ROOT_PATH . '/class/smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->debugging = true;
// Check compiled template
$compiled_dir = $smarty->getCompileDir();
echo "<h1>Compiled Templates</h1>";
$files = glob($compiled_dir . '/*.php');
foreach ($files as $file) {
echo "<p>" . basename($file) . "</p>";
}
// View compiled code
echo "<h1>Compiled Code</h1>";
echo "<pre>";
$latest = max(array_map('filemtime', $files));
foreach ($files as $file) {
if (filemtime($file) == $latest) {
echo htmlspecialchars(file_get_contents($file));
break;
}
}
echo "</pre>";
?>

Kontrolní seznam pro ověření šablony

Sekce “Kontrolní seznam pro ověření šablony”
graph TD
A[Template Validation] --> B["1. Syntax Check"]
A --> C["2. Variable Verification"]
A --> D["3. Plugin Check"]
A --> E["4. File Paths"]
A --> F["5. Encoding"]
A --> G["6. Cache"]
B --> B1["✓ All braces matched"]
B --> B2["✓ All tags closed"]
B --> B3["✓ Proper syntax"]
C --> C1["✓ Variables assigned"]
C --> C2["✓ Correct property access"]
C --> C3["✓ Default values set"]
D --> D1["✓ Modifiers available"]
D --> D2["✓ Plugins registered"]
D --> D3["✓ Custom functions work"]
E --> E1["✓ Relative paths correct"]
E --> E2["✓ Files exist"]
E --> E3["✓ Permissions correct"]
F --> F1["✓ UTF-8 declared"]
F --> F2["✓ HTML charset set"]
F --> F3["✓ Database UTF-8"]
G --> G1["✓ Cache cleared"]
G --> G2["✓ Compiled fresh"]

Prevence a osvědčené postupy

Sekce “Prevence a osvědčené postupy”
  1. Povolit ladění během vývoje
  2. Ověřte šablony před nasazením
  3. Po změnách vymažte mezipaměť
  4. Použijte git ke sledování změn šablony
  5. Otestujte ve více prohlížečích problémy s kódováním
  6. Dokumentujte vlastní pluginy a modifikátory
  7. Použijte dědičnost šablon pro konzistenci

Související dokumentace

Sekce “Související dokumentace”
  • Průvodce laděním Smarty
  • Šablona Smarty
  • Povolit režim ladění
  • Motiv FAQ

#xoops #řešení problémů #šablony #chytré #ladění