การโยกย้ายอย่างชาญฉลาด 4
คู่มือนี้ครอบคลุมถึงการเปลี่ยนแปลงและขั้นตอนการย้ายข้อมูลที่จำเป็นเมื่ออัปเกรดจาก Smarty 3 เป็น Smarty 4 ใน XOOPS การทำความเข้าใจความแตกต่างเหล่านี้ถือเป็นสิ่งสำคัญสำหรับการรักษาความเข้ากันได้กับการติดตั้ง XOOPS สมัยใหม่
เอกสารที่เกี่ยวข้อง
หัวข้อที่มีชื่อว่า “เอกสารที่เกี่ยวข้อง”- Smarty-Basics - พื้นฐานของ Smarty ใน XOOPS
- การพัฒนาธีม - การสร้างธีม XOOPS
- เทมเพลต-ตัวแปร - ตัวแปรที่มีอยู่ในเทมเพลต
ภาพรวมของการเปลี่ยนแปลง
หัวข้อที่มีชื่อว่า “ภาพรวมของการเปลี่ยนแปลง”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: ฟังก์ชัน Wrapper
หัวข้อที่มีชื่อว่า “โซลูชันที่ 4: ฟังก์ชัน Wrapper”สร้างฟังก์ชันตัวช่วยสำหรับการมอบหมายงาน:
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
หัวข้อที่มีชื่อว่า “วิธีแก้ไข: ใช้ตัวแปร Smarty”{* 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
หัวข้อที่มีชื่อว่า “แคช Smarty 3”// 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
หัวข้อที่มีชื่อว่า “แคช Smarty 4”// 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 lifetimeNocache ในเทมเพลต
หัวข้อที่มีชื่อว่า “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);}การเปลี่ยนแปลงนโยบายความปลอดภัย
หัวข้อที่มีชื่อว่า “การเปลี่ยนแปลงนโยบายความปลอดภัย”ความปลอดภัยอัจฉริยะ 4
หัวข้อที่มีชื่อว่า “ความปลอดภัยอัจฉริยะ 4”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}ผนวกและเติมหน้า
หัวข้อที่มีชื่อว่า “ผนวกและเติมหน้า”{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()
ปัญหา: ข้อจำกัดด้านความปลอดภัย
หัวข้อที่มีชื่อว่า “ปัญหา: ข้อจำกัดด้านความปลอดภัย”ปัญหา: ไม่อนุญาตให้ใช้ฟังก์ชันในเทมเพลต
วิธีแก้ไข: เพิ่มฟังก์ชันลงในรายการที่อนุญาตของนโยบายความปลอดภัย
#smarty #migration #upgrade #xoops #smarty4 #ความเข้ากันได้