Giriş ve Kayıt
Altı view, tek bölünmüş layout, tek adım makinesi. Kimlik ekranı bir kez kurulur, sonra tarayıcıda yeniden dizilir.
Genel Bakış
Giriş sayfası yedi durumu barındıran tek bir belgedir. Hiçbir şey yeniden yüklenmez; her metin, her alan ve her onay sunucunun ürettiği işaretlemede bulunmalıdır.
Kayıt tam tersi bir sorundur. Alanların neredeyse hepsi isteğe bağlıdır, yani form sabit bir yerleşim değil koşullar kümesidir.
Yapı
Altısı da sign controller'ındaki tek bir özel yardımcıdan geçer. Aynı kapıyı, canonical bağlantıyı ve başlık konvansiyonunu paylaşırlar.
| View | Yalnız misafir | Notlar |
|---|---|---|
auth/login | Evet | Tek belgede yedi durum |
auth/register | Evet, bekleyen doğrulama yoksa | Ülkeler, özel alanlar, sözleşmeler, kapı haritası |
auth/forget-password | Evet | Adres olsun olmasın her zaman başarı bildirir |
auth/reset-password | Evet | Jeton önce çözülür: ya form, ya süresi dolmuş bildirimi |
auth/activate | Evet | E-posta onayının iniş sayfası |
auth/accept-invite | Hayır | Misafir ve üye; hangi durum geçerli, state söyler |
Adım Adım
Giriş Adım Makinesini Kurun
- Her durumu aynı belgeye yazın: biri görünür, gerisi gizli. Her biri bir adım özniteliği taşır:
login,password,totp,sms,email,code-login,restricted. - Makineyi giriş anahtarına kapılayın, diğer dalda bir bildirim gösterin.
- Parolasız harekete geçirici mesajı sosyal butonlardan önce, her biri kendi anahtarı ve ayracıyla koyun.
- Dört kod durumunda tek bir paylaşılan bileşen kullanın. Bileşen duruma değil input sınıfına bağlanır; ikincisi yapıştırma ve otomatik doğrulama almaz.
Kayıt Alanlarını Kapılayın
- Görünürlüğü yapılandırma anahtarından değil kapı haritasından okuyun.
- Zorunlu alanları yerleşik özniteliğin yanında bir data özniteliğiyle işaretleyin ki doğrulayıcı gizli olanı atlasın.
- Özel alanları ve sözleşmeleri verilen dizilerden yazın; sabit kümeleri yoktur.
- Yetkili sunucudur — tarayıcıdaki her denetim gönderimde tekrarlanır.
Formunuzun Asgari Olup Olmadığına Karar Verin
- Manifest işaretini yalnız kayıt view'ınız telefon, sabit hat ve kimlik numarasını hiç yazmıyorsa true yapın.
- Görünürlük anahtarlarının arkasında yazıyorsanız false bırakın; üç temanın ikisi bunu yapar.
- İşaret istekten değil manifestten okunur; bir gönderim onu iddia edemez.
Her Kimlik Bağlantısını Anahtarıyla Sarın
- Kaydol bağlantısını kayıt, giriş bağlantısını giriş anahtarıyla sarın; hesap menüsü ve sepet birleşik anahtarı kullanır.
- Gizlemeye güvenmeyin — sunucu kapalı kaydı ve girişi kendi reddeder.
Referans
Auth Çekirdek İmzaları
// Üye oluşturmanın tek giriş noktası. Girdi anahtarları aşağıda.
public static function register(array $input): array;
// Parolayla giriş. $type 'member' ya da 'admin'; üye ana anahtarı burada denetlenir.
public static function attemptLogin(string $type, string $email, string $password, bool $remember = false): array;
// Parolalı ya da parolasız, oturumun kurulduğu TEK yer. Her parolasız akış
// (kod girişi, sosyal, kayıt sonrası, e-posta doğrulaması) burada biter.
public static function completeLogin(string $type, int $userId, object $user, bool $remember = false, array $sso = []): string;
// Parolasız: tek kullanımlık kod üret, sonra onu oturumla takas et.
// issueLoginCode adres var olsun olmasın başarı bildirir.
public static function jetpassEnabled(): bool;
public static function issueLoginCode(string $email): array;
public static function jetpassLogin(string $email, string $code, bool $remember = false): array;
// Parola sıfırlama. issueReset de hesap sızdırmaz.
public static function issueReset(string $type, string $email): array;
public static function verifyResetToken(string $rawKey, string $type): object|false;
public static function resetPassword(string $type, int $userId, string $password): void;
// Verilen mod ve kitle için sunulacak sağlayıcılar.
public static function activeProviders(string $mode, string $context): array;
register() Neyi Kabul Eder
$input = [
// Kimlik
'first_name' => 'Ada',
'last_name' => 'Lovelace',
'email' => '[email protected]',
'password' => 'metin filtresiyle değil, geçirgen filtreyle okunur',
// Hesap türü ve açtığı kurumsal alanlar
'account_type' => 'individual', // ya da 'corporate'
'company_name' => '',
'tax_number' => '',
'tax_office' => '',
// Her biri kendi görünürlük anahtarının arkasındaki isteğe bağlı iletişim alanları
'phone' => '',
'landline_phone' => '',
'national_id' => '',
// Fatura adresi
'address1' => '',
'state' => '', // listeden seçildiyse id, değilse serbest metin
'city' => '', // state ile aynı kural
'postal_code' => '',
'country' => 0, // buraya gelmeden önce id'ye çözülür
// Onaylar
'marketing_email' => 0,
'marketing_sms' => 0,
'contract' => 1, // şartlar kutucuğu
'contracts_required' => true, // gerçekten yapılandırılmış bir sözleşme var mı
// Operatör tanımlı ek alanlar, operation toplar
'custom_fields' => [],
// İstekten değil TEMA MANİFESTİNDEN bildirilir. True; telefon, sabit hat ve
// kimlik numarasının zorunluluk denetimlerini atlar, başka hiçbir şeyi değil.
'minimal_fields' => false,
];
Alan Kapı Haritası
| Şablon değişkeni | Varsayılan | Neyi denetler |
|---|---|---|
$registration.account_type_visible | açık | Bireysel/kurumsal seçicisi |
$registration.company_name_required | açık | Kurumsal dalda şirket adı |
$registration.tax_number_required, tax_office_required | kapalı | Kurumsal vergi alanları |
$registration.phone_visible, phone_required | açık, açık | Cep telefonu |
$registration.landline_visible, landline_required | kapalı, kapalı | Sabit hat numarası |
$registration.national_id_visible, national_id_required | kapalı, kapalı | Bireysel dalda kimlik numarası |
$registration.password_min_length | 12 | İki tarafta da uygulanır |
Her View'a Ne Ulaşır
| View | Değişken | Taşıdığı |
|---|---|---|
auth/register | $countries | id, a2_iso, name. İl ve ilçeler AJAX ile kademelenir |
auth/register | $custom_fields | Operatörün ek alanları; sabit kümesi yok |
auth/register | $contracts | Kayıt için işaretlenmiş sözleşmeler; her satır bir link taşır |
auth/register | $contract_names | Başlıkların virgülle birleşmiş hâli; etiket adlarını yazsın diye |
auth/register | $registration | Yukarıdaki kapı haritası |
auth/register | $verify_email, $verify_name | $verify_pending true olduğunda dolar; adım üyeye adıyla hitap eder |
auth/reset-password | $reset_valid | Token çözüldü mü; false ise süresi dolmuş uyarısı |
auth/reset-password | $verify_key | Ham token; yeni parolayla geri gönderilir |
auth/login | $social_providers, $jetpass_enabled | Giriş sayfası kurar; kayıt sayfası kendi listesini kurar |
Sayfa ve Özellik Anahtarları
Örnek
{extends file='layouts/auth.tpl'}
{block name=stage_title}{lang key='auth_stage_login_title'}{/block}
{block name=stage_text}{lang key='auth_stage_login_text'}{/block}
{* Çapraz bağlantı kapılıdır: kapalı bir sistemde kaydol önermek çıkmazdır. *}
{block name=stage_foot}
{if $registration_enabled}
{lang key='auth_stage_login_foot'} <a href="{link route='sign-up'}">{lang key='auth_stage_login_foot_link'}</a>
{/if}
{/block}
{block name=content}
{if $login_enabled}
{* 1. durum: e-posta. Görünür; diğer her durum AYNI belgede gizli gelir. *}
<div data-auth-step="login">
<form data-auth-form="login">
{csrf form='sign-in'}
<input type="email" name="email" class="form-control" required>
{captcha area='sign-in' tray='login-captcha'}
<button type="submit" class="btn">{lang key='website/sign/continue'}</button>
</form>
{* Parolasız SOSYALDEN ÖNCE, her biri kendi anahtarı ve ayracıyla. *}
{if $jetpass_enabled}
<div class="auth-divider">{lang key='website/sign/or'}</div>
<button type="button" class="btn" data-auth-action="auth-code-login">{lang key='website/sign/jetpass-cta'}</button>
{/if}
{if $social_providers}
<div class="auth-divider">{lang key='website/sign/or'}</div>
{foreach $social_providers as $p}
<a class="btn" href="{$p.url}"><i class="bi {$p.icon}"></i>{$p.label}</a>
{/foreach}
{/if}
</div>
<div class="d-none" data-auth-step="password">{* ... *}</div>
{* Dört kod durumu TEK bileşeni yeniden kullanır: script duruma değil
.otp-input'a bağlanır, yani ikinci bir uygulama davranışın hiçbirini almaz. *}
<div class="d-none" data-auth-step="code-login">
<div class="otp-group" data-otp>
<input class="otp-input" inputmode="numeric" maxlength="1">
</div>
</div>
<div class="d-none" data-auth-step="restricted">{* ... *}</div>
{else}
<p>{lang key='website/sign/login-disabled'}</p>
{/if}
{/block}
// templates/website/{Tema}/theme.php
return [
'meta' => [
'name' => 'Acme',
'version' => '1.0.0',
'author' => 'Acme',
// Yalnız kayıt view'ı telefon, sabit hat ve kimlik numarasının HİÇBİRİNİ
// render etmiyorsa TRUE. Auth::register o zaman tam bu üç alan için
// operatörün zorunluluk denetimlerini atlar; diğer her doğrulama koşar.
//
// Onları $registration.*_visible arkasında render ediyorsanız FALSE;
// ürünle gelen üç temanın ikisi bunu yapar.
//
// Alanları basmaya devam ederken true koymak tek yanlış cevaptır:
// ziyaretçi boş bir input görmüş olsa da zorunluluk atlanır.
'signup_minimal' => false,
],
'engine' => 'smarty',
'status' => 'ready',
];
Tuzaklar
Parola sıfırlama ve parolasız kod, bilinmeyen bir adres için bilerek başarı bildirir. Script'iniz her durumda bir sonraki ekrana geçmelidir.
Her metin filtresi parolayı güçlü kılan karakterleri siler. Saklanan değer, hiçbir hata olmadan yazılandan farklı olur.
Manifestinizden okunur ve ona güvenilir, yani formunuzun gerçekte ne yazdığını anlatmalıdır. İsteğe bağlı alanları yazarken bildirmek boş bir gönderimi raporsuz geçirir.
Tek bir eylem adı aynı anda jeton form anahtarı, captcha alanı ve hız sınırı kovasıdır. Yeni bir ad uydurmak üç korumadan da çıkmaktır. Parolasız istek ile doğrulaması giriş eylemini bilerek paylaşır.
Kayıt sonrası oturum açma, anahtarın denetlendiği parola yolundan değil doğrudan oturum kuran metottan geçer.
İlgili Makaleler
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.