Smarty 4 Migration
Αυτός ο οδηγός καλύπτει τις αλλαγές και τα βήματα μετεγκατάστασης που απαιτούνται κατά την αναβάθμιση από Smarty 3 σε Smarty 4 στο XOOPS. Η κατανόηση αυτών των διαφορών είναι απαραίτητη για τη διατήρηση της συμβατότητας με τις σύγχρονες εγκαταστάσεις XOOPS.
Σχετική τεκμηρίωση
Ενότητα με τίτλο «Σχετική τεκμηρίωση»- Smarty-Basics - Fundamentals of Smarty in XOOPS
- Ανάπτυξη θεμάτων - Δημιουργία XOOPS θεμάτων
- Template-Variables - Διαθέσιμες μεταβλητές σε πρότυπα
Επισκόπηση των αλλαγών
Ενότητα με τίτλο «Επισκόπηση των αλλαγών»Το Smarty 4 εισήγαγε αρκετές σημαντικές αλλαγές από το Smarty 3:
- Η συμπεριφορά ανάθεσης μεταβλητής άλλαξε
- Οι ετικέτες
{php}αφαιρέθηκαν πλήρως - Η προσωρινή αποθήκευση API αλλάζει
- Ενημερώσεις χειρισμού τροποποιητών
- Αλλαγές πολιτικής ασφαλείας
- Καταργήθηκαν οι καταργημένες λειτουργίες
Αλλαγές μεταβλητής πρόσβασης
Ενότητα με τίτλο «Αλλαγές μεταβλητής πρόσβασης»# Το πρόβλημα
Ενότητα με τίτλο «# Το πρόβλημα»Στο 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] =>)# Λύση 1: Πρόσβαση στην ιδιότητα τιμής
Ενότητα με τίτλο «# Λύση 1: Πρόσβαση στην ιδιότητα τιμής»{* Smarty 4 - access the value property *}<img src="<{$mod_url->value}>/assets/images/icon.png"># Λύση 2: Λειτουργία συμβατότητας
Ενότητα με τίτλο «# Λύση 2: Λειτουργία συμβατότητας»Ενεργοποιήστε τη λειτουργία συμβατότητας στο PHP:
$smarty = new Smarty();$smarty->setCompatibilityMode(true);Αυτό επιτρέπει την άμεση πρόσβαση μεταβλητών όπως το Smarty 3.
# Λύση 3: Έλεγχος έκδοσης υπό όρους
Ενότητα με τίτλο «# Λύση 3: Έλεγχος έκδοσης υπό όρους»Γράψτε πρότυπα που λειτουργούν και στις δύο εκδόσεις:
<{if $smarty.version|regex_replace:'[^0-9]':'' >= 4}> <{$mod_url->value}><{else}> <{$mod_url}><{/if}># Λύση 4: Λειτουργία περιτυλίγματος
Ενότητα με τίτλο «# Λύση 4: Λειτουργία περιτυλίγματος»Δημιουργήστε μια βοηθητική συνάρτηση για αναθέσεις:
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); }}Αφαίρεση ετικετών {php}
Ενότητα με τίτλο «Αφαίρεση ετικετών {php}»# Το πρόβλημα
Ενότητα με τίτλο «# Το πρόβλημα»Το Smarty 3+ δεν υποστηρίζει ετικέτες {php} για λόγους ασφαλείας:
{* This NO LONGER works in Smarty 3+ *}<{assign var="cid" value=$downloads.cid}><{php}> $catid = $this->get_template_vars('cid');<{/php}># Λύση: Χρησιμοποιήστε Smarty Variables
Ενότητα με τίτλο «# Λύση: Χρησιμοποιήστε Smarty Variables»{* Use Smarty's built-in variable access *}<{assign var="cid" value=$downloads.cid}><{assign var="catid" value=$smarty.template_vars.cid}># Λύση: Μετακινήστε τη λογική στο PHP
Ενότητα με τίτλο «# Λύση: Μετακινήστε τη λογική στο PHP»Η σύνθετη λογική πρέπει να βρίσκεται στο 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:
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 Caching
Ενότητα με τίτλο «# Smarty 3 Caching»// 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 Caching
Ενότητα με τίτλο «# Smarty 4 Caching»// 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 modesSmarty::CACHING_OFF // No cachingSmarty::CACHING_LIFETIME_CURRENT // Use cache_lifetimeSmarty::CACHING_LIFETIME_SAVED // Use cached lifetime# Nocache στα πρότυπα
Ενότητα με τίτλο «# Nocache στα πρότυπα»{* 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 Security
Ενότητα με τίτλο «# Smarty 4 Security»Το Smarty 4 έχει αυστηρότερη προεπιλεγμένη ασφάλεια:
// Configure security policy$smarty->enableSecurity('Smarty_Security');
// Or create custom policyclass 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}# Προσάρτηση και Prepend
Ενότητα με τίτλο «# Προσάρτηση και Prepend»{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}Καταργημένες λειτουργίες
Ενότητα με τίτλο «Καταργημένες λειτουργίες»# Καταργήθηκε στο Smarty 4
Ενότητα με τίτλο «# Καταργήθηκε στο Smarty 4»| Χαρακτηριστικό | Εναλλακτική |
|---|---|
{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>Λίστα ελέγχου μετεγκατάστασης
Ενότητα με τίτλο «Λίστα ελέγχου μετεγκατάστασης»# Πριν από τη μετανάστευση
Ενότητα με τίτλο «# Πριν από τη μετανάστευση»- Δημιουργία αντιγράφων ασφαλείας όλων των προτύπων
- Καταχωρίστε όλη τη χρήση ετικετών
{php} - Έγγραφο προσαρμοσμένων προσθηκών
- Ελέγξτε την τρέχουσα λειτουργικότητα
# Κατά τη διάρκεια της μετανάστευσης
Ενότητα με τίτλο «# Κατά τη διάρκεια της μετανάστευσης»- Αφαιρέστε όλες τις ετικέτες
{php} - Ενημερώστε τη σύνταξη μεταβλητής πρόσβασης
- Ελέγξτε τη χρήση τροποποιητή
- Ενημερώστε τη διαμόρφωση προσωρινής αποθήκευσης
- Ελέγξτε τις ρυθμίσεις ασφαλείας
# Μετά τη Μετανάστευση
Ενότητα με τίτλο «# Μετά τη Μετανάστευση»- Δοκιμάστε όλα τα πρότυπα
- Ελέγξτε όλες τις φόρμες εργασίας
- Επαλήθευση των εργασιών της προσωρινής αποθήκευσης
- Δοκιμή με διαφορετικούς ρόλους χρήστη
Δοκιμή για συμβατότητα
Ενότητα με τίτλο «Δοκιμή για συμβατότητα»# Ανίχνευση έκδοσης
Ενότητα με τίτλο «# Ανίχνευση έκδοσης»// 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}>Σύνταξη προτύπων πολλαπλών συμβατών
Ενότητα με τίτλο «Σύνταξη προτύπων πολλαπλών συμβατών»# Βέλτιστες πρακτικές
Ενότητα με τίτλο «# Βέλτιστες πρακτικές»-
Αποφύγετε εντελώς τις ετικέτες
{php}- Δεν λειτουργούν στο Smarty 3+ -
Διατηρήστε τα πρότυπα απλά - Η σύνθετη λογική ανήκει στο PHP
-
Χρησιμοποιήστε τυπικούς τροποποιητές - Αποφύγετε τους καταργημένους
-
Δοκιμή και στις δύο εκδόσεις - Εάν χρειάζεται να υποστηρίξετε και τις δύο
-
Χρησιμοποιήστε πρόσθετα για πολύπλοκες λειτουργίες - Πιο διατηρήσιμα
# Παράδειγμα: Πρότυπο πολλαπλών συμβατών
Ενότητα με τίτλο «# Παράδειγμα: Πρότυπο πολλαπλών συμβατών»{* 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}
Λύση: Καταργήστε όλες τις ετικέτες PHP και μετακινήστε τη λογική στα αρχεία PHP
# Θέμα: Ο τροποποιητής δεν βρέθηκε
Ενότητα με τίτλο «# Θέμα: Ο τροποποιητής δεν βρέθηκε»Πρόβλημα: Ο προσαρμοσμένος τροποποιητής εμφανίζει σφάλμα “άγνωστος τροποποιητής”.
Λύση: Καταχωρίστε τον τροποποιητή με registerPlugin()
# Θέμα: Περιορισμός ασφαλείας
Ενότητα με τίτλο «# Θέμα: Περιορισμός ασφαλείας»Πρόβλημα: Η λειτουργία δεν επιτρέπεται στο πρότυπο
Λύση: Προσθήκη συνάρτησης στη λίστα επιτρεπόμενων πολιτικών ασφαλείας