İçeriğe geç

Smarty 4 Taşıma

Bu kılavuz, XOOPS’de Smarty 3’ten Smarty 4’e yükseltme yaparken gereken değişiklikleri ve geçiş adımlarını kapsar. Bu farklılıkları anlamak, modern XOOPS kurulumlarıyla uyumluluğu sürdürmek için çok önemlidir.

  • Smarty-Basics - XOOPS’de Smarty’nin temelleri
  • theme Geliştirme - XOOPS temaları oluşturma
  • template-Değişkenler - Şablonlarda mevcut değişkenler

Smarty 4, Smarty 3’ten birkaç önemli değişiklik getirdi:

  1. Değişken atama davranışı değiştirildi
  2. {php} etiketleri tamamen kaldırıldı
  3. API değişikliklerini önbelleğe alma
  4. Değiştirici işleme güncellemeleri
  5. Güvenlik politikası değişiklikleri
  6. Kullanımdan kaldırılan özellikler kaldırıldı

Smarty 2/3,‘de atanmış değerlere doğrudan erişilebiliyordu:

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

Smarty 4’te değişkenler Smarty_Variable nesnelerine sarılır:

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’de uyumluluk modunu etkinleştirin:

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

Bu, Smarty 3 gibi doğrudan değişken erişimine izin verir.

Her iki sürümde de çalışan templates yazın:

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

Ödevler için bir yardımcı işlev oluşturun:

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+, güvenlik nedeniyle {php} etiketlerini desteklemez:

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

Çözüm: Smarty Değişkenlerini kullanın

Section titled “Çözüm: Smarty Değişkenlerini kullanın”
{* Use Smarty's built-in variable access *}
<{assign var="cid" value=$downloads.cid}>
<{assign var="catid" value=$smarty.template_vars.cid}>

Karmaşık mantık şablonlarda değil, PHP’de olmalıdır:

// 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>

Yeniden kullanılabilir işlevsellik için Smarty eklentileri oluşturun:

/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}>

Bazı değiştiriciler yeniden adlandırıldı veya kullanımdan kaldırıldı:

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

Dizi değiştiriciler @ önekini gerektirir:

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

Özel değiştiricilerin kaydedilmesi gerekir:

// 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’ün varsayılan güvenliği daha sıkıdır:

// 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));

Varsayılan olarak Smarty 4, hangi PHP işlevlerinin kullanılabileceğini kısıtlar:

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

Gerekirse izin verilen işlevleri yapılandırın:

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

Blok sözdizimi aynı kalıyor ancak bazı değişiklikler var:

{* 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}
ÖzellikAlternatif
{php} etiketleriMantığı PHP’ye taşıyın veya eklentileri kullanın
{include_php}Kayıtlı eklentileri kullanın
$smarty.captureHala çalışıyor ancak kullanımdan kaldırıldı
{strip} boşlukluKüçültme araçlarını kullanın
{* 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. Tüm şablonları yedekleyin
  2. Tüm {php} etiketi kullanımını listeleyin
  3. Özel eklentileri belgeleyin
  4. Mevcut işlevselliği test edin
  1. Tüm {php} etiketlerini kaldırın
  2. Değişken erişim sözdizimini güncelleyin
  3. Değiştirici kullanımını kontrol edin
  4. Önbelleğe alma yapılandırmasını güncelleyin
  5. Güvenlik ayarlarını gözden geçirin
  1. Tüm şablonları test edin
  2. Tüm formların çalışıp çalışmadığını kontrol edin
  3. Önbelleğe almanın çalıştığını doğrulayın
  4. Farklı user rolleriyle test edin
// 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} etiketlerinden tamamen kaçının - Smarty’de çalışmazlar 3+

  2. Şablonları basit tutun - Karmaşık mantık PHP’ye aittir

  3. Standart değiştiricileri kullanın - Kullanımdan kaldırılmış olanlardan kaçının

  4. Her iki sürümü de test edin - Her ikisini de desteklemeniz gerekiyorsa

  5. Karmaşık işlemler için eklentileri kullanın - Daha kolay bakım yapılabilir

{* 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>

Sorun: <{$mod_url}>, Smarty’de hiçbir şey döndürmüyor 4

Çözüm: <{$mod_url->value}> kullanın veya uyumluluk modunu etkinleştirin

Sorun: template {php} etiketlerinde hata veriyor

Çözüm: Tüm PHP etiketlerini kaldırın ve mantığı PHP dosyalarına taşıyın

Sorun: Özel değiştirici “bilinmeyen değiştirici” hatası veriyor

Çözüm: Değiştiriciyi registerPlugin() ile kaydedin

Sorun: Şablonda işleve izin verilmiyor

Çözüm: Güvenlik ilkesinin izin verilenler listesine işlev ekleyin


#smarty #migration #yükseltme #xoops #smarty4 #uyumluluk