Μετάβαση στο περιεχόμενο

Smarty 4 Migration

Αυτός ο οδηγός καλύπτει τις αλλαγές και τα βήματα μετεγκατάστασης που απαιτούνται κατά την αναβάθμιση από Smarty 3 σε Smarty 4 στο XOOPS. Η κατανόηση αυτών των διαφορών είναι απαραίτητη για τη διατήρηση της συμβατότητας με τις σύγχρονες εγκαταστάσεις XOOPS.

  • Smarty-Basics - Fundamentals of Smarty in XOOPS
  • Ανάπτυξη θεμάτων - Δημιουργία XOOPS θεμάτων
  • Template-Variables - Διαθέσιμες μεταβλητές σε πρότυπα

Το Smarty 4 εισήγαγε αρκετές σημαντικές αλλαγές από το Smarty 3:

  1. Η συμπεριφορά ανάθεσης μεταβλητής άλλαξε
  2. Οι ετικέτες {php} αφαιρέθηκαν πλήρως
  3. Η προσωρινή αποθήκευση API αλλάζει
  4. Ενημερώσεις χειρισμού τροποποιητών
  5. Αλλαγές πολιτικής ασφαλείας
  6. Καταργήθηκαν οι καταργημένες λειτουργίες

Στο Smarty 2/3, οι εκχωρημένες τιμές ήταν άμεσα προσβάσιμες:

// PHP
$GLOBALS['xoopsTpl']->assign('mod_url', $helper->url());
{* Smarty 2/3 - worked fine *}
<img src="<{$mod_url}>/assets/images/icon.png">

Στο Smarty 4, οι μεταβλητές είναι τυλιγμένες σε Smarty_Variable αντικείμενα:

Smarty_Variable Object
(
[value] => http://example.com/modules/mymodule/
[nocache] =>
)
{* Smarty 4 - access the value property *}
<img src="<{$mod_url->value}>/assets/images/icon.png">

Ενεργοποιήστε τη λειτουργία συμβατότητας στο PHP:

$smarty = new Smarty();
$smarty->setCompatibilityMode(true);

Αυτό επιτρέπει την άμεση πρόσβαση μεταβλητών όπως το Smarty 3.

Γράψτε πρότυπα που λειτουργούν και στις δύο εκδόσεις:

<{if $smarty.version|regex_replace:'[^0-9]':'' >= 4}>
<{$mod_url->value}>
<{else}>
<{$mod_url}>
<{/if}>

Δημιουργήστε μια βοηθητική συνάρτηση για αναθέσεις:

function smartyAssign($smarty, $name, $value)
{
if (version_compare($smarty->version, '4.0.0', '>=')) {
// Smarty 4+ - assign normally, access via ->value in templates
$smarty->assign($name, $value);
} else {
// Smarty 3 - standard assignment
$smarty->assign($name, $value);
}
}

Το Smarty 3+ δεν υποστηρίζει ετικέτες {php} για λόγους ασφαλείας:

