Di chuyển Smarty 4
Hướng dẫn này bao gồm các thay đổi và các bước di chuyển cần thiết khi nâng cấp từ Smarty 3 lên Smarty 4 trong XOOPS. Hiểu những khác biệt này là điều cần thiết để duy trì khả năng tương thích với các bản cài đặt XOOPS hiện đại.
Tài liệu liên quan
Phần tiêu đề “Tài liệu liên quan”- Smarty-Cơ bản - Cơ bản về Smarty trong XOOPS
- Phát triển chủ đề - Tạo XOOPS themes
- Mẫu-Biến - Các biến có sẵn trong templates
Tổng quan về các thay đổi
Phần tiêu đề “Tổng quan về các thay đổi”Smarty 4 đã giới thiệu một số thay đổi đột phá từ Smarty 3:
- Hành vi gán biến đã thay đổi
- Loại bỏ hoàn toàn thẻ
{php} - Bộ nhớ đệm API thay đổi
- Cập nhật xử lý sửa đổi
- Thay đổi chính sách bảo mật
- Đã xóa các tính năng không dùng nữa
Thay đổi quyền truy cập biến
Phần tiêu đề “Thay đổi quyền truy cập biến”Vấn đề
Phần tiêu đề “Vấn đề”Trong Smarty 2/3, các giá trị được chỉ định có thể truy cập trực tiếp:
// PHP$GLOBALS['xoopsTpl']->assign('mod_url', $helper->url());{* Smarty 2/3 - worked fine *}<img src="<{$mod_url}>/assets/images/icon.png">Trong Smarty 4, các biến được gói trong các đối tượng Smarty_Variable:
Smarty_Variable Object( [value] => http://example.com/modules/mymodule/ [nocache] =>)Giải pháp 1: Truy cập thuộc tính Value
Phần tiêu đề “Giải pháp 1: Truy cập thuộc tính Value”{* Smarty 4 - access the value property *}<img src="<{$mod_url->value}>/assets/images/icon.png">Giải pháp 2: Chế độ tương thích
Phần tiêu đề “Giải pháp 2: Chế độ tương thích”Kích hoạt chế độ tương thích trong PHP:
$smarty = new Smarty();$smarty->setCompatibilityMode(true);Điều này cho phép truy cập biến trực tiếp như Smarty 3.
Giải pháp 3: Kiểm tra phiên bản có điều kiện
Phần tiêu đề “Giải pháp 3: Kiểm tra phiên bản có điều kiện”Viết templates hoạt động ở cả hai phiên bản:
<{if $smarty.version|regex_replace:'[^0-9]':'' >= 4}> <{$mod_url->value}><{else}> <{$mod_url}><{/if}>Giải pháp 4: Hàm Wrapper
Phần tiêu đề “Giải pháp 4: Hàm Wrapper”Tạo hàm trợ giúp cho các bài tập:
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); }}Xóa thẻ {php}
Phần tiêu đề “Xóa thẻ {php}”Vấn đề
Phần tiêu đề “Vấn đề”Smarty 3+ không hỗ trợ thẻ {php} vì lý do bảo mật:
{* This NO LONGER works in Smarty 3+ *}<{assign var="cid" value=$downloads.cid}><{php}> $catid = $this->get_template_vars('cid');<{/php}>Giải pháp: Sử dụng Biến Smarty
Phần tiêu đề “Giải pháp: Sử dụng Biến Smarty”{* Use Smarty's built-in variable access *}<{assign var="cid" value=$downloads.cid}><{assign var="catid" value=$smarty.template_vars.cid}>Giải pháp: Di chuyển Logic sang PHP
Phần tiêu đề “Giải pháp: Di chuyển Logic sang PHP”Logic phức tạp phải ở PHP, không phải templates:
// 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>Giải pháp: Plugin tùy chỉnh
Phần tiêu đề “Giải pháp: Plugin tùy chỉnh”Để có chức năng có thể sử dụng lại, hãy tạo các plugin 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>Thay đổi bộ nhớ đệm
Phần tiêu đề “Thay đổi bộ nhớ đệm”Smarty 3 Bộ nhớ đệm
Phần tiêu đề “Smarty 3 Bộ nhớ đệm”// 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 Bộ nhớ đệm
Phần tiêu đề “Smarty 4 Bộ nhớ đệm”// 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;Hằng số bộ nhớ đệm
Phần tiêu đề “Hằng số bộ nhớ đệm”// Caching modesSmarty::CACHING_OFF // No cachingSmarty::CACHING_LIFETIME_CURRENT // Use cache_lifetimeSmarty::CACHING_LIFETIME_SAVED // Use cached lifetimeNocache trong Mẫu
Phần tiêu đề “Nocache trong Mẫu”{* Mark content as never cached *}<{nocache}> <p>Current time: <{$smarty.now|date_format:"%H:%M:%S"}></p><{/nocache}>Thay đổi công cụ sửa đổi
Phần tiêu đề “Thay đổi công cụ sửa đổi”Công cụ sửa đổi chuỗi
Phần tiêu đề “Công cụ sửa đổi chuỗi”Một số công cụ sửa đổi đã được đổi tên hoặc không dùng nữa:
{* Smarty 3 *}<{$text|escape:'htmlall'}>
{* Smarty 4 - use 'html' instead *}<{$text|escape:'html'}>Công cụ sửa đổi mảng
Phần tiêu đề “Công cụ sửa đổi mảng”Công cụ sửa đổi mảng yêu cầu tiền tố @:
{* Count array elements *}<{$items|@count}> items
{* Join array *}<{$tags|@implode:', '}>
{* JSON encode *}<{$data|@json_encode}>Công cụ sửa đổi tùy chỉnh
Phần tiêu đề “Công cụ sửa đổi tùy chỉnh”Công cụ sửa đổi tùy chỉnh phải được đăng ký:
// 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);}Thay đổi chính sách bảo mật
Phần tiêu đề “Thay đổi chính sách bảo mật”Smarty 4 Bảo mật
Phần tiêu đề “Smarty 4 Bảo mật”Smarty 4 có bảo mật mặc định chặt chẽ hơn:
// 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));Chức năng được phép
Phần tiêu đề “Chức năng được phép”Theo mặc định, Smarty 4 hạn chế những chức năng PHP nào có thể được sử dụng:
{* These may be restricted *}<{if isset($variable)}><{if empty($array)}><{$array|@count}>Cấu hình các chức năng được phép nếu cần:
$smarty->security_policy->php_functions = [ 'isset', 'empty', 'count', 'sizeof', 'in_array', 'is_array', 'date', 'time'];Cập nhật kế thừa mẫu
Phần tiêu đề “Cập nhật kế thừa mẫu”Cú pháp khối
Phần tiêu đề “Cú pháp khối”Cú pháp khối vẫn tương tự nhưng có một số thay đổi:
{* 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}Nối và thêm vào trước
Phần tiêu đề “Nối và thêm vào trước”{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}Tính năng không được dùng nữa
Phần tiêu đề “Tính năng không được dùng nữa”Đã xóa trong Smarty 4| Tính năng | Thay thế |
Phần tiêu đề “Đã xóa trong Smarty 4| Tính năng | Thay thế |”|----------|-------------|
| Thẻ {php} | Di chuyển logic sang PHP hoặc sử dụng plugin |
| {include_php} | Sử dụng plugin đã đăng ký |
| $smarty.capture | Vẫn hoạt động nhưng không được dùng nữa |
| {strip} có khoảng trắng | Sử dụng các công cụ thu nhỏ |
Sử dụng các lựa chọn thay thế
Phần tiêu đề “Sử dụng các lựa chọn thay thế”{* 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>Danh sách kiểm tra di chuyển
Phần tiêu đề “Danh sách kiểm tra di chuyển”Trước khi di chuyển
Phần tiêu đề “Trước khi di chuyển”- Sao lưu tất cả templates
- Liệt kê tất cả cách sử dụng thẻ
{php} - [] Các plugin tùy chỉnh tài liệu
- Kiểm tra chức năng hiện tại
Trong quá trình di chuyển
Phần tiêu đề “Trong quá trình di chuyển”- Xóa tất cả các thẻ
{php} - Cập nhật cú pháp truy cập biến
- Kiểm tra việc sử dụng công cụ sửa đổi
- Cập nhật cấu hình bộ nhớ đệm
- Xem lại cài đặt bảo mật
Sau khi di chuyển
Phần tiêu đề “Sau khi di chuyển”- Kiểm tra tất cả templates
- Kiểm tra tất cả các biểu mẫu có hoạt động không
- Xác minh hoạt động của bộ nhớ đệm
- Kiểm tra với các vai trò người dùng khác nhau
Kiểm tra tính tương thích
Phần tiêu đề “Kiểm tra tính tương thích”Phát hiện phiên bản
Phần tiêu đề “Phát hiện phiên bản”// Check Smarty version in PHP$version = Smarty::SMARTY_VERSION;
if (version_compare($version, '4.0.0', '>=')) { // Smarty 4+ specific code} else { // Smarty 3 code}Kiểm tra phiên bản mẫu
Phần tiêu đề “Kiểm tra phiên bản mẫu”{* 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}>Viết các mẫu tương thích chéo
Phần tiêu đề “Viết các mẫu tương thích chéo”Các phương pháp hay nhất
Phần tiêu đề “Các phương pháp hay nhất”-
Tránh hoàn toàn thẻ
{php}- Chúng không hoạt động trong Smarty 3+ -
Giữ cho templates đơn giản - Logic phức tạp thuộc về PHP
-
Sử dụng công cụ sửa đổi tiêu chuẩn - Tránh những công cụ sửa đổi không được dùng nữa
-
Kiểm tra ở cả hai phiên bản - Nếu bạn cần hỗ trợ cả hai
-
Sử dụng plugin cho các hoạt động phức tạp - Dễ bảo trì hơn
Ví dụ: Mẫu tương thích chéo
Phần tiêu đề “Ví dụ: Mẫu tương thích chéo”{* 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>Các vấn đề di chuyển thường gặp
Phần tiêu đề “Các vấn đề di chuyển thường gặp”Vấn đề: Biến trả về trống
Phần tiêu đề “Vấn đề: Biến trả về trống”Sự cố: <{$mod_url}> không trả về gì trong Smarty 4
Giải pháp: Sử dụng <{$mod_url->value}> hoặc bật chế độ tương thích
Sự cố: Lỗi thẻ PHP
Phần tiêu đề “Sự cố: Lỗi thẻ PHP”Sự cố: Mẫu đưa ra lỗi trên thẻ {php}
Giải pháp: Xóa tất cả các thẻ PHP và di chuyển logic sang các tệp PHP
Vấn đề: Không tìm thấy công cụ sửa đổi
Phần tiêu đề “Vấn đề: Không tìm thấy công cụ sửa đổi”Sự cố: Công cụ sửa đổi tùy chỉnh đưa ra lỗi “công cụ sửa đổi không xác định”
Giải pháp: Đăng ký công cụ sửa đổi với registerPlugin()
Vấn đề: Hạn chế bảo mật
Phần tiêu đề “Vấn đề: Hạn chế bảo mật”Sự cố: Chức năng không được phép trong mẫu
Giải pháp: Thêm chức năng vào danh sách cho phép của chính sách bảo mật
#smarty #migration #nâng cấp #xoops #smarty4 #compatibility