Kanca Listesi
Modül sistemi iki tür kanca sağlar: olay kancaları (PHP geri çağrıları)
ve görüntüleme kancaları (Smarty şablon enjeksiyon noktaları).
Katalog kaynağı: core/Module.php içindeki Module::HOOKS,
getHookCatalog() ve getDisplayHookCatalog().
Görüntüleme kancaları mağaza / yönetim şablonlarına
{$hooks.*} veya {$adminHooks.*} ile HTML basar.
Olay Kancaları
Dinleyicileri modülünüzün boot() yönteminde
Module::registerHook() ile kaydedin. Yalnızca Module::HOOKS
listesinde yer alan kancalar kabul edilir.
| Kanca Adı | Ne Zaman Tetiklenir | Argümanlar |
|---|---|---|
smarty.assign |
Module::bootstrap() sırasında — tüm etkin modüller yüklendikten sonra |
$smarty örneği |
head.assets |
Ön yüz CSS/JS varlıkları Module::getHeadAssets() ile toplanırken |
css ve js anahtarlı &$assets dizisi |
footer.html |
Eski alt bilgi HTML enjeksiyonu (bunun yerine görüntüleme kancalarını tercih edin) | — |
admin.menu |
Yönetim kenar çubuğu menüsü oluşturulurken (registerAdminMenuLink veya registerHook) |
&$items menü öğeleri dizisi |
order.placed |
Yeni bir sipariş başarıyla oluşturulduktan sonra (ödeme / POS) | Sipariş veri dizisi |
order.updated |
Sipariş güncellendiğinde (yönetim / API / durum değişikliği) | $order, önceki durum / bağlam ekleri |
product.updated |
Ürün kaydedildiğinde (yönetim, Web API, hızlı stok, toplu araçlar) | $idProduct, $product, $isNew |
cart.changed |
Sepet içeriği değiştikten sonra (ekle / güncelle / kaldır) | Cart::getSummary() sepet özet dizisi |
form.captcha.validate |
Form gönderiminde CAPTCHA kontrolü (Captcha::validate()) |
$form adı, &$error dizesi |
product.filter.sql |
Katalog ürün SQL'i çalışmadan önce — modüller SQL / parametreleri değiştirebilir | &$sql, &$params, filtre bağlam dizisi |
catalog.filter.context |
Ayrılmış katalog filtre bağlam kancası (HOOKS içinde kayıtlı) |
Bağlam yükü (çağıranlar tarafından tetiklendiğinde) |
Görüntüleme Kancaları (Ön Yüz)
Yönetimde modül başına atanır ve module_display_hooks içinde saklanır.
Çıktı Smarty'de {$hooks.hook_name} olarak kullanılabilir
(noktalı adlar iç içe geçer, örn. {$hooks.head.top}).
| Kanca Adı | Konum | Smarty Değişkeni |
|---|---|---|
footer |
Mağaza alt bilgisi | {$hooks.footer} |
header |
Üst çubuk / üst bilgi | {$hooks.header} |
main_menu |
Ana kategori menüsü | {$hooks.main_menu} |
mobile_menu |
Mobil çekmece menüsü | {$hooks.mobile_menu} |
head.top |
<head> içinde (üst) |
{$hooks.head.top} |
home |
Ana sayfa gövdesi | {$hooks.home} |
home_slider |
Ana sayfa üst slayt | {$hooks.home_slider} |
home_promo_slider |
Ana sayfa promosyon / kampanya slaydı | {$hooks.home_promo_slider} |
home_bottom |
Ana sayfa alt bölümü | {$hooks.home_bottom} |
catalog_filters |
Kategori / katalog filtreleri | {$hooks.catalog_filters} |
product |
Ürün listesi bağlamı (id_product gerekir) |
{$hooks.product} |
product_detail |
Ürün detay sayfası | {$hooks.product_detail} |
product_tab |
Ürün sekme düğmesi | {$hooks.product_tab} |
product_tab_content |
Ürün sekme içerik paneli | {$hooks.product_tab_content} |
product_inf |
Ürün detay bilgi bloğu | {$hooks.product_inf} |
order_payment |
Ödeme adımı | {$hooks.order_payment} |
order_confirmation |
Sipariş onay sayfası | {$hooks.order_confirmation} |
auth_social |
Giriş / kayıt — sosyal düğmeler | {$hooks.auth_social} |
contact_form |
İletişim formu — CAPTCHA / ek alanlar | {$hooks.contact_form} |
auth_login |
Giriş formu — CAPTCHA | {$hooks.auth_login} |
auth_register |
Kayıt formu — CAPTCHA | {$hooks.auth_register} |
Görüntüleme Kancaları (Yönetim)
Yönetim kancaları {$adminHooks.*} kullanır (Module::renderAdminHooks() ile).
admin_ ile başlayan kancalar için modülünüzde renderAdminDisplayHook() uygulayın.
| Kanca Adı | Konum | Smarty Değişkeni |
|---|---|---|
admin_login |
Yönetim giriş formu — CAPTCHA | {$adminHooks.admin_login} |
admin_product_button |
Ürün düzenleme — Kaydet yanında | {$adminHooks.admin_product_button} |
admin_order_detail |
Yönetim sipariş detayı | {$adminHooks.admin_order_detail} |
admin_header |
Yönetim içerik üstü (tüm sayfalar) | {$adminHooks.admin_header} |
admin_footer |
Yönetim alt bilgisi (tüm sayfalar) | {$adminHooks.admin_footer} |
admin_dashboard_top |
Kontrol paneli — üst | {$adminHooks.admin_dashboard_top} |
admin_dashboard_kpi |
Kontrol paneli — KPI kartlarının altı | {$adminHooks.admin_dashboard_kpi} |
admin_dashboard_main_left |
Kontrol paneli — sol sütun | {$adminHooks.admin_dashboard_main_left} |
admin_dashboard_main_right |
Kontrol paneli — sağ sütun | {$adminHooks.admin_dashboard_main_right} |
admin_dashboard_bottom |
Kontrol paneli — sayfa altı | {$adminHooks.admin_dashboard_bottom} |
Module::refreshHook($smarty, $hookName, $context)
veya yönetim render ile tembel yüklenen):
product, product_tab, product_tab_content,
product_inf, order_payment, order_confirmation,
auth_social, admin_product_button, admin_order_detail,
admin_header, admin_footer ve tüm
admin_dashboard_* kancaları.
Modülünüzde Görüntüleme Kancalarını Bildirme
Modül sınıfınızda hangi görüntüleme kancalarının desteklendiğini ve kurulumda varsayılan olarak hangilerinin etkinleştirileceğini tanımlayın:
$displayHooks— kanca adı => açıklama (yönetimde gösterilir)$defaultDisplayHooks—install()sırasında otomatik atanan kancalarrenderDisplayHook($hook, $context)— ön yüz HTMLrenderAdminDisplayHook($hook, $context)—admin_*kancaları için yönetim HTML
Yönetim Üzerinden Kanca Atama
Kanca atamaları Module::setDisplayHooks($moduleName, $hookNames) ile kaydedilir.
Yalnızca hem $displayHooks hem de global görüntüleme kancası kataloğunda listelenen
kancalar kabul edilir.
<?php
// ── Event hooks in boot() ───────────────────────────────────────
public function boot(): void
{
Module::registerHook('order.placed', function (array $order): void {
Logger::info('Order placed: ' . ($order['id_order'] ?? ''));
});
Module::registerHook('order.updated', function (array $order, $oldStatus = null): void {
// status / cargo / content edits
});
Module::registerHook('product.updated', function (int $idProduct, $product = null, $isNew = false): void {
// sync external catalog, clear caches, etc.
});
Module::registerHook('cart.changed', function (array $cart): void {
// abandoned-cart tracking, analytics
});
Module::registerHook('form.captcha.validate', function (string $form, string &$error): void {
// set $error when CAPTCHA fails
});
Module::registerHook('smarty.assign', function ($smarty): void {
if ($smarty) {
$smarty->assign('myModuleEnabled', true);
}
});
Module::registerHook('head.assets', function (array &$assets): void {
$assets['css'][] = 'https://cdn.example.com/extra.css';
});
}
// ── Display hooks: declare + render ────────────────────────────
public array $displayHooks = [
'footer' => 'Footer block',
'product_detail' => 'Product detail section',
'auth_login' => 'Login CAPTCHA',
];
public array $defaultDisplayHooks = ['footer'];
public function renderDisplayHook(string $hook, array $context = []): ?string
{
return match ($hook) {
'footer' => $this->renderFrontTemplate('footer', [
'message' => Settings::get('MY_MODULE_TEXT'),
]),
'product_detail' => $this->renderFrontTemplate('product_detail', [
'id_product' => $context['id_product'] ?? 0,
]),
default => null,
};
}
{* assets/templates/front/footer.tpl *}
<div class="my-module-footer">
{if $message}
<p>{$message|escape}</p>
{/if}
</div>
<?php
// Call from product detail controller after $smarty is ready:
Module::refreshHook($smarty, 'product_detail', [
'id_product' => (int) $product['id_product'],
]);
// Smarty template:
// {$hooks.product_detail}
<?php
public array $displayHooks = [
'admin_order_detail' => 'Extra block on order detail',
'admin_dashboard_top' => 'Dashboard banner',
];
public function renderAdminDisplayHook(string $hook, array $context = []): ?string
{
return match ($hook) {
'admin_order_detail' => $this->renderAdminTemplate('order-detail', $context),
'admin_dashboard_top' => $this->renderAdminTemplate('dashboard-top', $context),
default => null,
};
}
<?php
// Minimum setup inside {name}.php:
public array $displayHooks = [
'footer' => 'Shown in store footer',
];
public array $defaultDisplayHooks = ['footer'];
public function renderDisplayHook(string $hook, array $context = []): ?string
{
if ($hook !== 'footer') {
return null;
}
return $this->renderFrontTemplate('footer', $context);
}