{* This NO LONGER works in Smarty 3+ *}
<{assign var="cid" value=$downloads.cid}>
<{php}>
$catid = $this->get_template_vars('cid');
<{/php}>
{* Use Smarty's built-in variable access *}
<{assign var="cid" value=$downloads.cid}>
<{assign var="catid" value=$smarty.template_vars.cid}>

Η σύνθετη λογική πρέπει να βρίσκεται στο PHP, όχι στα πρότυπα:

// In PHP - do the processing
$catid = $downloads['cid'];
$categoryInfo = getCategoryInfo($catid);
// Assign processed data to template
$GLOBALS['xoopsTpl']->assign('category', $categoryInfo);
{* In template - just display *}
<h2><{$category.name}></h2>

Για επαναχρησιμοποιήσιμη λειτουργικότητα, δημιουργήστε προσθήκες Smarty:

/class/smarty/plugins/function.getcategory.php
function smarty_function_getcategory($params, $smarty)
{
$catId = $params['id'] ?? 0;
$categoryHandler = xoops_getModuleHandler('category', 'mymodule');
$category = $categoryHandler->get($catId);
if ($category) {
$smarty->assign($params['assign'], $category->toArray());
}
}
{* In template *}
<{getcategory id=$cid assign="category"}>
<h2><{$category.name}></h2>
// Smarty 3 style
$smarty->caching = true;
$smarty->cache_lifetime = 3600;
$smarty->cache_dir = '/path/to/cache';
// Per-variable nocache
$xoopsTpl->tpl_vars["mod_url"]->nocache = false;
// Smarty 4 style
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
$smarty->setCacheLifetime(3600);
$smarty->setCacheDir('/path/to/cache');
// Or using properties (still works)
$smarty->caching = Smarty::CACHING_LIFETIME_CURRENT;
$smarty->cache_lifetime = 3600;
// Caching modes
Smarty::CACHING_OFF // No caching
Smarty::CACHING_LIFETIME_CURRENT // Use cache_lifetime
Smarty::CACHING_LIFETIME_SAVED // Use cached lifetime
{* Mark content as never cached *}
<{nocache}>
<p>Current time: <{$smarty.now|date_format:"%H:%M:%S"}></p>
<{/nocache}>

Ορισμένοι τροποποιητές μετονομάστηκαν ή καταργήθηκαν:

{* Smarty 3 *}
<{$text|escape:'htmlall'}>
{* Smarty 4 - use 'html' instead *}
<{$text|escape:'html'}>

Οι τροποποιητές πίνακα απαιτούν το πρόθεμα @:

{* Count array elements *}
<{$items|@count}> items
{* Join array *}
<{$tags|@implode:', '}>
{* JSON encode *}
<{$data|@json_encode}>

Οι προσαρμοσμένοι τροποποιητές πρέπει να είναι εγγεγραμμένοι:

// Register a custom modifier
$smarty->registerPlugin('modifier', 'my_modifier', 'my_modifier_function');
function my_modifier_function($string, $param1 = 'default')
{
// Process and return
return processed_string($string, $param1);
}

Το Smarty 4 έχει αυστηρότερη προεπιλεγμένη ασφάλεια:

// Configure security policy
$smarty->enableSecurity('Smarty_Security');
// Or create custom policy
class MySecurityPolicy extends Smarty_Security
{
public $php_functions = ['isset', 'empty', 'count'];
public $php_modifiers = ['escape', 'count'];
public $allow_super_globals = false;
}
$smarty->enableSecurity(new MySecurityPolicy($smarty));

Από προεπιλογή, το Smarty 4 περιορίζει ποιες λειτουργίες PHP μπορούν να χρησιμοποιηθούν:

{* These may be restricted *}
<{if isset($variable)}>
<{if empty($array)}>
<{$array|@count}>

Διαμορφώστε τις επιτρεπόμενες λειτουργίες εάν χρειάζεται:

$smarty->security_policy->php_functions = [
'isset', 'empty', 'count', 'sizeof',
'in_array', 'is_array', 'date', 'time'
];

Ενημερώσεις κληρονομικότητας προτύπων

Ενότητα με τίτλο «Ενημερώσεις κληρονομικότητας προτύπων»

Η σύνταξη μπλοκ παραμένει παρόμοια, αλλά με ορισμένες αλλαγές:

{* Parent template *}
<html>
<head>
{block name=head}
<title>Default Title</title>
{/block}
</head>
<body>
{block name=content}{/block}
</body>
</html>
{* Child template *}
{extends file="parent.tpl"}
{block name=head}
{$smarty.block.parent} {* Include parent block content *}
<meta name="custom" content="value">
{/block}
{block name=content}
<h1>My Content</h1>
{/block}
{block name=head append}
{* This is added after parent content *}
<link rel="stylesheet" href="extra.css">
{/block}
{block name=scripts prepend}
{* This is added before parent content *}
<script src="early.js"></script>
{/block}
ΧαρακτηριστικόΕναλλακτική
{php} ετικέτεςΜετακινήστε τη λογική στο PHP ή χρησιμοποιήστε πρόσθετα
{include_php}Χρήση εγγεγραμμένων προσθηκών
$Smarty.captureΛειτουργεί ακόμα αλλά καταργήθηκε
{strip} με κενάΧρησιμοποιήστε εργαλεία ελαχιστοποίησης
{* Instead of {php} *}
{* Move to PHP and assign result *}
{* Instead of include_php *}
<{include file="db:mytemplate.tpl"}>
{* Instead of capture (still works but consider) *}
<{capture name="sidebar"}>
<h3>Sidebar</h3>
<{/capture}>
<div><{$smarty.capture.sidebar}></div>
  1. Δημιουργία αντιγράφων ασφαλείας όλων των προτύπων
  2. Καταχωρίστε όλη τη χρήση ετικετών {php}
  3. Έγγραφο προσαρμοσμένων προσθηκών
  4. Ελέγξτε την τρέχουσα λειτουργικότητα
  1. Αφαιρέστε όλες τις ετικέτες {php}
  2. Ενημερώστε τη σύνταξη μεταβλητής πρόσβασης
  3. Ελέγξτε τη χρήση τροποποιητή
  4. Ενημερώστε τη διαμόρφωση προσωρινής αποθήκευσης
  5. Ελέγξτε τις ρυθμίσεις ασφαλείας
  1. Δοκιμάστε όλα τα πρότυπα
  2. Ελέγξτε όλες τις φόρμες εργασίας
  3. Επαλήθευση των εργασιών της προσωρινής αποθήκευσης
  4. Δοκιμή με διαφορετικούς ρόλους χρήστη
// Check Smarty version in PHP
$version = Smarty::SMARTY_VERSION;
if (version_compare($version, '4.0.0', '>=')) {
// Smarty 4+ specific code
} else {
// Smarty 3 code
}
{* Check version in template *}
<{assign var="smarty_major" value=$smarty.version|regex_replace:'/\\..*$/':''}>
<{if $smarty_major >= 4}>
{* Smarty 4+ template code *}
<{else}>
{* Smarty 3 template code *}
<{/if}>
  1. Αποφύγετε εντελώς τις ετικέτες {php} - Δεν λειτουργούν στο Smarty 3+

  2. Διατηρήστε τα πρότυπα απλά - Η σύνθετη λογική ανήκει στο PHP

  3. Χρησιμοποιήστε τυπικούς τροποποιητές - Αποφύγετε τους καταργημένους

  4. Δοκιμή και στις δύο εκδόσεις - Εάν χρειάζεται να υποστηρίξετε και τις δύο

  5. Χρησιμοποιήστε πρόσθετα για πολύπλοκες λειτουργίες - Πιο διατηρήσιμα

# Παράδειγμα: Πρότυπο πολλαπλών συμβατών

Ενότητα με τίτλο «# Παράδειγμα: Πρότυπο πολλαπλών συμβατών»
{* Works in both Smarty 3 and 4 *}
<!DOCTYPE html>
<html>
<head>
<title><{$page_title|default:'Default Title'|escape}></title>
</head>
<body>
<{if isset($items) && $items|@count > 0}>
<ul>
<{foreach $items as $item}>
<li><{$item.name|escape}></li>
<{/foreach}>
</ul>
<{else}>
<p>No items found.</p>
<{/if}>
</body>
</html>

Πρόβλημα: <{$mod_url}> δεν επιστρέφει τίποτα στο Smarty 4

Λύση: Χρησιμοποιήστε το <{$mod_url->value}> ή ενεργοποιήστε τη λειτουργία συμβατότητας

Πρόβλημα: Το πρότυπο εμφανίζει σφάλμα στις ετικέτες {php}

Λύση: Καταργήστε όλες τις ετικέτες PHP και μετακινήστε τη λογική στα αρχεία PHP

Πρόβλημα: Ο προσαρμοσμένος τροποποιητής εμφανίζει σφάλμα “άγνωστος τροποποιητής”.

Λύση: Καταχωρίστε τον τροποποιητή με registerPlugin()

Πρόβλημα: Η λειτουργία δεν επιτρέπεται στο πρότυπο

Λύση: Προσθήκη συνάρτησης στη λίστα επιτρεπόμενων πολιτικών ασφαλείας