Smarty Temel Bilgiler
2.5.x: Smarty 3 4.0.x: Smarty 4
Smarty, PHP için geliştiricilerin sunumu (HTML/CSS) uygulama mantığından) ayırmasına olanak tanıyan bir template motorudur. XOOPS, tüm template oluşturma ihtiyaçları için Smarty’yi kullanır ve PHP kodu ile HTML çıktısı arasında temiz bir ayrım sağlar.
İlgili Belgeler
Section titled “İlgili Belgeler”- theme Geliştirme - XOOPS temaları oluşturma
- template-Değişkenler - Şablonlarda mevcut değişkenler
- Smarty-4-Migration - Smarty 3’ten 4’e yükseltme
Smarty nedir?
Section titled “Smarty nedir?”Smarty şunları sağlar:
- Endişelerin Ayrılması: Şablonlarda HTML, sınıflarda PHP mantığını tutun
- template Mirası: Basit bloklardan karmaşık düzenler oluşturun
- Önbelleğe alma: Derlenmiş şablonlarla performansı artırın
- Değiştiriciler: Çıktıyı yerleşik veya özel işlevlerle dönüştürün
- Güvenlik: PHP işlev şablonlarının nelere erişebileceğini kontrol edin
XOOPS Smarty Yapılandırma
Section titled “XOOPS Smarty Yapılandırma”XOOPS, Smarty’yı özel sınırlayıcılarla yapılandırır:
Default Smarty: { and }XOOPS Smarty: <{ and }>Bu, şablonlarda JavaScript koduyla çakışmaları önler.
Temel Söz Dizimi
Section titled “Temel Söz Dizimi”Değişkenler
Section titled “Değişkenler”Değişkenler PHP’den şablonlara aktarılır:
// In PHP$GLOBALS['xoopsTpl']->assign('title', 'My Page Title');$GLOBALS['xoopsTpl']->assign('count', 42);{* In template *}<h1><{$title}></h1><p>Total items: <{$count}></p>Dizi Erişimi
Section titled “Dizi Erişimi”// PHP$item = [ 'id' => 1, 'title' => 'Article Title', 'author' => 'John Doe'];$GLOBALS['xoopsTpl']->assign('item', $item);{* Template *}<h2><{$item.title}></h2><p>By: <{$item.author}></p>Nesne Özellikleri
Section titled “Nesne Özellikleri”// PHP$GLOBALS['xoopsTpl']->assign('user', $xoopsUser);{* Template *}<p>Welcome, <{$user->getVar('uname')}>!</p>Yorumlar
Section titled “Yorumlar”Smarty içindeki yorumlar HTML’ye aktarılmaz:
{* This is a comment - it will not appear in the HTML output *}
{* Multi-line comments are also supported*}Kontrol Yapıları
Section titled “Kontrol Yapıları”If/Else İfadeler
Section titled “If/Else İfadeler”<{if $user_logged_in}> <p>Welcome back!</p><{elseif $is_guest}> <p>Hello, Guest!</p><{else}> <p>Please log in.</p><{/if}>Karşılaştırma Operatörleri
Section titled “Karşılaştırma Operatörleri”{* Equality *}<{if $status == 'published'}>Published<{/if}><{if $status eq 'published'}>Published<{/if}>
{* Inequality *}<{if $count != 0}>Has items<{/if}><{if $count neq 0}>Has items<{/if}>
{* Greater/Less than *}<{if $count > 10}>Many items<{/if}><{if $count gt 10}>Many items<{/if}><{if $count < 5}>Few items<{/if}><{if $count lt 5}>Few items<{/if}>
{* Greater/Less than or equal *}<{if $count >= 10}>Ten or more<{/if}><{if $count gte 10}>Ten or more<{/if}><{if $count <= 5}>Five or less<{/if}><{if $count lte 5}>Five or less<{/if}>
{* Logical operators *}<{if $logged_in && $is_admin}>Admin Panel<{/if}><{if $logged_in and $is_admin}>Admin Panel<{/if}><{if $option1 || $option2}>One option selected<{/if}><{if $option1 or $option2}>One option selected<{/if}><{if !$is_banned}>Access granted<{/if}><{if not $is_banned}>Access granted<{/if}>Empty/Isset kontrol ediliyor
Section titled “Empty/Isset kontrol ediliyor”{* Check if variable exists and has value *}<{if $title}> <h1><{$title}></h1><{/if}>
{* Check if array is not empty *}<{if $items|@count > 0}> <ul> <{foreach $items as $item}> <li><{$item.name}></li> <{/foreach}> </ul><{/if}>
{* Using isset *}<{if isset($description)}> <p><{$description}></p><{/if}>Foreach Döngüleri
Section titled “Foreach Döngüleri”{* Basic foreach *}<ul><{foreach $items as $item}> <li><{$item.name}></li><{/foreach}></ul>
{* With key *}<{foreach $options as $key => $value}> <option value="<{$key}>"><{$value}></option><{/foreach}>
{* With @index, @first, @last *}<{foreach $items as $item}> <{if $item@first}><ul><{/if}> <li class="item-<{$item@index}>"><{$item.name}></li> <{if $item@last}></ul><{/if}><{/foreach}>
{* Alternate row colors *}<{foreach $rows as $row}> <tr class="<{if $row@iteration is odd}>odd<{else}>even<{/if}>"> <td><{$row.name}></td> </tr><{/foreach}>
{* Foreachelse for empty arrays *}<{foreach $items as $item}> <li><{$item.name}></li><{foreachelse}> <li>No items found.</li><{/foreach}>Döngüler için
Section titled “Döngüler için”<{for $i=1 to 10}> <p>Item <{$i}></p><{/for}>
<{for $i=10 to 1 step -1}> <p>Countdown: <{$i}></p><{/for}>While Döngüleri
Section titled “While Döngüleri”<{while $count > 0}> <p><{$count}></p> <{$count = $count - 1}><{/while}>Değişken Değiştiriciler
Section titled “Değişken Değiştiriciler”Değiştiriciler değişken çıktıyı dönüştürür:
Dize Değiştiriciler
Section titled “Dize Değiştiriciler”{* HTML escape (always use for user input!) *}<{$title|escape}><{$title|escape:'html'}>
{* URL encoding *}<{$url|escape:'url'}>
{* Uppercase/Lowercase *}<{$name|upper}><{$name|lower}><{$name|capitalize}>
{* Truncate text *}<{$content|truncate:100:'...'}>
{* Strip HTML tags *}<{$html|strip_tags}>
{* Replace *}<{$text|replace:'old':'new'}>
{* Word wrap *}<{$text|wordwrap:80:"\n"}>
{* Default value *}<{$optional_var|default:'No value'}>Sayısal Değiştiriciler
Section titled “Sayısal Değiştiriciler”{* Number formatting *}<{$price|string_format:"%.2f"}><{$count|number_format}>
{* Date formatting *}<{$timestamp|date_format:"%B %e, %Y"}><{$timestamp|date_format:"%Y-%m-%d %H:%M"}>Dizi Değiştiriciler
Section titled “Dizi Değiştiriciler”{* Count items *}<{$items|@count}> items
{* Join array *}<{$tags|@implode:', '}>
{* JSON encode *}<{$data|@json_encode}>Zincirleme Değiştiriciler
Section titled “Zincirleme Değiştiriciler”<{$content|strip_tags|truncate:200:'...'|escape}>Ekle ve Ekle
Section titled “Ekle ve Ekle”Diğer templates Dahil
Section titled “Diğer templates Dahil”{* Include a template file *}<{include file="db:mymodule_header.tpl"}>
{* Include with variables *}<{include file="db:mymodule_item.tpl" item=$currentItem}>
{* Include with assigned variables *}<{include file="db:sidebar.tpl" assign="sidebar_content"}><div class="sidebar"><{$sidebar_content}></div>Dinamik İçerik Ekleme
Section titled “Dinamik İçerik Ekleme”{* Insert calls a PHP function for dynamic content *}<{insert name="getBanner"}>Şablonlara Değişken Atama
Section titled “Şablonlara Değişken Atama”{* Simple assignment *}<{assign var="page_title" value="Welcome"}><{$page_title = "Welcome"}>
{* Assignment from expression *}<{assign var="full_name" value="`$first_name` `$last_name`"}>
{* Capture block content *}<{capture name="sidebar"}> <h3>Sidebar</h3> <ul> <li>Link 1</li> <li>Link 2</li> </ul><{/capture}><div class="sidebar"><{$smarty.capture.sidebar}></div>Dahili Smarty Değişkenler
Section titled “Dahili Smarty Değişkenler”$smarty Değişken
Section titled “$smarty Değişken”{* Current timestamp *}<{$smarty.now|date_format:"%Y-%m-%d"}>
{* Request variables *}<{$smarty.get.page}><{$smarty.post.username}><{$smarty.request.id}><{$smarty.cookies.session_id}><{$smarty.server.HTTP_HOST}>
{* Constants *}<{$smarty.const.XOOPS_URL}>
{* Configuration variables *}<{$smarty.config.var_name}>
{* Template info *}<{$smarty.template}><{$smarty.current_dir}>
{* Smarty version *}<{$smarty.version}>
{* Section/Foreach properties *}<{$smarty.foreach.items.index}><{$smarty.foreach.items.iteration}><{$smarty.foreach.items.first}><{$smarty.foreach.items.last}>Değişmez Bloklar
Section titled “Değişmez Bloklar”Süs parantezli JavaScript için:
<{literal}><script> var config = { url: 'https://example.com', count: 10 }; if (config.count > 5) { console.log('Many items'); }</script><{/literal}>Veya JavaScript içindeki Smarty değişkenlerini kullanın:
<script>var moduleUrl = '<{$xoops_url}>/modules/mymodule';var items = <{$items_json}>;</script>Özel İşlevler
Section titled “Özel İşlevler”XOOPS özel Smarty işlevleri sağlar:
{* XOOPS Image URL *}<img src="<{xoImgUrl}>images/logo.png" alt="Logo">
{* XOOPS Module URL *}<a href="<{xoModuleUrl}>">Module Home</a>
{* App URL *}<a href="<{xoAppUrl 'item.php'}>?id=<{$item.id}>">View Item</a>En İyi Uygulamalar
Section titled “En İyi Uygulamalar”Her Zaman Çıkıştan Kaçış
Section titled “Her Zaman Çıkıştan Kaçış”{* For user-generated content, always escape *}<p><{$user_comment|escape}></p>
{* For HTML content, use appropriate method *}<div><{$content}></div> {* Only if content is pre-sanitized *}Anlamlı Değişken Adları Kullanın
Section titled “Anlamlı Değişken Adları Kullanın”// Good$GLOBALS['xoopsTpl']->assign('article_title', $title);$GLOBALS['xoopsTpl']->assign('article_items', $items);
// Avoid$GLOBALS['xoopsTpl']->assign('t', $title);$GLOBALS['xoopsTpl']->assign('arr', $items);Mantığı Minimumda Tutun
Section titled “Mantığı Minimumda Tutun”templates sunuma odaklanmalıdır. Karmaşık mantığı PHP’ye taşıyın:
{* Avoid complex logic in templates *}{* Bad *}<{if $user && $user->getVar('level') > 5 && $user->getVar('status') == 'active' && $permissions|in_array:'edit'}>
{* Good - calculate in PHP and pass a simple flag *}<{if $can_edit}>template Mirasını Kullan
Section titled “template Mirasını Kullan”Tutarlı düzenler için template devralmayı kullanın (bkz. theme Geliştirme).
Hata Ayıklama Şablonları
Section titled “Hata Ayıklama Şablonları”Konsolda Hata Ayıklama
Section titled “Konsolda Hata Ayıklama”{* Show all assigned variables *}<{debug}>Geçici Çıkış
Section titled “Geçici Çıkış”{* Debug specific variable *}<pre><{$variable|@print_r}></pre><pre><{$variable|@var_export}></pre>Ortak XOOPS template Desenleri
Section titled “Ortak XOOPS template Desenleri”module template Yapısı
Section titled “module template Yapısı”{* Module header *}<div class="mymodule"> <h2><{$module_name}></h2>
{* Breadcrumb *} <{if $breadcrumb}> <nav class="breadcrumb"> <{foreach $breadcrumb as $crumb}> <{if $crumb@last}> <span><{$crumb.title}></span> <{else}> <a href="<{$crumb.link}>"><{$crumb.title}></a> » <{/if}> <{/foreach}> </nav> <{/if}>
{* Content *} <div class="content"> <{$content}> </div></div>Sayfalandırma
Section titled “Sayfalandırma”<{if $page_nav}><div class="pagination"> <{$page_nav}></div><{/if}>Form Görünümü
Section titled “Form Görünümü”<{if $form}><div class="form-container"> <{$form}></div><{/if}>#smarty #templates #xoops #frontend #template-engine